Part 02 · Testing & Code Quality · 2.4
Sai lầm thường gặp & checklist
Test suite tệ có thể tạo cảm giác an toàn giả, làm chậm delivery và che rủi ro production. Dùng checklist này để kiểm tra cả kiến thức, evidence và quy trình vận hành.
1. Hiểu sai thường gặp
“Unit test nghĩa là không dùng database.”Định nghĩa theo boundary; không dùng DB thường là hệ quả, không phải bản chất duy nhất.
“Mock càng nhiều càng unit.”Mock implementation detail làm test giòn và có thể bỏ qua integration risk quan trọng.
“@SpringBootTest giống production nhất nên tốt nhất.”Full context rộng nhưng chậm, khó định vị và vẫn có thể mock hoặc rollback khác production.
“Coverage cao nghĩa là ít bug.”Coverage không đo assertion, scenario hoặc business risk.
“Flaky test chỉ cần retry.”Retry che tín hiệu; flaky test làm đội ngũ mất niềm tin vào CI.
“Scanner xanh nghĩa là secure.”Security cần threat model, authorization/abuse tests, reachability triage và trust-boundary controls.
2. Lỗi triển khai thường gặp
- Test chỉ happy path, không kiểm tra boundary, timeout, duplicate và partial failure.
- Dùng
any()cho dữ liệu quan trọng rồi verify call tồn tại. - Test phụ thuộc clock thật, random không seed, thứ tự hoặc shared database record.
- Dùng H2 để chứng minh PostgreSQL locking hoặc query semantics.
- Transactional test đọc dữ liệu cùng persistence context rồi tưởng đã chứng minh commit.
- Container ready theo “process started” thay vì service readiness.
- Sleep trong concurrency hoặc retry test làm suite chậm và flaky.
- Đặt threshold coverage/performance đồng loạt rồi viết test vô nghĩa để đạt số.
- Dùng production data chưa mask hoặc cấp secrets cho untrusted PR runner.
- Rebase shared history hoặc review chỉ tập trung style.
3. Checklist kiến thức
- Tôi phân biệt unit, integration, component, contract và E2E bằng boundary.
- Tôi hiểu JUnit Platform, Jupiter, discovery, lifecycle và extension.
- Tôi viết assertion kiểm tra outcome và failure có ý nghĩa.
- Tôi phân biệt stub, mock, fake, spy và tránh over-mocking.
- Tôi chọn đúng Spring test slice.
- Tôi dùng Testcontainers với lifecycle, readiness và data reset đúng.
- Tôi test transaction/locking bằng DB thật và transaction độc lập.
- Tôi test concurrency bằng coordination primitive cùng timeout.
- Tôi test duplicate, retry, DLQ và idempotency.
- Tôi hiểu coverage, mutation testing và static analysis giới hạn ở đâu.
- Tôi thiết kế workload/load-spike-soak test với percentile và saturation.
- Tôi kiểm thử authorization, data isolation và test-data privacy.
- Tôi triage SCA/SAST/secret/container findings theo risk và reachability.
- Tôi hiểu Maven lifecycle hoặc Gradle task graph cho test.
- Tôi bảo vệ CI runner, cache và artifact theo trust boundary.
- Tôi có quy trình tìm nguyên nhân và quarantine flaky test có expiry.
4. Definition of Done
- Trả lời được ít nhất 24/30 câu không mở đáp án.
- Hoàn thành ít nhất 6/8 lab.
- Có integration test dùng PostgreSQL/broker container và failure semantics.
- Có test tái hiện concurrency hoặc duplicate delivery.
- Có performance regression/saturation evidence.
- Có security/supply-chain policy với owner, expiry và trust boundary.
- Pipeline lưu report và failure evidence.
Gợi ý đối chiếu