Khác biệt gốc rễ là kiến trúc: Cypress chạy test bên trong trình duyệt, cùng event loop với app; Playwright chạy test ở tiến trình Node riêng, điều khiển trình duyệt qua giao thức debug.
Hệ quả thực tế:
| Tiêu chí | Cypress | Playwright |
|---|---|---|
| Nhiều tab / nhiều origin | Hạn chế, cần workaround | Native (context.newPage(), đa domain) |
| Trình duyệt | Chromium, Firefox, WebKit (qua bản build riêng) | Chromium, Firefox, WebKit chính thức |
| Song song | Bản OSS không có orchestration sẵn, thường cần Cypress Cloud | --shard, fullyParallel sẵn trong CLI |
| Ngôn ngữ | JS/TS | JS/TS, Python, Java, .NET |
| Debug | Time-travel UI rất tốt cho dev | Trace viewer (DOM snapshot + network + video) |
| Cú pháp | Chuỗi lệnh cy. không phải Promise chuẩn | async/await thuần |
Khi nên đổi: cần test luồng đi qua nhiều domain (thanh toán, OAuth), cần chạy song song trên CI mà không mua dịch vụ, cần WebKit để bắt bug Safari, hoặc đội đã mệt vì cú pháp chaining không tương thích với async/await.
Khi nên ở lại: suite Cypress đã ổn định, đội quen công cụ, giá trị chuyển đổi không bù nổi chi phí viết lại. Di chuyển từng phần cũng khả thi — chạy song song hai runner một thời gian, viết test mới bằng Playwright, chỉ chuyển test cũ khi nó hỏng.
Điểm cần nói rõ khi trả lời: quyết định dựa trên ràng buộc của sản phẩm (đa domain? Safari? ngân sách CI?), không phải công cụ nào mới hơn.