0dce2ef812
- 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>
49 lines
3.6 KiB
Markdown
49 lines
3.6 KiB
Markdown
# 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?
|