Flaky tests là tests đôi khi pass, đôi khi fail với cùng code — cực kỳ độc hại cho CI/CD vì giảm trust vào test suite và làm team bỏ qua failing tests.
Nguyên nhân phổ biến:
- Timing/async issues — test không chờ đúng async operation, dùng arbitrary
setTimeoutthay vìwaitFor/explicit await; - Test order dependency — test A phụ thuộc vào side effects của test B;
- Shared mutable state — global state không reset giữa tests;
- External dependencies — gọi real APIs, database không isolated;
- Date/time — dùng
new Date()thay vì mock; - Random data — không seed random generator
Cách xử lý: waitFor(() => expect(element).toBeInTheDocument()) trong Testing Library thay vì setTimeout; beforeEach reset state; mock Date.now() với jest.useFakeTimers(); server.resetHandlers() giữa tests.
Phát hiện: chạy test file nhiều lần jest --testPathPattern=flaky.test.ts --runInBand --repeat 50; Playwright có --repeat-each.
CI retry logic (GitHub Actions retry): cảnh báo nếu test cần retry > 1 lần — không xem là solution, chỉ là detection mechanism.