da1bd48444
- 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
44 lines
5.8 KiB
Markdown
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 |
|