feat: decouple Laravel and CakePHP installers, remove SonarQube artifacts, and enforce complete unit testing standards
- Decouple framework installation: add install-laravel.sh and install-cakephp.sh, isolate skills and docs per framework, and auto-clean leftover artifacts - Remove all SonarQube configs, templates, and references - Enforce comprehensive test completeness: 100% public methods, edge cases, full branch coverage, exception paths, and state assertions - Replace all placeholder assertions in PHPUnit and Pest templates with full realistic implementations - Rename and update 10-comprehensive-test-coverage-guide.md
This commit is contained in:
@@ -40,9 +40,11 @@ Agent sẽ quét file test qua 5 tiêu chí chuẩn:
|
||||
- Dùng assertion đặc thù của CakePHP: `$this->assertResponseOk()`, `$this->assertResponseCode(200)`, `$this->assertRedirect()`, `$this->assertFlashMessage()` thay vì assert thủ công yếu ớt?
|
||||
- Dùng strict assertions: `$this->assertSame()` thay vì `$this->assertEquals()`.
|
||||
|
||||
### 5. Độ Phủ Kịch Bản & Nhánh Biên (Scenario & Branch Coverage - 15đ)
|
||||
- Đã kiểm tra cả Happy Path lẫn Unhappy Path (validation lỗi, entity không tìm thấy 404, không có quyền 403)?
|
||||
- Các giá trị biên (`null`, mảng rỗng, chuỗi trắng) đã được kiểm thử đầy đủ chưa?
|
||||
### 5. Tính Đầy Đủ & Độ Phủ Kịch Bản (Completeness & Scenario Coverage - 15đ)
|
||||
- **100% Public Methods**: Tất cả các hàm public của class nguồn đã có bài test tương ứng chưa? Có method nào bị bỏ sót không?
|
||||
- **Đầy đủ kịch bản**: Đã kiểm tra cả Happy Path lẫn Unhappy Path (validation lỗi, entity không tìm thấy 404, không có quyền 403, exception trong try/catch)?
|
||||
- **Kịch bản biên & Nhánh rẽ**: Các giá trị biên (`null`, mảng rỗng, chuỗi trắng) và mọi nhánh `if/else`, `??`, `?:` đã được kiểm thử đầy đủ chưa?
|
||||
- **Side Effects**: Dữ liệu DB thật sự thay đổi qua Fixture, Mailer/Command output có được verify đầy đủ không?
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ Skill này là công cụ chính để tự động tạo ra file Test cho bất
|
||||
## Cách kích hoạt
|
||||
|
||||
### 🏆 QUY TRÌNH CHUẨN PRO CHO DỰ ÁN LỚN (KHUYÊN DÙNG NHẤT):
|
||||
Để tránh bị tràn context token và đảm bảo viết sâu 100% từng nhánh SonarQube, hãy tách biệt 2 pha: **PHA VIẾT (Generation)** và **PHA CHẠY (Execution)**:
|
||||
Để tránh bị tràn context token và đảm bảo viết sâu, đầy đủ 100% từng logic và nhánh rẽ, hãy tách biệt 2 pha: **PHA VIẾT (Generation)** và **PHA CHẠY (Execution)**:
|
||||
|
||||
1. **Bước 1: Quét bản đồ dự án (`--untested`)**:
|
||||
```text
|
||||
@@ -105,17 +105,17 @@ Skill này là công cụ chính để tự động tạo ra file Test cho bất
|
||||
$this->enableSecurityToken();
|
||||
```
|
||||
|
||||
### Bước 4: Lập Ma Trận Test Scenarios (Đảm Bảo Coverage > 90% Trên SonarQube)
|
||||
Mục tiêu cốt lõi: SonarQube tính cả Line Coverage và Branch Coverage. Để đạt **Coverage > 90%**, Agent phải tuân thủ nghiêm ngặt ma trận sau:
|
||||
### Bước 4: Lập Ma Trận Test Scenarios (Đảm Bảo Viết Test Đầy Đủ & Toàn Diện 100%)
|
||||
Mục tiêu cốt lõi: Viết bộ test hoàn chỉnh nhất, bao phủ cả Line Coverage và Branch Coverage mà không bỏ sót bất kỳ phương thức hay kịch bản nào. Agent phải tuân thủ nghiêm ngặt ma trận sau:
|
||||
|
||||
1. **100% Public Methods**: Mọi phương thức public của class đều phải có test.
|
||||
2. **Quét 100% Nhánh Rẽ (Branch / Condition Coverage)**:
|
||||
1. **100% Public Methods**: Mọi phương thức public của class đều phải có test cases đầy đủ.
|
||||
2. **Quét 100% Nhánh Rẽ (Branch & Condition Coverage)**:
|
||||
- **Toán tử `??` (Null Coalescing)**: Bắt buộc 2 test case (có giá trị & null/empty).
|
||||
- **Toán tử `?:` (Ternary)**: Bắt buộc 2 test case (true & false).
|
||||
- **Toán tử logic `&&` và `||`**: Phải test các kịch bản kết hợp để thỏa mãn điều kiện rẽ nhánh SonarQube.
|
||||
- **Toán tử logic `&&` và `||`**: Phải test toàn bộ các kịch bản kết hợp để thỏa mãn mọi điều kiện rẽ nhánh.
|
||||
- **Khối `try - catch`**: BẮT BUỘC có test case ép mock/dữ liệu ném Exception để chạy qua khối `catch`.
|
||||
- **Mọi `if`, `else if`, `else`, `switch`, `match`** (kể cả nhánh default).
|
||||
3. **Chiến Lược Riêng Cho Từng Thành Phần CakePHP Để Đạt > 90%**:
|
||||
3. **Chiến Lược Riêng Cho Từng Thành Phần CakePHP Để Bao Phủ Đầy Đủ**:
|
||||
- **ORM Table (`validationDefault`)**: Bắt buộc test dữ liệu hợp lệ VÀ các trường hợp vi phạm cho **từng rule**:
|
||||
- Thiếu trường (`requirePresence`)
|
||||
- Chuỗi rỗng (`notEmptyString`)
|
||||
|
||||
@@ -34,9 +34,12 @@ Agent sẽ quét file test qua 5 tiêu chí:
|
||||
- Assertions có chặt chẽ (`assertSame`, `toBe`) hay dùng loose assertion?
|
||||
- Có assertion rỗng / vô nghĩa (`assertTrue(true)`) không?
|
||||
|
||||
### 4. Độ Phủ Kịch Bản (Scenario Coverage - 20đ)
|
||||
- Ngoài Happy Path, đã có test case cho Exception chưa?
|
||||
- Đã test các giá trị biên: `null`, mảng rỗng `[]`, số `0`, số âm chưa?
|
||||
### 4. Tính Đầy Đủ & Độ Phủ Kịch Bản (Completeness & Scenario Coverage - 20đ)
|
||||
- **100% Public Methods**: Tất cả các hàm public của class nguồn đã có bài test tương ứng chưa? Có method hay helper nào bị bỏ sót không?
|
||||
- **Đầy đủ kịch bản**: Ngoài Happy Path, đã có test case cho Exception (ép mock ném lỗi) chưa?
|
||||
- **Kịch bản biên**: Đã test các giá trị biên: `null`, mảng rỗng `[]`, số `0`, số âm, chuỗi trắng chưa?
|
||||
- **Nhánh rẽ điều kiện**: Các toán tử `??`, `?:`, các lệnh `if/else`, khối `try/catch` đã được kích hoạt đủ các nhánh chưa?
|
||||
- **Side Effects**: Dữ liệu DB thật sự thay đổi (`assertDatabaseHas`), Event/Job/Mail có được verify không?
|
||||
|
||||
### 5. Khả Năng Bảo Trì (Maintainability & Cleanliness - 15đ)
|
||||
- Tên test method có mô tả rõ ràng hành vi và ngữ cảnh không?
|
||||
|
||||
@@ -11,7 +11,7 @@ Skill này là công cụ chính để tự động tạo ra file Unit Test cho
|
||||
Người dùng có thể kích hoạt linh hoạt theo các chế độ (từ quy trình chuẩn Pro 3 bước cho dự án lớn đến file đơn lẻ):
|
||||
|
||||
### 🏆 QUY TRÌNH CHUẨN PRO CHO DỰ ÁN LỚN (KHUYÊN DÙNG NHẤT):
|
||||
Để tránh bị tràn context token và đảm bảo viết sâu 100% từng nhánh SonarQube, hãy tách biệt 2 pha: **PHA VIẾT (Generation)** và **PHA CHẠY (Execution)**:
|
||||
Để tránh bị tràn context token và đảm bảo viết sâu, đầy đủ 100% từng logic và nhánh rẽ, hãy tách biệt 2 pha: **PHA VIẾT (Generation)** và **PHA CHẠY (Execution)**:
|
||||
|
||||
1. **Bước 1: Quét bản đồ dự án (`--untested`)**:
|
||||
```text
|
||||
@@ -83,17 +83,17 @@ Người dùng có thể kích hoạt linh hoạt theo các chế độ (từ qu
|
||||
- **Dùng Laravel Fakes**: `Http::fake()`, `Queue::fake()`, `Event::fake()`, `Storage::fake()`.
|
||||
- **Dùng Object thật (Không Mock)**: DTOs, Value Objects, Collections, Request payload dạng mảng.
|
||||
|
||||
### Bước 4: Lập Ma Trận Test Scenarios (Đảm Bảo Coverage > 90% Trên SonarQube)
|
||||
Mục tiêu cốt lõi: SonarQube tính cả Line Coverage và Branch Coverage. Để đạt **Coverage > 90%**, Agent phải tuân thủ nghiêm ngặt ma trận sau:
|
||||
### Bước 4: Lập Ma Trận Test Scenarios (Đảm Bảo Viết Test Đầy Đủ & Toàn Diện 100%)
|
||||
Mục tiêu cốt lõi: Viết bộ test hoàn chỉnh nhất, bao phủ cả Line Coverage và Branch Coverage mà không bỏ sót bất kỳ phương thức hay kịch bản nào. Agent phải tuân thủ nghiêm ngặt ma trận sau:
|
||||
|
||||
1. **100% Public Methods**: Mọi phương thức public của class đều phải có bài test.
|
||||
2. **Quét 100% Nhánh Rẽ (Branch / Condition Coverage)**:
|
||||
1. **100% Public Methods**: Mọi phương thức public của class đều phải có bài test tương ứng.
|
||||
2. **Quét 100% Nhánh Rẽ (Branch & Condition Coverage)**:
|
||||
- **Toán tử `??` (Null Coalescing)**: Bắt buộc 2 test case (có giá trị & null/fallback).
|
||||
- **Toán tử `?:` (Ternary)**: Bắt buộc 2 test case (true & false).
|
||||
- **Biểu thức logic `&&` và `||`**: Phải test các kịch bản kết hợp để thỏa mãn điều kiện rẽ nhánh SonarQube.
|
||||
- **Biểu thức logic `&&` và `||`**: Phải test toàn bộ các kịch bản kết hợp để thỏa mãn mọi điều kiện rẽ nhánh.
|
||||
- **Khối `try - catch - finally`**: BẮT BUỘC có test case ép mock ném Exception để chạy qua khối `catch`.
|
||||
- **Mọi `if`, `else if`, `else`, `switch`, `match`** (kể cả nhánh `default`).
|
||||
3. **Chiến Lược Riêng Cho Từng Tầng Laravel Để Đạt > 90%**:
|
||||
3. **Chiến Lược Riêng Cho Từng Tầng Laravel Để Bao Phủ Đầy Đủ**:
|
||||
- **FormRequest (`app/Http/Requests/`)**:
|
||||
- Test `authorize()` trả về cả `true` (cho phép) và `false` (từ chối).
|
||||
- Test `rules()`: Bắt buộc test dữ liệu hợp lệ VÀ test vi phạm cho **từng rule** (`required`, `email`, `max`, `numeric`, `unique`) để phủ 100% các nhánh validator.
|
||||
@@ -127,7 +127,7 @@ Mục tiêu cốt lõi: SonarQube tính cả Line Coverage và Branch Coverage.
|
||||
- Tuân thủ mô hình **AAA** (`// Arrange`, `// Act`, `// Assert`).
|
||||
- Mock expectation có số lần gọi nghiêm ngặt: `->once()`, `->never()`.
|
||||
- Dùng Strict assertion: `$this->assertSame()` hoặc `expect(...)->toBe()`.
|
||||
- Đảm bảo quét sạch tất cả các nhánh điều kiện để SonarQube Line & Branch Coverage đạt > 85% - 95%.
|
||||
- Đảm bảo quét sạch tất cả các nhánh điều kiện để bộ test đạt độ phủ toàn diện và không bỏ sót bất kỳ logic nào.
|
||||
|
||||
### Bước 6: Thẩm định & Lưu File
|
||||
1. Tự kiểm tra file test qua `rules/verification-checklist.md`.
|
||||
|
||||
Reference in New Issue
Block a user