1. Tóm tắt nhanh & vì sao dữ liệu test quan trọng
Chào bạn mới! Khi bắt đầu viết test automation, phần lớn người mới tập trung vào việc thao tác giao diện: bấm nút, điền form, kiểm tra kết quả hiện ra. Nhưng có một câu hỏi âm thầm quyết định test của bạn có đáng tin hay không: dữ liệu bạn đang test LÀ dữ liệu gì, TỪ ĐÂU mà có, và LIỆU nó có còn nguyên vẹn ở lần chạy tiếp theo? Nếu test 'mượn' một tài khoản có sẵn, một đơn hàng ai đó tạo trước, kết quả hôm nay đúng không có nghĩa ngày mai vẫn đúng — vì dữ liệu đó có thể đã bị người khác đổi, xoá, hoặc dùng chung với 1 test khác đang chạy song song. Chuẩn bị dữ liệu test đúng cách chính là nền móng giúp automation đáng tin cậy lâu dài, và đó là điều bài này sẽ giúp bạn làm chủ qua ví dụ thật với ShopEasy.
2. Vấn đề: test dùng chung dữ liệu, kết quả không đáng tin
Hãy hình dung đội automation ShopEasy viết 20 test, và cả 20 test đều đăng nhập bằng đúng 1 tài khoản 'demo@shopeasy.vn' có sẵn trên môi trường staging. Ban đầu mọi thứ chạy ổn — cho tới khi 2 test cùng cập nhật giỏ hàng của tài khoản này cùng lúc: một test đang kiểm tra 'giỏ hàng trống sau khi xoá hết', test kia lại vừa thêm 2 sản phẩm vào giỏ để test 'tính tổng tiền'. Cả hai chạy song song, và tuỳ vào việc ai 'thắng' trước, một trong hai test sẽ fail dù code tính năng hoàn toàn đúng.
Vấn đề không dừng ở đó. Khi 1 test khác vô tình xoá tài khoản 'demo@shopeasy.vn' để kiểm tra tính năng 'xoá tài khoản', mọi test còn lại dùng chung tài khoản này sẽ đồng loạt fail — không phải vì tính năng của chúng có lỗi, mà vì dữ liệu chúng cần đã biến mất. Đây là dấu hiệu rõ ràng nhất của một bộ test 'giòn': kết quả phụ thuộc vào thứ tự chạy, vào việc test nào chạy trước, và vào việc có ai đó đang đụng vào cùng dữ liệu hay không — những thứ mà bản thân tính năng cần kiểm thử không hề liên quan.
3. Fixture là gì & vì sao gắn liền với dữ liệu test
Fixture là cách Playwright (và nhiều framework automation khác) chuẩn hoá việc chuẩn bị và dọn dẹp mọi thứ một test cần — trong đó dữ liệu test là ví dụ phổ biến nhất. Một fixture gồm 2 giai đoạn: phần đứng TRƯỚC use() là setup (tạo tài khoản, tạo đơn hàng...), phần đứng SAU use() là teardown (xoá dữ liệu vừa tạo). Test chỉ cần khai báo tên fixture mình cần trong tham số hàm test, Playwright tự lo phần còn lại — kể cả khi test đó fail giữa chừng, teardown vẫn được đảm bảo chạy.
Điểm mấu chốt của fixture không nằm ở cú pháp, mà ở TƯ DUY: thay vì mỗi test tự tay tạo dữ liệu theo cách riêng (và dễ quên dọn), bạn định nghĩa MỘT nơi duy nhất biết cách tạo đúng loại dữ liệu đó, và mọi test chỉ cần 'mượn' fixture này. Nhờ vậy, nếu sau này cách tạo tài khoản test thay đổi (ví dụ thêm trường bắt buộc), bạn chỉ cần sửa đúng 1 fixture, thay vì rà từng test.
4. Setup → Test → Teardown: vòng đời của 1 fixture
Mỗi lần một test khai báo dùng fixture testAccount, vòng đời diễn ra theo đúng 3 bước: (1) Setup — Playwright chạy đoạn code trước use(), gọi API tạo tài khoản mới; (2) Test — hàm use(account) trả tài khoản đó vào test, và toàn bộ thân test chạy với dữ liệu này; (3) Teardown — ngay sau khi test kết thúc (bất kể pass hay fail), đoạn code sau use() chạy tiếp để gọi API xoá tài khoản vừa tạo. Ba bước này lặp lại độc lập cho MỖI test, nên 2 test chạy song song sẽ có 2 tài khoản hoàn toàn khác nhau.
Điều làm nên sự khác biệt so với việc tự viết setup/dọn dẹp thủ công trong từng test là TÍNH ĐẢM BẢO: teardown của fixture chạy ngay cả khi test throw lỗi giữa chừng, vì Playwright quản lý phần này ở khung chạy test, không phụ thuộc vào việc bạn có nhớ gọi hàm dọn dẹp ở cuối file hay không. Đây chính là lý do fixture là công cụ đúng đắn để chuẩn bị dữ liệu test, thay vì viết tay từng bước setup/cleanup rải rác trong mỗi file.
5. Tạo dữ liệu qua API/DB thay vì qua giao diện
Có một câu hỏi người mới hay bỏ qua: khi cần 1 tài khoản để test giỏ hàng, nên tạo tài khoản đó bằng cách nào — điền form đăng ký trên giao diện, hay gọi thẳng API tạo tài khoản? Câu trả lời gần như luôn là API/DB, TRỪ KHI chính bài test đó đang kiểm thử tính năng đăng ký. Lý do rất thực tế: mỗi bước UI (mở trang, điền ô, chờ phản hồi, chờ redirect) tốn thời gian và có thể fail vì lý do không liên quan gì tới dữ liệu — ví dụ 1 ô input đổi id, 1 bước xác thực OTP mới được thêm vào.
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!