Flaky-test operations, Git và code review
Test suite là một production system nội bộ: cần telemetry, ownership, SLO và quy trình xử lý failure thay vì chỉ retry để dashboard xanh.
1. Flaky taxonomy và evidence
| Nhóm | Dấu hiệu | Evidence cần thu |
|---|---|---|
| Time/random | Phụ thuộc timezone, clock, random seed hoặc iteration. | Timezone, clock, seed, input và iteration. |
| Order/shared state | Pass riêng lẻ nhưng fail trong suite hoặc parallel. | Thứ tự test, global config, data key và cleanup. |
| Concurrency | Race, deadlock hoặc timing-sensitive failure. | Thread dump, timing, executor state và interleaving. |
| Infrastructure | Container, port, CPU/memory hoặc network không ổn định. | Container log, inspect output, resource và network metrics. |
| Timeout | Duration biến động hoặc queue bị saturation. | Duration history, percentile và saturation metrics. |
2. Incident flow
- Giữ artifact, seed, test order, commit và environment.
- Phân loại product defect, test defect hay infrastructure defect.
- Tái hiện bằng lặp có kiểm soát hoặc stress với input/seed được ghi lại.
- Sửa root cause và thêm regression evidence.
- Theo dõi recurrence sau merge, không đóng incident ngay khi một lần retry pass.
Rerun có thể thu evidence nhưng không biến lần chạy xanh thành kết luận. Quarantine phải có owner, ticket, deadline và vẫn hiển thị tín hiệu; nếu không, quarantine sẽ thành nghĩa địa test.
3. Suite observability và scale
Đo duration percentile, failure history, retry count, queue time, slowest tests và resource use. Sharding theo historical duration thường tốt hơn chia đều số file vì test cost không đồng nhất.
Chỉ bật parallel sau khi cô lập port, schema, tenant, filesystem và global runtime state. Parallel hóa một suite đang shared-state chỉ làm flaky nhanh hơn và khó tái hiện hơn.
4. Git và review flow
Merge giữ topology của lịch sử; rebase replay commit và đổi identity, vì vậy không rewrite shared public history tùy tiện. PR nhỏ giảm review latency và test blast radius.
Reviewer nên ưu tiên correctness, security, data loss, compatibility, concurrency, failure handling, observability và test evidence trước style. Mô tả PR cần nói rõ why, trade-off, test đã chạy và cách verify failure path.
5. Operational anti-patterns
- Tăng timeout mỗi khi CI chậm: che saturation hoặc deadlock.
- Retry vô hạn: giữ dashboard xanh nhưng làm mất tín hiệu defect.
- Tắt test không owner/deadline: biến debt thành permanent blind spot.
- Review chỉ nhìn coverage delta: bỏ qua assertion, failure path và production risk.
- Parallelize trước khi sửa shared state: nhân flaky rate thay vì tăng throughput.
6. Checklist tự đánh giá
- Tôi thu được seed, order, environment và artifact khi flaky test fail.
- Tôi phân loại được product/test/infrastructure defect.
- Tôi biết khi nào quarantine là tạm thời và có deadline.
- Tôi đo duration/failure/retry để vận hành suite.
- Tôi review correctness và operational risk trước style.
- Tôi không dùng retry hoặc timeout để che root cause.