$npx -y skills add anhtester/codex-testing-kit --skill generate-combinatorial-test-dataSinh test data cho ma trận kết hợp đa chiều bằng pipeline chạy thật qua nhiều modules. Dùng đầu ra từ skill generate-cross-module-test-plan làm input.
| 1 | # $generate-combinatorial-test-data — Sinh Test Data Cho Ma Trận Kết Hợp |
| 2 | |
| 3 | > **Dùng khi:** Đã có ma trận kết hợp (từ `$generate-cross-module-test-plan`) và cần **tạo test data thực tế** bằng cách chạy qua nhiều modules trên browser, hoặc sinh bộ data có cấu trúc sẵn sàng cho automation. |
| 4 | |
| 5 | > **BẮT BUỘC (MANDATORY):** Trước khi bắt đầu, PHẢI nạp và đọc kỹ: |
| 6 | > - **Skill:** `.agents/skills/test-data-generator/SKILL.md` — Quy tắc sinh data (xem phần Multi-Step Pipeline) |
| 7 | > - **Skill:** `.agents/skills/ui-debug-agent/SKILL.md` — Inspect DOM khi chạy browser |
| 8 | > - **Workflow:** `.agents/skills/generate-cross-module-test-plan/SKILL.md` — Hiểu cấu trúc ma trận đầu vào |
| 9 | |
| 10 | --- |
| 11 | |
| 12 | ## Mối quan hệ với các workflows khác |
| 13 | |
| 14 | ``` |
| 15 | $generate-cross-module-test-plan → Ma trận kết hợp (input) |
| 16 | ↓ |
| 17 | $generate-combinatorial-test-data → Bộ test data (workflow này) |
| 18 | ↓ |
| 19 | $generate-manual-testcases-rbt → Test cases chi tiết |
| 20 | ↓ |
| 21 | $generate-automation-from-testcases → Automation scripts |
| 22 | ``` |
| 23 | |
| 24 | --- |
| 25 | |
| 26 | ## 2 Modes |
| 27 | |
| 28 | | Mode | Khi nào dùng | Output | |
| 29 | |------|-------------|--------| |
| 30 | | **GENERATE** (mặc định) | Sinh bộ data có cấu trúc từ ma trận — KHÔNG chạy browser | File JSON/CSV/Markdown với data cho mỗi bộ kết hợp | |
| 31 | | **PIPELINE** | Cần tạo data THẬT trên hệ thống bằng cách chạy qua từng module trên browser | Data thật đã tạo + IDs + screenshots evidence | |
| 32 | |
| 33 | > Agent tự chọn mode: |
| 34 | > - User nói "sinh data", "generate data" → **GENERATE** |
| 35 | > - User nói "tạo data trên hệ thống", "chạy tạo data", "setup data thật" → **PIPELINE** |
| 36 | > - Nếu không rõ → hỏi user |
| 37 | |
| 38 | --- |
| 39 | |
| 40 | ## Input cần từ User |
| 41 | |
| 42 | | Input | Bắt buộc | Mô tả | |
| 43 | |-------|----------|-------| |
| 44 | | **Ma trận kết hợp** | ✅ | File `.md` / bảng Markdown từ `$generate-cross-module-test-plan` | |
| 45 | | **URL ứng dụng** | ✅ (PIPELINE) | Để agent chạy browser tạo data | |
| 46 | | **Credentials** | ⚠️ PIPELINE | Nếu app cần đăng nhập | |
| 47 | | **Output format** | ❌ | `json` (mặc định), `csv`, `markdown`, `code` (TS/Java/Python) | |
| 48 | | **Ngôn ngữ data** | ❌ | Tiếng Việt / Tiếng Anh (mặc định: theo context) | |
| 49 | |
| 50 | --- |
| 51 | |
| 52 | ## Các bước thực hiện |
| 53 | |
| 54 | ### Bước 1: Đọc & Parse Ma Trận Kết Hợp |
| 55 | |
| 56 | 1. **Đọc file ma trận** từ user cung cấp: |
| 57 | - File local → `view_file` |
| 58 | - Inline trong chat → parse trực tiếp |
| 59 | - URL → `read_url_content` |
| 60 | |
| 61 | 2. **Parse và validate:** |
| 62 | - Xác định danh sách dimensions (D1, D2, D3...) |
| 63 | - Xác định values của mỗi dimension |
| 64 | - Đọc expected template/formula cho mỗi bộ |
| 65 | - Đếm tổng số bộ kết hợp cần sinh data |
| 66 | |
| 67 | 3. **Trình bày tóm tắt:** |
| 68 | ```markdown |
| 69 | 📊 Ma trận đã đọc: |
| 70 | - Dimensions: 5 (Đối tác, Thanh toán, Thuế, Công nợ, Nguồn TS) |
| 71 | - Tổng bộ kết hợp: 20 (Pairwise) |
| 72 | - Mode: GENERATE / PIPELINE |
| 73 | |
| 74 | Bắt đầu sinh data? (Y/N) |
| 75 | ``` |
| 76 | |
| 77 | --- |
| 78 | |
| 79 | ### Bước 2: Phân Tích Fields & Data Requirements Mỗi Module |
| 80 | |
| 81 | 1. **Với mỗi module** trong chuỗi, xác định fields cần data: |
| 82 | |
| 83 | ```markdown |
| 84 | | Module | Field | Type | Required | Constraints | Data Source | |
| 85 | |--------|-------|------|----------|-------------|-------------| |
| 86 | | Đối tác | partner_name | string | ✅ | max: 200 | Random + prefix | |
| 87 | | Đối tác | partner_type | select | ✅ | enum: [TC, CN, HKD] | Từ dimension D1 | |
| 88 | | Đối tác | tax_id | string | ✅ | 10-13 digits | Random unique | |
| 89 | | Thanh toán | currency | select | ✅ | enum: [VND, USD] | Từ dimension D2 | |
| 90 | | Thanh toán | amount | number | ✅ | min: 1 | Business-relevant values | |
| 91 | | Thuế | tax_type | select | ✅ | enum: [PIT, VAT, NT, MT] | Từ dimension D3 | |
| 92 | | ...| ... | ... | ... | ... | ... | |
| 93 | ``` |
| 94 | |
| 95 | 2. **Phân loại fields:** |
| 96 | |
| 97 | | Loại | Mô tả | Cách sinh data | |
| 98 | |------|-------|----------------| |
| 99 | | **Dimension fields** | Giá trị thuộc dimension trong ma trận | Lấy từ bộ kết hợp (không random) | |
| 100 | | **Supporting fields** | Fields bắt buộc nhưng không phải dimension | Sinh random + unique + traceable | |
| 101 | | **Computed fields** | Tự tính từ formula | Tính theo business rules | |
| 102 | | **Reference fields** | ID/code từ module trước | Copy từ output module trước | |
| 103 | |
| 104 | --- |
| 105 | |
| 106 | ### Bước 3: Sinh Test Data — Mode GENERATE |
| 107 | |
| 108 | > Thực hiện khi mode = GENERATE (mặc định) |
| 109 | |
| 110 | 1. **Với mỗi bộ kết hợp** trong ma trận, sinh 1 bộ data đầy đủ: |
| 111 | |
| 112 | ```json |
| 113 | { |
| 114 | "combination_id": "COMBO_01", |
| 115 | "dimensions": { |
| 116 | "D1_partner_type": "Tổ chức", |
| 117 | "D2_payment_type": "VND", |
| 118 | "D3_tax_type": "VAT 10%", |
| 119 | "D4_debt_type": "Thông thường", |
| 120 | "D5_asset_source": "Quỹ A" |
| 121 | }, |
| 122 | "module_data": { |
| 123 | "module_1_partner": { |
| 124 | "partner_name": "auto_combo01_tc_1712049200", |
| 125 | "partner_type": "Tổ chức", |
| 126 | "tax_id": "0123456789", |
| 127 | "address": "Số 1 Nguyễn Huệ, Q1, HCM" |
| 128 | }, |
| 129 | "module_2_payment": { |
| 130 | "currency": "VND", |
| 131 | "amount": 100000000, |
| 132 | "payment_date": "2026-04-15", |
| 133 | "description": "Thanh toán combo01" |
| 134 | }, |
| 135 | "module_ |