Part 02 · Testing & Code Quality · 2.1.09

Build lifecycle và quality gates

Quality gate tốt ghép nhiều tín hiệu độc lập, giữ build reproducible và bảo vệ risk cụ thể; nó không biến một metric thành mục tiêu để game.


1. Maven lifecycle

Luồng phổ biến là validate → compile → test → package → integration-test → verify → install → deploy. Surefire thường chạy unit test ở phase test; Failsafe chạy integration test và xác nhận ở verify để post-integration cleanup vẫn có cơ hội chạy.

Pin plugin version và gọi cùng lifecycle ở local/CI. Một build reproducible cần dependency/plugin version rõ, input/output được khai báo và không phụ thuộc state ngoài workspace.

2. Gradle task graph

Java plugin cung cấp task test; dự án có thể tạo source set/task integrationTest với dependency ordering rõ. Up-to-date check, build cache và parallel forks chỉ đáng tin khi input/output được khai báo và test không rò global state.

Build signal: nếu local pass nhưng CI khác kết quả, kiểm tra task graph, plugin/dependency version, environment input, cache key và test isolation trước khi chỉ tăng retry.

3. Coverage và mutation testing

JaCoCo đo instruction/branch đã thực thi, không đo assertion có đủ mạnh hay không. Dùng coverage để tìm vùng mù theo risk, không dùng một threshold đơn lẻ làm bằng chứng chất lượng.

PIT thay đổi bytecode; mutant sống gợi ý assertion thiếu, code không quan sát được hoặc equivalent mutant. Mutation testing phù hợp hơn với domain logic quan trọng so với generated/glue code.

4. Static và supply-chain checks

GateCâu hỏi nó trả lờiCaveat
Compiler/warningsCode có compile và vi phạm type/safety signal không?Không chứng minh runtime behavior.
Formatting/static analysisCode có pattern lỗi, bug smell hoặc style drift không?Rule noise cần owner và suppression có lý do.
Dependency vulnerability/licenseSupply chain có risk đã biết hoặc license không phù hợp không?Lock cũ vẫn có thể chứa vulnerability mới.
Secret scanCredential có bị commit hoặc log ra không?Cần rotate ngay khi phát hiện, không chỉ fail build.

Dùng BOM/platform alignment và dependency locking để tăng reproducibility. Review dependency mới theo maintenance, license, vulnerability, footprint và necessity.

5. Thiết kế gate theo feedback flow

  1. Fail nhanh ở compile, unit và static checks.
  2. Chạy integration theo nhóm cô lập, có thể song song.
  3. Lưu XML/HTML report, logs và container output khi fail.
  4. Baseline legacy rồi ratchet chất lượng của code mới.
  5. Đo duration và false-positive cost của từng gate.
Production caveat: threshold 100% thường tạo test vô nghĩa hoặc suppression hàng loạt. Gate phải bảo vệ risk cụ thể, có policy exception minh bạch và có owner theo dõi debt.

6. Checklist tự đánh giá

Nguồn tham khảo