@relipa/ai-flow-kit 0.1.2 → 0.1.4-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -0
- package/bin/aiflow.js +89 -2
- package/custom/harness/playwright/.env.example +10 -0
- package/custom/harness/playwright/playwright.config.ts +34 -0
- package/custom/harness/playwright/tests/e2e/auth.setup.ts +25 -0
- package/custom/harness/playwright/tests/e2e/fixtures/test.ts +6 -0
- package/custom/harness/playwright/tests/e2e/pages/BasePage.ts +9 -0
- package/custom/harness/playwright/tests/e2e/support/auth.ts +5 -0
- package/custom/mcp-presets/playwright.json +8 -0
- package/custom/rules/test-patterns.md +70 -0
- package/custom/skills/automation-testing/SKILL.md +239 -0
- package/custom/skills/automation-testing/templates/BasePage.ts +29 -0
- package/custom/skills/automation-testing/templates/PageObject.example.ts +29 -0
- package/custom/skills/automation-testing/templates/playwright.config.ts +39 -0
- package/custom/skills/automation-testing/templates/spec.example.ts +29 -0
- package/custom/skills/ba-skills/skill-ba-phan-tich-ban-dau-v1.md +44 -0
- package/custom/skills/ba-skills/skill-ba-prototype-v1.md +35 -0
- package/custom/skills/ba-skills/skill-ba-qa-template-v1.md +21 -0
- package/custom/skills/ba-skills/skill-ba-qa-v1.md +35 -0
- package/custom/skills/ba-skills/skill-ba-template-phan-tich-ban-dau-v1.md +30 -0
- package/custom/skills/ba-skills/skill-ba-template-uc-v1.md +83 -0
- package/custom/skills/ba-skills/skill-ba-ve-luong-mermaid-v1.md +35 -0
- package/custom/skills/ba-skills/skill-ba-viet-spec-uc-v1.md +38 -0
- package/custom/skills/ba-skills/skill-ba-xay-dung-business-rules-v1.md +39 -0
- package/custom/skills/coverage-check/SKILL.md +202 -0
- package/custom/skills/evidence-aggregation/SKILL.md +246 -0
- package/custom/skills/execute-flow/SKILL.md +499 -0
- package/custom/skills/execute-flow/templates/playwright.config.ts +39 -0
- package/custom/skills/gate-review/SKILL.md +195 -0
- package/custom/skills/generate-test-report/SKILL.md +99 -0
- package/custom/skills/generate-test-report/templates/test-report.md +58 -0
- package/custom/skills/generate-testcase/SKILL.md +350 -0
- package/custom/skills/generate-testcase/templates/testcase.md +88 -0
- package/custom/skills/log-bug/SKILL.md +131 -0
- package/custom/skills/pr-impact-analysis/SKILL.md +180 -0
- package/custom/skills/retest-orchestration/SKILL.md +191 -0
- package/custom/skills/script-sync/SKILL.md +208 -0
- package/custom/skills/test-analysis/SKILL.md +300 -0
- package/custom/skills/test-skills/categories/00-core/00.01.requirement-analysis.md +111 -0
- package/custom/skills/test-skills/categories/00-core/00.02.risk-analysis.md +24 -0
- package/custom/skills/test-skills/categories/00-core/00.03.test-scenario-builder.md +90 -0
- package/custom/skills/test-skills/categories/00-core/00.04.testcase-review.md +68 -0
- package/custom/skills/test-skills/categories/01-test-design/01.01.boundary-value-analysis.md +30 -0
- package/custom/skills/test-skills/categories/01-test-design/01.02.equivalence.partitioning.md +27 -0
- package/custom/skills/test-skills/categories/01-test-design/01.03.decision-table.md +26 -0
- package/custom/skills/test-skills/categories/01-test-design/01.04.state.transition.md +26 -0
- package/custom/skills/test-skills/categories/01-test-design/01.05.pairwise.md +25 -0
- package/custom/skills/test-skills/categories/01-test-design/01.06.error-guessing.md +28 -0
- package/custom/skills/test-skills/categories/02-ui-testing/02.01.UI-layout.md +29 -0
- package/custom/skills/test-skills/categories/02-ui-testing/02.02.form-validation.md +57 -0
- package/custom/skills/test-skills/categories/02-ui-testing/02.03.navigation.md +27 -0
- package/custom/skills/test-skills/categories/02-ui-testing/02.04.localization.md +27 -0
- package/custom/skills/test-skills/categories/02-ui-testing/02.05.accessibility.md +27 -0
- package/custom/skills/test-skills/categories/03-business-testing/03.01.CRUD-testing.md +51 -0
- package/custom/skills/test-skills/categories/03-business-testing/03.02.workflow-testing.md +44 -0
- package/custom/skills/test-skills/categories/03-business-testing/03.03.permission-testing.md +41 -0
- package/custom/skills/test-skills/categories/03-business-testing/03.04.dependency-validation.md +40 -0
- package/custom/skills/test-skills/categories/03-business-testing/03.05.notification-testing.md +43 -0
- package/custom/skills/test-skills/categories/03-business-testing/03.06.calculation.testing.md +44 -0
- package/custom/skills/test-skills/categories/04-data-testing/04.01.database-testing.md +43 -0
- package/custom/skills/test-skills/categories/04-data-testing/04.02.import-export-testing.md +43 -0
- package/custom/skills/test-skills/categories/04-data-testing/04.03.data-mapping.md +39 -0
- package/custom/skills/test-skills/categories/04-data-testing/04.04.duplicate-handling.md +39 -0
- package/custom/skills/test-skills/categories/04-data-testing/04.05.migration.md +42 -0
- package/custom/skills/test-skills/categories/05-integration/05.01.API-testing.md +37 -0
- package/custom/skills/test-skills/categories/05-integration/05.02.third-party-integration.md +36 -0
- package/custom/skills/test-skills/categories/05-integration/05.03.batch-processing.md +38 -0
- package/custom/skills/test-skills/categories/05-integration/05.04.file-upload-download.md +40 -0
- package/custom/skills/test-skills/categories/08-domain-skills/CMS.md +34 -0
- package/custom/skills/test-skills/categories/08-domain-skills/Ecommerce.md +35 -0
- package/custom/skills/test-skills/categories/99-review/99.01.coverage-review.md +35 -0
- package/custom/skills/test-skills/categories/99-review/99.02.knowledge-learning.md +34 -0
- package/custom/skills/test-skills/categories/99-review/99.03.repository-update.md +33 -0
- package/custom/skills/test-skills/categories/99-review/99.04.change-history.md +38 -0
- package/custom/skills/test-skills/rules/Directory_and_Naming_Convention.md +257 -0
- package/custom/skills/test-skills/rules/QA_Writing_Standards.md +49 -0
- package/custom/skills/test-skills/template/template_testcase.md +92 -0
- package/custom/templates/shared/create-spec-workflow.md +441 -0
- package/custom/templates/shared/create-testcase-workflow.md +470 -0
- package/custom/templates/shared/gate-workflow.md +421 -11
- package/docs/common/CHANGELOG.md +52 -0
- package/docs/common/QUICK_START.md +30 -0
- package/docs/common/cli-reference.md +48 -7
- package/package.json +2 -2
- package/scripts/create-score-excel.js +37 -14
- package/scripts/detect.js +10 -0
- package/scripts/guide.js +9 -0
- package/scripts/init.js +48 -1
- package/scripts/prompt.js +36 -0
- package/scripts/review.js +91 -0
- package/scripts/scaffold-playwright.js +106 -0
- package/scripts/task.js +21 -7
- package/scripts/update.js +127 -124
- package/scripts/use.js +36 -12
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pr-impact-analysis
|
|
3
|
+
description: Dev Artifacts Check — Phân tích PR diff để xác định phạm vi ảnh hưởng thật của thay đổi code, đề xuất regression TCs, lưu SHA tracking. Chạy đầu Gate 2a, đầu Gate 3, và sau mỗi RETEST có commit mới.
|
|
4
|
+
keywords: pr, impact analysis, regression, dev artifacts, github, diff, sha, code review, gate2, gate3
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Dev Artifacts Check — PR Impact Analysis
|
|
8
|
+
|
|
9
|
+
> **Mục đích:** Xác định **phạm vi ảnh hưởng thật** của thay đổi code từ PR của dev,
|
|
10
|
+
> để tránh miss regression test khi code thay đổi mở rộng hơn scope ticket.
|
|
11
|
+
>
|
|
12
|
+
> **Khi nào chạy:**
|
|
13
|
+
> - Đầu Gate 2 Phase 2a (sau Gate 1 APPROVED) — xác định regression scope ban đầu
|
|
14
|
+
> - Đầu Gate 3 (trước khi execute) — phát hiện PR mới hoặc commit mới kể từ Gate 2
|
|
15
|
+
> - Sau mỗi RETEST khi dev push commit fix — check xem fix có mở rộng impact không
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Trigger
|
|
20
|
+
|
|
21
|
+
Một trong các cách:
|
|
22
|
+
|
|
23
|
+
1. **TESTER khai báo trong chat:** `PR: <url>` hoặc `PR: <url1>, <url2>` (multi-repo)
|
|
24
|
+
2. **AI phát hiện tự động:** Ticket có PR link đính kèm → AI đề xuất, TESTER confirm
|
|
25
|
+
3. **Không có PR** → ghi nhận "chưa có dev artifacts" vào `impact-analysis.md`, không block gate
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Quy trình với mỗi PR
|
|
30
|
+
|
|
31
|
+
### Step 1: Fetch PR Info
|
|
32
|
+
|
|
33
|
+
Ưu tiên `gh` CLI nếu available:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
gh pr view <url> --json title,body,headRefOid,files
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Lấy về:
|
|
40
|
+
- `title` — tiêu đề PR
|
|
41
|
+
- `body` — PR description (thường chứa summary của dev)
|
|
42
|
+
- `headRefOid` — SHA của commit đầu PR (dùng để track delta sau này)
|
|
43
|
+
- `files` — danh sách files thay đổi + số dòng
|
|
44
|
+
|
|
45
|
+
**Fallback (không có `gh` hoặc không phải GitHub):**
|
|
46
|
+
```bash
|
|
47
|
+
git fetch origin <branch>
|
|
48
|
+
git diff main...<branch> --stat
|
|
49
|
+
```
|
|
50
|
+
Yêu cầu TESTER cung cấp branch name.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### Step 2: Phân tích theo Layer
|
|
55
|
+
|
|
56
|
+
Không đổ cả diff vào context. Phân tích có chọn lọc:
|
|
57
|
+
|
|
58
|
+
**Bước 2a:** Nhóm files theo layer/khu vực:
|
|
59
|
+
|
|
60
|
+
| Layer | Files điển hình | Mức độ rủi ro |
|
|
61
|
+
|-------|----------------|--------------|
|
|
62
|
+
| Migration / Schema | `*.sql`, `*migration*`, `*schema*` | 🔴 High — ảnh hưởng toàn bộ data |
|
|
63
|
+
| Middleware / Config | `middleware/*`, `config/*`, `*.env*` | 🔴 High — ảnh hưởng toàn app |
|
|
64
|
+
| Shared lib / Utils | `lib/*`, `utils/*`, `helpers/*`, `common/*` | 🟡 Medium — nhiều callers |
|
|
65
|
+
| Controller / API route | `controller/*`, `routes/*`, `api/*` | 🟡 Medium — ảnh hưởng endpoint |
|
|
66
|
+
| Service / Business logic | `service/*`, `usecase/*`, `domain/*` | 🟡 Medium |
|
|
67
|
+
| Component / Page | `components/*`, `pages/*`, `views/*` | 🟢 Low — ảnh hưởng UI cụ thể |
|
|
68
|
+
| Test files | `*.test.*`, `*.spec.*`, `__tests__/*` | 🟢 Low — không ảnh hưởng prod |
|
|
69
|
+
| Docs / Config | `*.md`, `*.json` (non-env) | 🟢 Ignore |
|
|
70
|
+
|
|
71
|
+
**Bước 2b:** Với files rủi ro High → đọc full diff:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
gh pr diff <url> -- <path/to/high-risk-file>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Chỉ đọc files có khả năng tác động lan rộng. Không đọc toàn bộ diff.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### Step 3: Map Code → Feature → Regression Scope
|
|
82
|
+
|
|
83
|
+
Dựa trên danh sách files và diff:
|
|
84
|
+
|
|
85
|
+
1. Xác định **màn hình/chức năng bị ảnh hưởng trực tiếp** (những gì PR cố tình thay đổi)
|
|
86
|
+
2. Xác định **màn hình/chức năng bị ảnh hưởng gián tiếp** (callers, dependencies, shared code)
|
|
87
|
+
3. Đề xuất TCs regression cần chạy thêm (ngoài TCs gốc cho feature đang test)
|
|
88
|
+
|
|
89
|
+
**Ví dụ:**
|
|
90
|
+
- PR sửa `UserService.findById()` → ảnh hưởng Profile page, Settings page, Order History (gọi user info)
|
|
91
|
+
- PR thêm migration `ALTER TABLE orders` → ảnh hưởng Order list, Order detail, Cart checkout
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
### Step 4: Record SHA + Output impact-analysis.md
|
|
96
|
+
|
|
97
|
+
Lưu `test-plan/impact-analysis.md`:
|
|
98
|
+
|
|
99
|
+
```markdown
|
|
100
|
+
# Dev Artifacts — Impact Analysis
|
|
101
|
+
|
|
102
|
+
**Last updated:** [YYYY-MM-DD HH:MM] | **Gate:** [2 / 3 / RETEST]
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Dev Artifacts Reference
|
|
107
|
+
|
|
108
|
+
| PR | Repo | SHA đã đọc | Summary | Lần check cuối |
|
|
109
|
+
|----|------|-----------|---------|---------------|
|
|
110
|
+
| #123 | repo-be | a1b2c3d | ✅ Sửa UserService.findById, thêm caching | Gate 2 |
|
|
111
|
+
| #456 | repo-fe | e5f6a7b | ✅ Update ProfilePage component | Gate 2 |
|
|
112
|
+
|
|
113
|
+
_(Nếu chưa có PR: "Chưa có dev artifacts — sẽ check lại ở Gate 3")_
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Impact Analysis
|
|
118
|
+
|
|
119
|
+
### Vùng thay đổi (theo layer)
|
|
120
|
+
|
|
121
|
+
| Layer | Files | Số dòng thay đổi | Rủi ro |
|
|
122
|
+
|-------|-------|-----------------|--------|
|
|
123
|
+
| Service | `UserService.java` | +45/-12 | 🟡 Medium |
|
|
124
|
+
| Component | `ProfilePage.tsx` | +23/-8 | 🟢 Low |
|
|
125
|
+
|
|
126
|
+
### Màn hình ảnh hưởng trực tiếp
|
|
127
|
+
- **Profile Page** (`/profile`) — component thay đổi trực tiếp
|
|
128
|
+
- **Settings Page** (`/settings`) — gọi UserService.findById
|
|
129
|
+
|
|
130
|
+
### Màn hình ảnh hưởng gián tiếp (regression risk)
|
|
131
|
+
- **Order History** (`/orders`) — sử dụng UserService.findById cho user info
|
|
132
|
+
_Lý do: caching layer mới có thể trả về stale data cho order display_
|
|
133
|
+
- **Admin User Management** (`/admin/users`) — cùng service
|
|
134
|
+
|
|
135
|
+
### Đề xuất Regression TCs
|
|
136
|
+
|
|
137
|
+
Ngoài TCs gốc của feature, cần test thêm:
|
|
138
|
+
|
|
139
|
+
| TC (Regression) | Lý do |
|
|
140
|
+
|-----------------|-------|
|
|
141
|
+
| Verify Order History hiển thị đúng user info | UserService.findById đã thêm caching |
|
|
142
|
+
| Verify Admin User list không bị cache stale | Shared service thay đổi |
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Guard Rails (bắt buộc)
|
|
148
|
+
|
|
149
|
+
> ⚠️ PR diff + summary chỉ được dùng để **mở rộng độ phủ** (thêm TC, thêm vùng regression).
|
|
150
|
+
> **Tuyệt đối KHÔNG dùng để xác định expected result** — expected result chỉ lấy từ ticket/spec của BA/PM.
|
|
151
|
+
>
|
|
152
|
+
> Lý do: nếu dev hiểu sai requirement → TC sinh từ dev artifacts cũng sai → test pass nhưng feature làm sai.
|
|
153
|
+
> Khi dev artifacts mâu thuẫn với spec → flag thành câu hỏi hoặc bug tiềm năng, không sửa TC.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Delta Detection (Gate 3 + RETEST)
|
|
158
|
+
|
|
159
|
+
Khi re-run Dev Artifacts Check ở Gate 3 hoặc sau RETEST:
|
|
160
|
+
|
|
161
|
+
1. Đọc SHA đã ghi trong `impact-analysis.md`
|
|
162
|
+
2. Fetch SHA hiện tại của PR: `gh pr view <url> --json headRefOid`
|
|
163
|
+
3. **Nếu SHA thay đổi** → có commit mới → đọc diff delta:
|
|
164
|
+
```bash
|
|
165
|
+
gh pr diff <url> -- <files-changed-since-old-sha>
|
|
166
|
+
```
|
|
167
|
+
4. **Phân tích delta** → đề xuất TC bổ sung (mini-loop, chỉ phần thêm mới)
|
|
168
|
+
5. Cập nhật SHA mới vào `impact-analysis.md`
|
|
169
|
+
|
|
170
|
+
**Không cần TESTER approve lại toàn bộ Gate 2** — chỉ approve **phần delta** (TCs mới do commit mới gây ra).
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Mandatory Rules
|
|
175
|
+
|
|
176
|
+
- ❌ **KHÔNG** dùng expected result từ PR description — chỉ dùng ticket/spec của BA
|
|
177
|
+
- ❌ **KHÔNG** đọc full diff của toàn bộ files — chỉ đọc selective (high-risk files)
|
|
178
|
+
- ✅ **PHẢI** ghi SHA đã đọc vào `impact-analysis.md` để delta detection sau này
|
|
179
|
+
- ✅ **PHẢI** phân biệt rõ ảnh hưởng trực tiếp vs gián tiếp
|
|
180
|
+
- ✅ Không có PR → không block gate, ghi nhận và tiến tiếp
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: retest-orchestration
|
|
3
|
+
description: Gate 3 RETEST loop — Parse lệnh "RETEST: TC_ID" từ TESTER, re-run Dev Artifacts Check (phát hiện commit mới), chạy Playwright selective cho TCs được chỉ định, cập nhật evidence và bug status.
|
|
4
|
+
keywords: gate3, retest, loop, re-execute, playwright, dev artifacts, delta, bug fix, selective test
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# RETEST Orchestration — Gate 3 Loop
|
|
8
|
+
|
|
9
|
+
> **Mục đích:** Xử lý lệnh `RETEST` từ TESTER sau khi dev fix bug, re-run Playwright có chọn lọc,
|
|
10
|
+
> và cập nhật evidence + bug status tương ứng.
|
|
11
|
+
>
|
|
12
|
+
> **Trigger:** TESTER gõ `RETEST: AD10_002` hoặc `RETEST: AD10_001, AD10_002, AD10_003`
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Trigger Syntax
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
RETEST: AD10_002 # Re-run 1 TC
|
|
20
|
+
RETEST: AD10_002, AD10_005 # Re-run nhiều TCs
|
|
21
|
+
RETEST: AD10_002, AD10_005, AD10_008
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
AI parse TC IDs từ text sau `RETEST:` (case-insensitive, trim whitespace, split by comma).
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Step 1: Re-run Dev Artifacts Check
|
|
29
|
+
|
|
30
|
+
Trước khi re-execute, **luôn luôn** chạy Dev Artifacts Check (invoke `pr-impact-analysis` skill):
|
|
31
|
+
|
|
32
|
+
**Lý do:** Dev commit fix có thể thay đổi thêm code ngoài chỗ đang fix → cần phát hiện và cover.
|
|
33
|
+
|
|
34
|
+
1. Đọc SHA đã ghi trong `test-plan/impact-analysis.md`
|
|
35
|
+
2. Fetch SHA hiện tại: `gh pr view <url> --json headRefOid`
|
|
36
|
+
3. **Nếu SHA không thay đổi** → skip delta analysis, tiến sang Step 2
|
|
37
|
+
4. **Nếu SHA thay đổi** → có commit mới:
|
|
38
|
+
- Phân tích diff delta (chỉ phần thay đổi từ SHA cũ → SHA mới)
|
|
39
|
+
- Đề xuất TC bổ sung nếu có area mới bị ảnh hưởng
|
|
40
|
+
- Hiển thị **mini-loop prompt:**
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
44
|
+
⚠️ RETEST — DELTA DETECTED
|
|
45
|
+
|
|
46
|
+
Dev đã push commit mới (SHA: [old] → [new])
|
|
47
|
+
Diff mới ảnh hưởng thêm:
|
|
48
|
+
- [file/area 1] → [feature bị ảnh hưởng]
|
|
49
|
+
- [file/area 2] → [feature bị ảnh hưởng]
|
|
50
|
+
|
|
51
|
+
Đề xuất TC bổ sung:
|
|
52
|
+
- TC_[Module]_XXX: [Scenario mới cần test do delta]
|
|
53
|
+
|
|
54
|
+
→ Type APPROVED to add these TCs and continue RETEST
|
|
55
|
+
→ Type SKIP to proceed without new TCs
|
|
56
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- TESTER gõ `APPROVED` → generate scripts cho TC mới → thêm vào RETEST list
|
|
60
|
+
- TESTER gõ `SKIP` → tiến sang Step 2 chỉ với TCs ban đầu
|
|
61
|
+
- Cập nhật SHA mới vào `impact-analysis.md`
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Step 2: Execute Playwright (Selective)
|
|
66
|
+
|
|
67
|
+
Chạy Playwright chỉ cho các TCs được chỉ định:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
BASE_URL=<baseUrl> npx playwright test --grep "AD10_002|AD10_005" --headed
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Nếu một TC không có script** (type = Manual hoặc script chưa được sinh):
|
|
74
|
+
- Hiển thị: `⚠️ AD10_011: Không có Playwright script (Manual TC). Tester cần test thủ công.`
|
|
75
|
+
- Bỏ qua TC đó, tiếp tục với các TCs còn lại
|
|
76
|
+
|
|
77
|
+
**Nếu script bị lỗi syntax** (script cũ, selector đã hỏng):
|
|
78
|
+
- Hiển thị error cụ thể
|
|
79
|
+
- Đề xuất re-generate script: `Muốn tôi cập nhật script cho TC này không?`
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Step 3: Cập nhật Evidence
|
|
84
|
+
|
|
85
|
+
Invoke `evidence-aggregation` skill cho RETEST results:
|
|
86
|
+
|
|
87
|
+
**Không xóa evidence cũ** — tạo subfolder theo run:
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
evidence/
|
|
91
|
+
├── AD10_002-error-sai-password/
|
|
92
|
+
│ ├── run-1/ ← Original run (FAIL)
|
|
93
|
+
│ │ ├── failure-screenshot.png
|
|
94
|
+
│ │ └── result.md
|
|
95
|
+
│ └── run-2/ ← RETEST run (kết quả mới)
|
|
96
|
+
│ ├── step-01.png
|
|
97
|
+
│ └── result.md
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**result.md của run mới** phải link về run cũ:
|
|
101
|
+
|
|
102
|
+
```markdown
|
|
103
|
+
# Result: AD10_002 — RETEST Run 2
|
|
104
|
+
|
|
105
|
+
**Status:** ✅ PASS (Previous: ❌ FAIL — Run 1)
|
|
106
|
+
**Run date:** [YYYY-MM-DD HH:MM]
|
|
107
|
+
**Bug reference:** bugs/BUG-001-error-message-khong-hien.md → RESOLVED
|
|
108
|
+
|
|
109
|
+
...
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Step 4: Cập nhật Bug Status
|
|
115
|
+
|
|
116
|
+
Với mỗi TC trong RETEST:
|
|
117
|
+
|
|
118
|
+
**TC pass sau RETEST** (trước đó fail):
|
|
119
|
+
- Đọc `bugs/` để tìm BUG liên quan đến TC_ID đó
|
|
120
|
+
- Cập nhật BUG file: thêm section Resolution:
|
|
121
|
+
|
|
122
|
+
```markdown
|
|
123
|
+
## Resolution
|
|
124
|
+
|
|
125
|
+
**Status:** ✅ RESOLVED
|
|
126
|
+
**Fixed in commit:** [SHA từ impact-analysis.md]
|
|
127
|
+
**Retest result:** ✅ PASS — [YYYY-MM-DD]
|
|
128
|
+
**Retest evidence:** evidence/AD10_002-error-sai-password/run-2/
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**TC vẫn fail sau RETEST**:
|
|
132
|
+
- Cập nhật BUG file: thêm RETEST attempt:
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
## Retest History
|
|
136
|
+
|
|
137
|
+
| Run | Date | Result | Notes |
|
|
138
|
+
|-----|------|--------|-------|
|
|
139
|
+
| 1 | [Date] | ❌ FAIL | Initial run |
|
|
140
|
+
| 2 | [Date] | ❌ FAIL | Dev fix không resolve issue |
|
|
141
|
+
|
|
142
|
+
**Action needed:** Dev cần investigate thêm. Error vẫn reproduce với [details].
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Step 5: Display RETEST Summary
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
151
|
+
🔁 RETEST COMPLETE
|
|
152
|
+
|
|
153
|
+
TCs re-executed: [N]
|
|
154
|
+
✅ Now PASS: [N] (bugs RESOLVED)
|
|
155
|
+
❌ Still FAIL: [N] (bugs remain OPEN)
|
|
156
|
+
⏭ Skipped (Manual): [N]
|
|
157
|
+
|
|
158
|
+
Bugs updated:
|
|
159
|
+
✅ RESOLVED: BUG-001, BUG-003
|
|
160
|
+
🔴 Still OPEN: BUG-002, BUG-004
|
|
161
|
+
|
|
162
|
+
[Nếu còn critical/high bugs open:]
|
|
163
|
+
→ Review bugs: bugs/
|
|
164
|
+
→ Dev cần fix thêm: [list bugs còn open]
|
|
165
|
+
→ Type RETEST: [TC_ID] when dev fixes again
|
|
166
|
+
|
|
167
|
+
[Nếu tất cả critical/high bugs đã resolved:]
|
|
168
|
+
→ All critical/high issues resolved! ✅
|
|
169
|
+
→ Type APPROVED to proceed to Gate 4 (Test Report)
|
|
170
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Loop Continuation
|
|
176
|
+
|
|
177
|
+
Gate 3 loop tiếp tục cho đến khi:
|
|
178
|
+
- **Điều kiện kết thúc loop:** Tất cả Critical và High bugs đã RESOLVED và pass RETEST
|
|
179
|
+
- **Medium/Low bugs:** TESTER có thể chọn defer (không bắt buộc phải pass trước Gate 4)
|
|
180
|
+
- **TESTER gõ `APPROVED`** → Gate 4 bắt đầu (invoke `generate-test-report` skill)
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Mandatory Rules
|
|
185
|
+
|
|
186
|
+
- ✅ **PHẢI** re-run Dev Artifacts Check trước mỗi RETEST (kể cả delta = 0)
|
|
187
|
+
- ✅ **PHẢI** cập nhật bug status sau mỗi RETEST
|
|
188
|
+
- ✅ Evidence của các run phải được giữ lại (không xóa)
|
|
189
|
+
- ❌ **KHÔNG** tự động chuyển sang Gate 4 — chỉ khi TESTER gõ APPROVED
|
|
190
|
+
- ❌ **KHÔNG** skip delta analysis kể cả khi TESTER nói "chỉ 1 dòng fix"
|
|
191
|
+
- ✅ Manual TCs → nhắc TESTER test thủ công, không bỏ qua
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: script-sync
|
|
3
|
+
description: Sync test cases với Playwright scripts theo cơ chế hash. Với mỗi TC_ID trong TC file, kiểm tra script hiện tại bằng @tc-hash comment — gen mới nếu chưa có, update nếu TC thay đổi, skip nếu không đổi. Dùng Playwright MCP để lấy selector thật khi gen/update.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, mcp__playwright__browser_navigate, mcp__playwright__browser_snapshot, mcp__playwright__browser_generate_locator, mcp__playwright__browser_click, mcp__playwright__browser_type, mcp__playwright__browser_close
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Skill: script-sync
|
|
8
|
+
|
|
9
|
+
Sync test cases (từ TC file `.md`) với Playwright spec files, sử dụng **hash-based change detection**
|
|
10
|
+
để chỉ gen/update những TC thực sự thay đổi — tránh overwrite script đang chạy tốt.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Input
|
|
15
|
+
|
|
16
|
+
Được gọi từ `execute-flow` skill (Gate 2) với context:
|
|
17
|
+
|
|
18
|
+
- `tcFile`: path đến TC file markdown (vd `testcases/AD10.md`)
|
|
19
|
+
- `repo`: tên repo (vd `repo-fe`)
|
|
20
|
+
- `screenId`: mã màn hình, always lowercase (vd `ad10`, not `AD10`) — directory paths use lowercase; spec file name `{ScreenID}.spec.ts` remains uppercase
|
|
21
|
+
- `baseUrl`: URL của app để Playwright MCP snapshot
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Hash Computation
|
|
26
|
+
|
|
27
|
+
**Công thức:** `SHA1(TC_ID + "|" + Steps + "|" + Expected Result)` → lấy 8 ký tự đầu.
|
|
28
|
+
|
|
29
|
+
Các trường lấy từ TC file:
|
|
30
|
+
- `TC_ID`: cột "Test Case ID"
|
|
31
|
+
- `Steps`: cột "Steps" (giữ nguyên text, bao gồm số thứ tự)
|
|
32
|
+
- `Expected Result`: cột "Expected Result"
|
|
33
|
+
|
|
34
|
+
Không tính vào hash: `Severity`, `Pre-condition`, `Data Test`, `Ticket ID`, `Comment`, `R1/R2 columns`.
|
|
35
|
+
|
|
36
|
+
**Mục đích:** Hash chỉ thay đổi khi steps hoặc expected result thay đổi — sửa comment/severity không trigger update.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Spec File Structure
|
|
41
|
+
|
|
42
|
+
Mỗi TC trong spec file có metadata comment ngay trước `test()`:
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// @screen-id: AD10
|
|
46
|
+
// @screen-name: Create Product
|
|
47
|
+
// @repo: repo-fe
|
|
48
|
+
// @screen-url: /admin/products/create
|
|
49
|
+
// @generated: YYYY-MM-DD
|
|
50
|
+
|
|
51
|
+
import { test, expect } from '../../shared/fixtures/test'
|
|
52
|
+
import { AD10Page } from '../pages/AD10Page'
|
|
53
|
+
|
|
54
|
+
test.describe('AD10 - Create Product', () => {
|
|
55
|
+
|
|
56
|
+
// @tc-hash: a3f9b2c1
|
|
57
|
+
// @tc-id: AD10_001
|
|
58
|
+
test('AD10_001 - Truy cập trực tiếp qua URL khi chưa đăng nhập', async ({ page }) => {
|
|
59
|
+
// ...
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// @tc-hash: d7e2f4a9
|
|
63
|
+
// @tc-id: AD10_002
|
|
64
|
+
test('AD10_002 - Truy cập trực tiếp qua URL khi đã đăng nhập', async ({ page }) => {
|
|
65
|
+
// ...
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
})
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Sync Algorithm
|
|
74
|
+
|
|
75
|
+
### Bước 1: Parse TC file
|
|
76
|
+
|
|
77
|
+
Đọc TC file, extract từ Section 3 (Danh sách Test Cases Chi Tiết):
|
|
78
|
+
- TC_ID, Test Case Name, Steps, Expected Result, Severity
|
|
79
|
+
|
|
80
|
+
Nhận diện **Manual TCs** — các TC không thể automation:
|
|
81
|
+
- Steps đề cập "kiểm tra DB", "kiểm tra email", "kiểm tra file system"
|
|
82
|
+
- Steps quá mơ hồ: "Quan sát giao diện", "Kiểm tra layout, màu sắc"
|
|
83
|
+
- Steps yêu cầu hành động ngoài browser: restart server, check log file
|
|
84
|
+
|
|
85
|
+
### Bước 2: Scan spec file hiện tại
|
|
86
|
+
|
|
87
|
+
Tìm `ak-test/{repo}/scripts/{screenId}/{ScreenID}.spec.ts`.
|
|
88
|
+
|
|
89
|
+
Nếu tồn tại: đọc file, extract tất cả cặp `@tc-hash` + `@tc-id` bằng regex:
|
|
90
|
+
```
|
|
91
|
+
// @tc-hash: ([a-f0-9]{8})
|
|
92
|
+
// @tc-id: ([A-Za-z0-9_]+)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Tạo map: `{ [TC_ID]: hash }` từ spec file hiện tại.
|
|
96
|
+
|
|
97
|
+
### Bước 3: Classify từng TC
|
|
98
|
+
|
|
99
|
+
Với mỗi TC trong TC file:
|
|
100
|
+
|
|
101
|
+
| Điều kiện | Status | Hành động |
|
|
102
|
+
|-----------|--------|-----------|
|
|
103
|
+
| TC là Manual TC | `manual` | Bỏ qua, đánh dấu Untest |
|
|
104
|
+
| Không có trong spec file | `new` | Gen script mới |
|
|
105
|
+
| Có trong spec file, hash khớp | `skipped` | Không làm gì |
|
|
106
|
+
| Có trong spec file, hash khác | `updated` | Update test block |
|
|
107
|
+
|
|
108
|
+
### Bước 4: Gen script cho TCs có status `new`
|
|
109
|
+
|
|
110
|
+
Với mỗi TC cần gen mới:
|
|
111
|
+
|
|
112
|
+
1. Tính hash mới: `SHA1(TC_ID + "|" + Steps + "|" + Expected Result)[:8]`
|
|
113
|
+
2. Dùng Playwright MCP để lấy selectors thật:
|
|
114
|
+
- `mcp__playwright__browser_navigate` → `baseUrl + screenUrl`
|
|
115
|
+
- `mcp__playwright__browser_snapshot` → lấy accessibility tree
|
|
116
|
+
- Với từng element trong Steps: `mcp__playwright__browser_generate_locator`
|
|
117
|
+
3. Sinh test block với metadata comments:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// @tc-hash: {hash}
|
|
121
|
+
// @tc-id: {TC_ID}
|
|
122
|
+
test('{TC_ID} - {Test Case Name}', async ({ page }) => {
|
|
123
|
+
const pageObj = new {ScreenID}Page(page)
|
|
124
|
+
// Step 1: {step text}
|
|
125
|
+
await pageObj.{action}()
|
|
126
|
+
// Step 2: {step text}
|
|
127
|
+
await pageObj.{action}()
|
|
128
|
+
// Expected: {expected result}
|
|
129
|
+
await expect(page.{locator}).{assertion}
|
|
130
|
+
})
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
4. Nếu spec file chưa tồn tại: tạo file mới với file header + describe wrapper + test block.
|
|
134
|
+
5. Nếu spec file đã tồn tại: append test block vào trước closing `})` của `test.describe`.
|
|
135
|
+
6. Nếu `{ScreenID}Page.ts` chưa tồn tại: tạo Page Object với locators cho các elements đã snapshot.
|
|
136
|
+
|
|
137
|
+
**File header khi tạo spec mới:**
|
|
138
|
+
```typescript
|
|
139
|
+
// @screen-id: {ScreenID}
|
|
140
|
+
// @screen-name: {Screen Name}
|
|
141
|
+
// @repo: {repo}
|
|
142
|
+
// @screen-url: {url path}
|
|
143
|
+
// @generated: {YYYY-MM-DD}
|
|
144
|
+
|
|
145
|
+
import { test, expect } from '../../shared/fixtures/test'
|
|
146
|
+
import { {ScreenID}Page } from '../pages/{ScreenID}Page'
|
|
147
|
+
|
|
148
|
+
test.describe('{ScreenID} - {Screen Name}', () => {
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Bước 5: Update test block cho TCs có status `updated`
|
|
152
|
+
|
|
153
|
+
1. Tính hash mới
|
|
154
|
+
2. Snapshot DOM với Playwright MCP (các element có thể thay đổi selector nếu TC đổi)
|
|
155
|
+
3. Tìm block cũ trong spec file bằng pattern:
|
|
156
|
+
```
|
|
157
|
+
// @tc-hash: {old-hash}\n // @tc-id: {TC_ID}\n test(...)
|
|
158
|
+
```
|
|
159
|
+
4. Replace toàn bộ block cũ (từ `// @tc-hash` đến closing `})` của test) bằng block mới
|
|
160
|
+
|
|
161
|
+
### Bước 6: Xử lý TCs không gen được
|
|
162
|
+
|
|
163
|
+
| Lý do | Marker |
|
|
164
|
+
|-------|--------|
|
|
165
|
+
| TC manual (DB/email/file check) | `[MANUAL]` — Untest |
|
|
166
|
+
| Steps mơ hồ, không map được selector | `[NEEDS_CLARIFY]` — hỏi tester |
|
|
167
|
+
| Playwright MCP không snapshot được (iframe, native dialog) | `[BLOCKED: {lý do}]` |
|
|
168
|
+
| Race condition (double-click, network timing) | `[BLOCKED: timing-dependent]` |
|
|
169
|
+
|
|
170
|
+
Với `[NEEDS_CLARIFY]`: hỏi tester rõ element nào cần tương tác, sau đó gen.
|
|
171
|
+
|
|
172
|
+
### Bước 7: Đóng browser
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
mcp__playwright__browser_close
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Output Summary
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
📊 SCRIPT SYNC SUMMARY — {ScreenID}
|
|
184
|
+
|
|
185
|
+
✅ Gen mới: {N} TCs → {ScreenID}.spec.ts
|
|
186
|
+
🔄 Updated: {N} TCs → hash refreshed
|
|
187
|
+
⏭️ Skipped: {N} TCs → không đổi
|
|
188
|
+
⚠️ Manual: {N} TCs → {TC_IDs} (lý do)
|
|
189
|
+
❌ Blocked: {N} TCs → {TC_IDs} (lý do)
|
|
190
|
+
|
|
191
|
+
→ Script: ak-test/{repo}/scripts/{screenId}/{ScreenID}.spec.ts
|
|
192
|
+
→ Page Object: ak-test/{repo}/scripts/pages/{ScreenID}Page.ts
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Trả về danh sách kết quả cho `execute-flow`:
|
|
196
|
+
- Danh sách TC_IDs có thể chạy automation (gen mới + updated + skipped)
|
|
197
|
+
- Danh sách TC_IDs manual (Untest)
|
|
198
|
+
- Danh sách TC_IDs blocked (Pending)
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Mandatory Rules
|
|
203
|
+
|
|
204
|
+
- ❌ **Không bao giờ bịa selector** — phải dùng Playwright MCP snapshot
|
|
205
|
+
- ❌ **Không overwrite** test block có hash match — skip hoàn toàn
|
|
206
|
+
- ✅ Ưu tiên locator: `getByRole` > `getByLabel` > `getByPlaceholder` > `getByText` > `getByTestId` > CSS
|
|
207
|
+
- ✅ Không tạo lại `BasePage.ts` / `fixtures/test.ts` nếu đã tồn tại
|
|
208
|
+
- ✅ Viết test names và comments bằng tiếng Việt
|