$npx -y skills add anhtester/codex-testing-kit --skill generate-test-dataSinh test data có cấu trúc, unique, traceable cho test cases. Hỗ trợ UI forms, API payloads, data-driven tests.
| 1 | # $generate-test-data — Sinh Test Data Có Cấu Trúc |
| 2 | |
| 3 | > User cung cấp feature/module hoặc test cases cần sinh data. |
| 4 | > AI phân tích fields, constraints, sinh bộ data đầy đủ (positive, negative, boundary, edge cases) với format sẵn sàng sử dụng. |
| 5 | |
| 6 | > **BẮT BUỘC (MANDATORY):** Trước khi bắt đầu, PHẢI nạp và đọc kỹ: |
| 7 | > - **Skill:** `.agents/skills/test-data-generator/SKILL.md` — Quy tắc sinh data |
| 8 | > - **Rule:** `.agents/rules/automation_rules.md` — Section Test Data |
| 9 | |
| 10 | --- |
| 11 | |
| 12 | ## Input cần từ User |
| 13 | |
| 14 | | Input | Bắt buộc | Mô tả | |
| 15 | |-------|----------|-------| |
| 16 | | Feature / Module | ✅ | VD: "Form đăng ký", "API Create User", "Trang Login" | |
| 17 | | Fields cần data | ⚠️ Nên có | Danh sách fields + constraints. Nếu không có → AI tự phân tích từ DOM/Spec | |
| 18 | | URL trang / Swagger spec | ❌ | Nếu có → AI inspect DOM/Spec để lấy validation rules chính xác | |
| 19 | | Test cases | ❌ | Nếu đã có test cases → AI sinh data match từng TC | |
| 20 | | Output format | ❌ | `json` (mặc định), `csv`, `markdown table`, `code` (TypeScript/Java/Python) | |
| 21 | | Ngôn ngữ data | ❌ | Tiếng Việt / Tiếng Anh (mặc định: theo context) | |
| 22 | |
| 23 | --- |
| 24 | |
| 25 | ## Các bước thực hiện |
| 26 | |
| 27 | ### Bước 1: Phân tích Fields & Constraints |
| 28 | |
| 29 | 1. **Xác định nguồn thông tin:** |
| 30 | |
| 31 | | Nguồn | Cách lấy | Ưu tiên | |
| 32 | |-------|----------|---------| |
| 33 | | User cung cấp trực tiếp | Đọc từ input | ⭐ Cao nhất | |
| 34 | | DOM thực tế (UI form) | `browser_navigate` → `browser_snapshot` → phân tích input fields | ⭐ Cao | |
| 35 | | Swagger/OpenAPI spec | `read_url_content` → parse schema + constraints | ⭐ Cao | |
| 36 | | Test cases đã có | Đọc test steps → trích xuất fields | Trung bình | |
| 37 | | Đoán từ tên module | Dựa trên kinh nghiệm domain | ⭐ Thấp nhất | |
| 38 | |
| 39 | 2. **Với mỗi field, xác định:** |
| 40 | |
| 41 | | Attribute | Ví dụ | |
| 42 | |-----------|-------| |
| 43 | | **Tên field** | email, password, name, phone | |
| 44 | | **Kiểu dữ liệu** | string, number, boolean, date, file, enum | |
| 45 | | **Required?** | Bắt buộc hay tùy chọn | |
| 46 | | **Validation rules** | min/maxLength, pattern/regex, format (email, phone), unique | |
| 47 | | **Giá trị mặc định** | Nếu có | |
| 48 | | **Enum values** | VD: status = ["AVAILABLE", "UNAVAILABLE"] | |
| 49 | | **Quan hệ phụ thuộc** | VD: `password_confirm` phải khớp `password` | |
| 50 | |
| 51 | 3. **Trình bày bảng Fields cho User xác nhận (CHECKPOINT ⏸️):** |
| 52 | |
| 53 | ```markdown |
| 54 | | # | Field | Type | Required | Constraints | Notes | |
| 55 | |---|-------|------|----------|-------------|-------| |
| 56 | | 1 | email | string | ✅ | format: email, unique | Dùng để login | |
| 57 | | 2 | password | string | ✅ | minLength: 6 | | |
| 58 | | 3 | name | string | ✅ | maxLength: 100 | | |
| 59 | | 4 | phone | string | ❌ | pattern: /^0[0-9]{9}$/ | 10 chữ số, bắt đầu bằng 0 | |
| 60 | ``` |
| 61 | |
| 62 | > Chờ User xác nhận hoặc bổ sung constraints trước khi sang Bước 2. |
| 63 | |
| 64 | --- |
| 65 | |
| 66 | ### Bước 2: Sinh Test Data theo 4 Categories |
| 67 | |
| 68 | Với mỗi field đã xác định, sinh data theo bảng sau: |
| 69 | |
| 70 | #### 2A. Positive Data (Happy Path) |
| 71 | |
| 72 | - Giá trị hợp lệ, đúng format, trong constraints |
| 73 | - Tất cả required fields được điền |
| 74 | - Dữ liệu phải **unique + traceable** |
| 75 | |
| 76 | **Format unique data:** |
| 77 | ``` |
| 78 | <prefix>_<testName>_<timestamp> |
| 79 | ``` |
| 80 | Ví dụ: |
| 81 | ``` |
| 82 | email: auto_register_1712049200@test.com |
| 83 | username: user_login_1712049200 |
| 84 | code: TC_BOOK_1712049200 |
| 85 | ``` |
| 86 | |
| 87 | #### 2B. Negative Data |
| 88 | |
| 89 | | Loại | Mô tả | Ví dụ | |
| 90 | |------|--------|-------| |
| 91 | | **Missing required** | Bỏ trống field bắt buộc | `email: ""` | |
| 92 | | **Invalid format** | Sai format | `email: "not-an-email"` | |
| 93 | | **Invalid type** | Sai kiểu dữ liệu | `price: "abc"` (expect number) | |
| 94 | | **Duplicate** | Giá trị đã tồn tại | `email: "existing@test.com"` | |
| 95 | | **Invalid characters** | Ký tự không được phép | `name: "<script>alert(1)</script>"` | |
| 96 | | **Wrong relationship** | Vi phạm quan hệ fields | `password_confirm ≠ password` | |
| 97 | |
| 98 | #### 2C. Boundary Values |
| 99 | |
| 100 | | Loại | Mô tả | Ví dụ (field có minLength=6, maxLength=20) | |
| 101 | |------|--------|-------| |
| 102 | | **Min** | Đúng bằng min | `"abcdef"` (6 chars) | |
| 103 | | **Min - 1** | Dưới min | `"abcde"` (5 chars) | |
| 104 | | **Max** | Đúng bằng max | `"a" * 20` (20 chars) | |
| 105 | | **Max + 1** | Vượt max | `"a" * 21` (21 chars) | |
| 106 | | **Empty** | Chuỗi rỗng | `""` | |
| 107 | | **Zero** | Số 0 (cho number fields) | `0` | |
| 108 | | **Negative** | Số âm (cho number fields) | `-1` | |
| 109 | |
| 110 | #### 2D. Edge Cases |
| 111 | |
| 112 | | Loại | Mô tả | Ví dụ | |
| 113 | |------|--------|-------| |
| 114 | | **Unicode** | Ký tự đặc biệt Unicode | `"Nguyễn Văn 🎉"` | |
| 115 | | **Very long** | Chuỗi cực dài | `"a" * 10000` | |
| 116 | | **Whitespace** | Khoảng trắng đầu/cuối | `" email@test.com "` | |
| 117 | | **SQL injection** | Pattern SQL injection | `"'; DROP TABLE users; --"` | |
| 118 | | **HTML tags** | HTML trong text field | `"<b>bold</b><img src=x onerror=alert(1)>"` | |
| 119 | | **Null/undefined** | Giá trị null | `null` | |
| 120 | | **Special numbers** | Số đặc biệt | `0.1 + 0.2`, `Number.MAX_SAFE_INTEGER`, `NaN` | |
| 121 | | **Date edge** | Ngày đặc biệt | `"2024-02-29"` (năm nhuận), `"2024-12-31"`, `"1970-01-01"` | |
| 122 | |
| 123 | --- |
| 124 | |
| 125 | ### Bước 3: Đóng gói Output |
| 126 | |
| 127 | Trả kết quả theo format User yêu cầu (mặc định: JSON): |