🎲 Flaky Test là gì?
Test lúc pass lúc fail dù code không đổi gì.
1
Hiểu nó là gì
Flaky Test cho kết quả không ổn định, thường do chờ thiếu thời gian, dùng chung dữ liệu hay phụ thuộc thứ tự chạy, khiến cả đội mất niềm tin vào bộ test.
Nói theo đời thường:
Như công tắc tiếp xúc kém: bật mười lần sáng bảy lần, riết rồi không ai biết đèn hỏng hay công tắc hỏng.
Như công tắc tiếp xúc kém: bật mười lần sáng bảy lần, riết rồi không ai biết đèn hỏng hay công tắc hỏng.
⚠ Chỗ ẩn dụ này hỏng
Công tắc tiếp xúc kém thì thay là xong. Flaky test thì nguyên nhân thường không nằm ở test.
Nó nằm ở thời gian, ở dữ liệu dùng chung, ở việc hai ca chạy song song giẫm chân nhau, hoặc chính sản phẩm có lỗi đua tranh mà chỉ lộ ra khi máy chậm. Phản xạ sai phổ biến nhất là thêm sleep(5) cho qua chuyện — điều đó giấu lỗi đi chứ không sửa, và có khi bạn vừa che mất một bug thật.
2
Code trông thế nào
// Chữa triệu chứng — đừng làm thế này await page.waitForTimeout(5000) // Chữa nguyên nhân — chờ đúng điều kiện cần await expect(page.getByTestId('so-luong-gio')).toHaveText('1')
Mọi sleep cứng trong bộ test đều là một tờ giấy nợ.
3
Khi nào bạn dùng nó
✓ Dùng khi
- — Không ai muốn có nó. Việc của bạn là tìm ra và diệt.
✗ Đừng dùng khi
- Cho retry tự động rồi coi như xong: test vẫn dối, chỉ là dối kín hơn
Chưa cần biết: phát hiện flaky tự động, cách ly ca test, thống kê tỉ lệ đỏ theo thời gian.
Để dành tới Mốc 3 — Tự sửa được khi nó hỏng: Test đỏ trên CI mà xanh ở máy bạn, và bạn biết bắt đầu tìm từ đâu.
Dấu hiệu bạn đã cần học nó: Bạn đã ở đúng mốc rồi. Bắt đầu bằng việc ghi lại ca nào đỏ, bao lâu một lần.
4
Đi đâu tiếp
- WaitNguyên nhân số một, và cũng là cách chữa số một.
- Test DataNguyên nhân số hai: hai ca test dùng chung một tài khoản.
- CI/CDNơi flaky test lộ ra rõ nhất vì máy CI thường chậm hơn máy bạn.