Files
agent-unit-testing/rules/edge-cases-matrix.md
T
Pham-Tan-Thien da1bd48444 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
2026-09-17 14:25:02 +07:00

44 lines
5.8 KiB
Markdown

# Ma Trận Kịch Bản Biên & Ngoại Lệ (Edge Cases & Boundary Matrix)
Bảng phân loại toàn diện các tình huống biên bắt buộc phải kiểm thử đối với từng kiểu dữ liệu, cấu trúc điều khiển và nghiệp vụ trong ứng dụng **Laravel & CakePHP** để đảm bảo file test được viết **đầy đủ 100% không bỏ sót bất kỳ kịch bản nào**.
---
## 1. Phân Loại Dữ Liệu Đầu Vào (Input Data Types)
| Loại dữ liệu | Kịch bản biên bắt buộc phải test |
| :--- | :--- |
| **String (Chuỗi)** | - Chuỗi rỗng: `""`<br>- Chuỗi chỉ chứa khoảng trắng: `" "`<br>- Chuỗi cực dài vượt giới hạn database/API (e.g. > 255 ký tự hoặc > 65535 ký tự)<br>- Chuỗi chứa ký tự Unicode đặc biệt / Emoji: `"Nguyễn Văn A 🚀 🔥"`<br>- Chuỗi chứa mã HTML độc hại hoặc ký tự đặc biệt: `<script>alert(1)</script>`, `O'Connor`, `' OR '1'='1` |
| **Number (Số)** | - Số `0`<br>- Số âm: `-1`, `-99999`<br>- Số thực với số thập phân dài: `0.00000001`<br>- Giá trị cực đại (`PHP_INT_MAX`), giá trị cực tiểu (`PHP_INT_MIN`)<br>- Phép chia cho `0` (Division by zero) |
| **Array (Mảng / Collection)** | - Mảng rỗng: `[]`<br>- Mảng 1 phần tử (single element) vs Nhiều phần tử<br>- Mảng thiếu các key bắt buộc<br>- Mảng chứa giá trị `null` ở các field quan trọng<br>- Mảng lồng nhau nhiều cấp (Deeply nested)<br>- Mảng có key không tuần tự hoặc trùng lặp |
| **Boolean** | - Bắt buộc kiểm thử cả 2 giá trị `true` và `false` cho mọi cờ logic, permissions và options |
| **Date / Time (Thời gian)** | - Thời gian quá khứ vs Hiện tại vs Tương lai<br>- Ngày nhuận (29/02)<br>- Chuyển giao năm cũ sang năm mới (31/12 -> 01/01)<br>- Khác biệt múi giờ (Timezone discrepancies: UTC vs Local) |
| **Object / Entity / Model** | - Object bị `null`<br>- Model không tìm thấy trong Database (`ModelNotFoundException`, `RecordNotFoundException`)<br>- Model ở trạng thái Soft-Deleted<br>- Model thiếu quan hệ (Missing relationship / Relation not loaded) |
---
## 2. Phân Loại Cấu Trúc Điều Khiển & Nhánh Rẽ (Branching & Control Flow)
| Cấu trúc điều khiển | Yêu cầu kịch bản test bắt buộc |
| :--- | :--- |
| **Null Coalescing (`??`)** | Bắt buộc 2 test cases: (1) Biến bên trái có giá trị -> Lấy giá trị đó; (2) Biến bên trái là `null` hoặc key không tồn tại -> Lấy giá trị fallback bên phải. |
| **Toán tử Ternary (`?:`)** | Bắt buộc 2 test cases: (1) Biểu thức đánh giá là `true` -> Trả về vế 1; (2) Biểu thức đánh giá là `false` -> Trả về vế 2. |
| **Biểu thức Logic `&&`** | Bắt buộc test: (1) Tất cả vế đều `true` -> Pass; (2) Vế đầu `false` -> Short-circuit; (3) Vế đầu `true`, vế sau `false` -> Fail. |
| **Biểu thức Logic `\|\|`** | Bắt buộc test: (1) Vế đầu `true` -> Short-circuit; (2) Vế đầu `false`, vế sau `true` -> Pass; (3) Cả hai vế đều `false` -> Fail. |
| **`try - catch - finally`** | (1) Kịch bản bình thường chạy trọn vẹn `try`; (2) Ép mock ném Exception để kích hoạt toàn bộ thân khối `catch` (xác minh ghi log lỗi, rollback transaction, trả fallback hoặc re-throw). |
| **`switch` / `match`** | Mỗi nhánh `case` / arm bắt buộc có ít nhất 1 test case; Nhánh `default` (hoặc ngoại lệ unhandled) bắt buộc phải có test case kích hoạt. |
| **Early Returns / Guard Clauses** | Mỗi guard clause kiểm tra điều kiện thoát sớm (ví dụ: `if (!$valid) return false;`) bắt buộc có 1 test case kích hoạt thoát sớm. |
---
## 3. Phân Loại Nghiệp Vụ & Dịch Vụ Ngoài (Business & External Services)
| Nhóm nghiệp vụ | Tình huống cần test |
| :--- | :--- |
| **Authentication & Authorization** | - Người dùng chưa đăng nhập (Unauthenticated / Guest / `null`) -> 401 hoặc Redirect Login<br>- Người dùng đã đăng nhập nhưng không đủ quyền (Unauthorized) -> 403 Forbidden<br>- Người dùng bị khóa tài khoản (Inactive / Banned)<br>- Token hết hạn hoặc không hợp lệ |
| **HTTP Client / External API** | - API phản hồi thành công (200, 201)<br>- API trả về lỗi nghiệp vụ (400 Bad Request, 422 Unprocessable Entity)<br>- API từ chối xác thực (401, 403)<br>- API bị sập (500, 502, 503)<br>- API bị treo kết nối (Network Timeout / SocketException)<br>- API trả về cấu trúc JSON sai định dạng (Malformed JSON) |
| **Database & Transactions** | - Thêm/sửa/xóa thành công -> Dữ liệu thật được lưu (`assertDatabaseHas`)<br>- Lỗi phát sinh trong transaction -> Dữ liệu được rollback hoàn toàn (`assertDatabaseMissing`)<br>- Vi phạm ràng buộc toàn vẹn: khóa ngoại không tồn tại, trùng khóa duy nhất (`unique`) |
| **Storage & File Upload** | - File rỗng (0 bytes)<br>- Dung lượng file vượt quá giới hạn (Max upload size exceeded)<br>- Định dạng đuôi file không được phép (MIME type mismatch)<br>- Đĩa lưu trữ bị đầy hoặc không có quyền ghi |
| **Queue & Background Jobs** | - Job thực thi thành công phương thức `handle()`<br>- Job bị fail ở lần thử đầu tiên và kích hoạt retry<br>- Job bị fail hoàn toàn (hết số lần retry) -> kích hoạt phương thức `failed(Throwable $e)`<br>- Job nhận payload bị thiếu hoặc serialized model đã bị xóa |
| **Concurrency & Idempotency** | - Hai yêu cầu cùng thao tác tài nguyên (ví dụ trừ tiền hoặc giảm tồn kho)<br>- Idempotency: Gửi lại cùng một request/token 2 lần không gây trùng lặp giao dịch |