Files
agent-unit-testing/rules/verification-checklist.md
T
Pham-Tan-Thien 0dce2ef812 feat: enforce exhaustive unit testing and 100% SonarQube branch coverage
- Enforce mandatory handle() and failed() method testing for all Jobs and Commands
- Ban shallow reflection-only helper testing in Jobs
- Mandate actual SQLite in-memory query execution for Repositories (ban Builder::class assertions alone)
- Enforce full branch coverage for SonarQube (ternary, null-coalescing, catch blocks, match)
- Update JobTest templates for PHPUnit and Pest to include handle() and failed() methods
- Update verification checklist and master system prompt with strict branch gatekeepers

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-08 15:01:01 +07:00

3.6 KiB

Checklist Tự Thẩm Định Chất Lượng Unit Test (Verification Checklist)

Trước khi xuất bất kỳ file test nào cho người dùng, Agent BẮT BUỘC phải tự đối chiếu mã nguồn của mình qua 10 câu hỏi kiểm định nghiêm ngặt dưới đây:


[ ] 1. Tính Đơn Vị (Is it really a Unit Test?)

  • Test có đang vô tình gọi Database thật hoặc gọi router HTTP không?
  • Các dependency nặng (API, Queue, Mail, Storage, Repository) đã được Mock hoặc Fake 100% chưa?

[ ] 2. Cấu Trúc AAA Rõ Ràng (Is AAA clearly structured?)

  • Các khối // Arrange, // Act, // Assert có được phân định rõ ràng bằng comment không?
  • Khối // Act có đúng là chỉ thực hiện 1 hành động duy nhất không?

[ ] 3. Mock Expectations Đầy Đủ (Are mock calls strictly verified?)

  • Mọi mock method có được khai báo số lần gọi cụ thể (->once(), ->never(), ->times(N)) thay vì bỏ trống không?
  • Các tham số truyền vào hàm mock có được kiểm tra qua ->with(...) hoặc ->withArgs(...) không?

[ ] 4. Không Over-Mock DTO/Value Object (Are value objects kept real?)

  • Các đối tượng DTO, Value Object, Collection có được tạo bằng instance thật thay vì mock không?

[ ] 5. Độ Phủ Ngoại Lệ, Kịch Bản Biên & SonarQube Branches (Are edge cases & branches covered?)

  • Đã có test case cho trường hợp ném ngoại lệ (Exception) chưa?
  • Đã kiểm tra các trường hợp biên: null, mảng rỗng [], số 0, số âm chưa?
  • Mọi toán tử ?? và ?: đã có test case cho cả 2 vế chưa?
  • Mọi khối try/catch đã có test case ép mock ném Exception để chạy qua khối catch chưa?

[ ] 6. Không Bỏ Sót Phương Thức Cốt Lõi (Are all core methods tested?)

  • Nếu là Job hoặc Console Command: Đã test phương thức handle() chưa? Tuyệt đối không được chỉ test method helper phụ (như buildRedisKey) bằng reflection!
  • Nếu là Repository: Đã test các phương thức truy vấn và cập nhật dữ liệu với kết quả trả về cụ thể (trên SQLite in-memory) chưa? Tuyệt đối không chỉ assert Builder::class!
  • Tất cả các public methods của class đã có ít nhất một bài test tương ứng chưa?

[ ] 7. Assertions Chặt Chẽ & Có Nghĩa (Are assertions meaningful?)

  • Có sử dụng Strict Assertion (assertSame, toBe) thay vì loose assertion không?
  • Có bị dính assertion rỗng kiểu $this->assertTrue(true) không?

[ ] 8. Đặt Tên Chuẩn & Dễ Đọc (Are method names expressive?)

  • Tên test method có thể hiện rõ "Hành động + Kết quả + Ngữ cảnh" không? (Ví dụ: it_throws_exception_when_balance_is_insufficient)

[ ] 9. Cú Pháp Đúng Phiên Bản Framework (Is syntax version-accurate?)

  • Nếu là PHPUnit 10+: Đã dùng Attribute #[Test] và #[DataProvider] thay cho DocBlock cũ chưa?
  • Nếu là Pest: Đã dùng đúng cú pháp describe(), it(), expect() chưa?

[ ] 10. Import Đầy Đủ & Namespace Chính Xác (Are imports complete?)

  • Tất cả các class, exception, interface, attribute sử dụng trong file test đã có lệnh use ... ở đầu file chưa? (Tránh lỗi Class not found).

[ ] 11. Không Gây Rò Rỉ Trạng Thái (Zero State Leakage)

  • Nếu có dùng Carbon::setTestNow() hay mock Facade tĩnh, đã đảm bảo dọn dẹp hoặc reset về trạng thái ban đầu chưa?