@anhth2/spec-driven-dev-plugin 0.10.0 → 0.12.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/commands/debug.md +43 -8
- package/commands/define-product.md +43 -8
- package/commands/dev-gen-test.md +44 -9
- package/commands/dev-gen-test.tmpl +1 -1
- package/commands/dev-run-test.md +48 -10
- package/commands/dev-run-test.tmpl +5 -2
- package/commands/dev-smoke-test.md +43 -8
- package/commands/fix-bug.md +79 -14
- package/commands/fix-bug.tmpl +36 -6
- package/commands/generate-bdd.md +49 -10
- package/commands/generate-bdd.tmpl +6 -2
- package/commands/generate-code.md +44 -9
- package/commands/generate-code.tmpl +1 -1
- package/commands/generate-design-spec.md +43 -8
- package/commands/generate-prd.md +43 -8
- package/commands/generate-spec-manifest.md +43 -8
- package/commands/generate-tech-docs.md +43 -8
- package/commands/learn.md +43 -8
- package/commands/propose-scenario.md +74 -19
- package/commands/propose-scenario.tmpl +31 -11
- package/commands/qc-analyze.md +534 -0
- package/commands/qc-analyze.tmpl +86 -0
- package/commands/qc-design-test.md +515 -0
- package/commands/qc-design-test.tmpl +67 -0
- package/commands/qc-plan.md +497 -0
- package/commands/qc-plan.tmpl +49 -0
- package/commands/qc-report.md +508 -0
- package/commands/qc-report.tmpl +60 -0
- package/commands/qc-review.md +501 -0
- package/commands/qc-review.tmpl +53 -0
- package/commands/qc-run-test.md +549 -0
- package/commands/qc-run-test.tmpl +83 -0
- package/commands/refine-prd.md +43 -8
- package/commands/report-bug.md +59 -10
- package/commands/report-bug.tmpl +16 -2
- package/commands/review-code.md +43 -8
- package/commands/review-context.md +43 -8
- package/commands/review-tech-docs.md +43 -8
- package/commands/setup-ai-first.md +7 -0
- package/commands/sync.md +19 -9
- package/commands/sync.tmpl +12 -9
- package/commands/update-framework.md +7 -0
- package/commands/validate-traces.md +67 -12
- package/commands/validate-traces.tmpl +24 -4
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/debug.md +43 -8
- package/core/commands/define-product.md +43 -8
- package/core/commands/dev-gen-test.md +44 -9
- package/core/commands/dev-run-test.md +48 -10
- package/core/commands/dev-smoke-test.md +43 -8
- package/core/commands/fix-bug.md +79 -14
- package/core/commands/generate-bdd.md +49 -10
- package/core/commands/generate-code.md +44 -9
- package/core/commands/generate-design-spec.md +43 -8
- package/core/commands/generate-prd.md +43 -8
- package/core/commands/generate-spec-manifest.md +43 -8
- package/core/commands/generate-tech-docs.md +43 -8
- package/core/commands/learn.md +43 -8
- package/core/commands/propose-scenario.md +74 -19
- package/core/commands/qc-analyze.md +534 -0
- package/core/commands/qc-design-test.md +515 -0
- package/core/commands/qc-plan.md +497 -0
- package/core/commands/qc-report.md +508 -0
- package/core/commands/qc-review.md +501 -0
- package/core/commands/qc-run-test.md +549 -0
- package/core/commands/refine-prd.md +43 -8
- package/core/commands/report-bug.md +59 -10
- package/core/commands/review-code.md +43 -8
- package/core/commands/review-context.md +43 -8
- package/core/commands/review-tech-docs.md +43 -8
- package/core/commands/setup-ai-first.md +7 -0
- package/core/commands/sync.md +19 -9
- package/core/commands/update-framework.md +7 -0
- package/core/commands/validate-traces.md +67 -12
- package/core/modules/qc-playwright/stack-profile.yaml +65 -0
- package/core/skills/code/SKILL.md +50 -8
- package/core/skills/debug/SKILL.md +57 -8
- package/core/skills/design-spec/SKILL.md +43 -8
- package/core/skills/discovery/SKILL.md +43 -8
- package/core/skills/prd/SKILL.md +14 -0
- package/core/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/core/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/core/skills/qc/qa-analyst/business-rules.md +59 -0
- package/core/skills/qc/qa-analyst/data-flow.md +64 -0
- package/core/skills/qc/qa-analyst/spec-breakdown.md +61 -0
- package/core/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/core/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/core/skills/qc/qa-designer/functional/api.md +45 -0
- package/core/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/core/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/core/skills/qc/qa-designer/integration/api.md +42 -0
- package/core/skills/qc/qa-designer/integration/db.md +39 -0
- package/core/skills/qc/qa-designer/integration/gui.md +40 -0
- package/core/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/core/skills/qc/qa-designer/non-functional.md +40 -0
- package/core/skills/qc/qa-planner/test-plan.md +120 -0
- package/core/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/core/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/core/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/core/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/core/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/core/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/core/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/core/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/core/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/core/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/core/skills/qc/qa-runner/e2e.md +49 -0
- package/core/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/core/skills/qc/qa-runner/functional/api.md +35 -0
- package/core/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/core/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/core/skills/qc/qa-runner/integration.md +47 -0
- package/core/skills/qc/qa-runner/non-functional.md +49 -0
- package/core/skills/qc/qa-runner/report/report.md +37 -0
- package/core/skills/setup-ai-first/SKILL.md +7 -0
- package/core/skills/spec/SKILL.md +14 -0
- package/core/skills/test/SKILL.md +93 -16
- package/core/steps/context-loader.md +36 -8
- package/core/steps/report-footer.md +7 -0
- package/core/templates/project-context.yaml +27 -1
- package/docs/01-getting-started/README.md +19 -0
- package/docs/01-getting-started/core-concepts.md +102 -0
- package/docs/01-getting-started/installation.md +156 -0
- package/docs/01-getting-started/quickstart.md +85 -0
- package/docs/02-guides/README.md +27 -0
- package/docs/02-guides/developer/README.md +46 -0
- package/docs/02-guides/developer/bdd-and-trace.md +123 -0
- package/docs/02-guides/developer/commands.md +76 -0
- package/docs/02-guides/developer/pr-checklist.md +15 -0
- package/docs/02-guides/developer/scenarios.md +448 -0
- package/docs/02-guides/developer/workflow.md +61 -0
- package/docs/02-guides/product-owner/README.md +77 -0
- package/docs/02-guides/product-owner/commands.md +30 -0
- package/docs/02-guides/product-owner/handoff-checklist.md +42 -0
- package/docs/02-guides/product-owner/prd-writing-rules.md +45 -0
- package/docs/02-guides/product-owner/scenarios.md +357 -0
- package/docs/02-guides/qc-automation.md +157 -0
- package/docs/02-guides/tester/README.md +74 -0
- package/docs/02-guides/tester/bug-reporting.md +117 -0
- package/docs/02-guides/tester/reading-specs.md +79 -0
- package/docs/02-guides/tester/scenarios.md +186 -0
- package/docs/02-guides/tester/spec-manifest.md +124 -0
- package/docs/02-guides/tester/test-checklist.md +31 -0
- package/docs/02-guides/tester/workflow.md +80 -0
- package/docs/03-concepts/README.md +19 -0
- package/docs/03-concepts/architecture.md +245 -0
- package/docs/03-concepts/pipeline.md +262 -0
- package/docs/03-concepts/traceability.md +149 -0
- package/docs/04-operations/README.md +33 -0
- package/docs/04-operations/bug-flow.md +362 -0
- package/docs/04-operations/publishing.md +137 -0
- package/docs/04-operations/sync-and-update.md +365 -0
- package/docs/05-reference/README.md +29 -0
- package/docs/05-reference/commands.md +229 -0
- package/docs/05-reference/modules.md +110 -0
- package/docs/05-reference/trace-schema.md +152 -0
- package/docs/README.md +51 -0
- package/modules/qc-playwright/stack-profile.yaml +65 -0
- package/package.json +2 -2
- package/skills/code/SKILL.md +50 -8
- package/skills/debug/SKILL.md +57 -8
- package/skills/design-spec/SKILL.md +43 -8
- package/skills/discovery/SKILL.md +43 -8
- package/skills/prd/SKILL.md +14 -0
- package/skills/qc/qa-analyst/DOC_GAPS.template.md +63 -0
- package/skills/qc/qa-analyst/acceptance-criteria.md +60 -0
- package/skills/qc/qa-analyst/business-rules.md +59 -0
- package/skills/qc/qa-analyst/data-flow.md +64 -0
- package/skills/qc/qa-analyst/spec-breakdown.md +61 -0
- package/skills/qc/qa-designer/e2e/journey.md +41 -0
- package/skills/qc/qa-designer/exploratory/charter.md +68 -0
- package/skills/qc/qa-designer/exploratory/explore-to-functional.md +43 -0
- package/skills/qc/qa-designer/functional/api.md +45 -0
- package/skills/qc/qa-designer/functional/gui-feature.md +46 -0
- package/skills/qc/qa-designer/functional/gui-screen.md +52 -0
- package/skills/qc/qa-designer/integration/api.md +42 -0
- package/skills/qc/qa-designer/integration/db.md +39 -0
- package/skills/qc/qa-designer/integration/gui.md +40 -0
- package/skills/qc/qa-designer/integration/kafka.md +40 -0
- package/skills/qc/qa-designer/non-functional.md +40 -0
- package/skills/qc/qa-planner/test-plan.md +120 -0
- package/skills/qc/qa-reviewer/script/e2e.md +87 -0
- package/skills/qc/qa-reviewer/script/exploratory.md +45 -0
- package/skills/qc/qa-reviewer/script/functional.md +101 -0
- package/skills/qc/qa-reviewer/script/integration.md +91 -0
- package/skills/qc/qa-reviewer/script/non-functional.md +126 -0
- package/skills/qc/qa-reviewer/test-case/e2e.md +73 -0
- package/skills/qc/qa-reviewer/test-case/exploratory.md +43 -0
- package/skills/qc/qa-reviewer/test-case/functional.md +76 -0
- package/skills/qc/qa-reviewer/test-case/integration.md +69 -0
- package/skills/qc/qa-reviewer/test-case/non-functional.md +73 -0
- package/skills/qc/qa-runner/e2e.md +49 -0
- package/skills/qc/qa-runner/exploratory/session.md +36 -0
- package/skills/qc/qa-runner/functional/api.md +35 -0
- package/skills/qc/qa-runner/functional/gui-feature.md +51 -0
- package/skills/qc/qa-runner/functional/gui-screen.md +55 -0
- package/skills/qc/qa-runner/integration.md +47 -0
- package/skills/qc/qa-runner/non-functional.md +49 -0
- package/skills/qc/qa-runner/report/report.md +37 -0
- package/skills/setup-ai-first/SKILL.md +7 -0
- package/skills/spec/SKILL.md +14 -0
- package/skills/test/SKILL.md +93 -16
- package/steps/context-loader.md +36 -8
- package/steps/report-footer.md +7 -0
- package/templates/project-context.yaml +27 -1
- package/ARCHITECTURE.md +0 -258
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Test Case — Functional GUI Feature (đa màn hình)
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa** để viết TC functional cho feature có luồng span ≥ 2 màn hình
|
|
10
|
+
(wizard, master-detail, popup→list). Chỉ cần load file này.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- "viết test case cho feature [X]" mà flow đi qua nhiều màn/route, truyền state giữa bước
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Gọn trong 1 màn → `functional/gui-screen` · API thuần → `functional/api`
|
|
17
|
+
- Hành trình nghiệp vụ đầu-cuối + đồng bộ hệ thống → `e2e/journey`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Format file `TC_<FEATURE>.md` (bắt buộc)
|
|
22
|
+
- 1 file/feature · mỗi TC **1 concept** · metadata **list** (không bảng/emoji): Title · Feature ·
|
|
23
|
+
Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
|
|
24
|
+
- **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; không có BR → `⚠️ Chưa có Business Rule`.
|
|
25
|
+
- **🚫 Block:** TC phụ thuộc gap vẫn viết đủ + `[GAP-xx](DOC_GAPS.md) — lý do`.
|
|
26
|
+
- **Test Data:** dạng **list** (không bảng). **Steps:** `[Action]`/`[Verify]`, không `*Expected:*`/bước. **Expected:** 1 bullet cụ thể.
|
|
27
|
+
- Cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · không `#### Python Test Mapping` · bỏ nội dung gạch ngang.
|
|
28
|
+
|
|
29
|
+
## Kỹ thuật áp dụng
|
|
30
|
+
- **Use Case** cho flow tổng: main (P0) → alternate (P1) → exception (negative).
|
|
31
|
+
- **Decision Table** cho điểm rẽ nhánh (điều kiện qua bước/nhảy màn).
|
|
32
|
+
- **State Transition** nếu có trạng thái xuyên bước (draft→submitted…).
|
|
33
|
+
- **EP/BVA** cho field trên từng màn.
|
|
34
|
+
|
|
35
|
+
## Phase 1 — Clarify
|
|
36
|
+
Liệt kê các màn/route + thứ tự điều hướng · state/dữ liệu truyền giữa màn (giữ/reset khi back) ·
|
|
37
|
+
điểm rẽ nhánh · platform · CRUD scope · cleanup.
|
|
38
|
+
|
|
39
|
+
## Phase 2 — Write
|
|
40
|
+
- Nhóm TC: GUI từng màn → **điều hướng** (forward/back/giữ-reset state, deep-link) → happy path xuyên flow → negative.
|
|
41
|
+
- Đặc biệt phủ: back có mất dữ liệu không, dữ liệu bắt buộc để qua bước sau, hủy giữa flow.
|
|
42
|
+
- Mỗi TC bám khối Format; trace BR; gap chặn → 🚫 Block.
|
|
43
|
+
|
|
44
|
+
## Output
|
|
45
|
+
File `TC_<FEATURE>.md` trong `{paths.qc_dir}/{UC-ID}/test-cases/`. In bảng TC + Trace matrix + bảng TC block.
|
|
46
|
+
Bàn giao `qa-reviewer` (test-case).
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Test Case — Functional GUI Screen (1 màn hình)
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa** để viết TC functional cho 1 màn hình đơn lẻ (web/mobile). Chỉ cần load file này.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "viết test case cho màn hình [X]" — feature gọn trong 1 screen (1 page web / 1 Activity/VC)
|
|
13
|
+
|
|
14
|
+
## Khi KHÔNG trigger
|
|
15
|
+
- Flow span ≥ 2 màn → `functional/gui-feature`
|
|
16
|
+
- API không qua UI → `functional/api`
|
|
17
|
+
- Tích hợp 2+ module → `integration/*` · hành trình đầu-cuối → `e2e/journey`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Format file `TC_<FEATURE>.md` (bắt buộc)
|
|
22
|
+
- 1 file/feature · mỗi TC **1 concept** · metadata **list** (mỗi trường 1 dòng, không bảng/emoji):
|
|
23
|
+
Title · Feature · Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
|
|
24
|
+
- **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; TC không có BR → `⚠️ Chưa có Business Rule`.
|
|
25
|
+
- **🚫 Block:** TC phụ thuộc gap **vẫn viết đủ** + `[GAP-xx](DOC_GAPS.md) — lý do`; chưa chạy tới khi gap Answered.
|
|
26
|
+
- **Test Data:** dạng **list** (`- **Trường:** giá trị`), không bảng.
|
|
27
|
+
- **Test Steps:** `**[Action]**` / `**[Verify]**`, KHÔNG `- *Expected:*` sau bước. **Expected:** 1 bullet cụ thể (không ✅/❌).
|
|
28
|
+
- Phân nhóm GUI/Functional · cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · KHÔNG `#### Python Test Mapping` · bỏ nội dung gạch ngang.
|
|
29
|
+
|
|
30
|
+
## Kỹ thuật áp dụng
|
|
31
|
+
- Field có ràng buộc (độ dài/số/ngày) → **EP** (mỗi phân vùng 1 TC, tag `ep`) + **BVA** (4 TC min−1/min/max/max+1, tag `bva`).
|
|
32
|
+
- Logic nhiều điều kiện / cascade dropdown / permission → **Decision Table** (mỗi rule = 1 TC).
|
|
33
|
+
- Element/đối tượng có trạng thái enabled/disabled, vòng đời → **State Transition** (chuyển đổi hợp lệ + cấm).
|
|
34
|
+
- Luồng thao tác trên màn → **Use Case** (main P0 → alternate P1 → exception negative).
|
|
35
|
+
|
|
36
|
+
## Phase 1 — Clarify
|
|
37
|
+
Platform (web Playwright/mobile) · screen+route · domain (form-crud/listing/auth/settings) · CRUD scope ·
|
|
38
|
+
mutating actions OK? · cleanup policy. Thiếu → hỏi trước khi viết.
|
|
39
|
+
|
|
40
|
+
## Phase 2 — Explore
|
|
41
|
+
Dump element: buttons, inputs, dropdowns, table headers, modal states. Mỗi element →
|
|
42
|
+
chức năng (input/action/display/nav) · constraint (required/min-max/format/enabled) · state change · câu hỏi "what if".
|
|
43
|
+
|
|
44
|
+
## Phase 3 — Write
|
|
45
|
+
- **Nhóm 1 GUI:** title → buttons → inputs → date picker → dropdowns → bảng (header→row count→checkbox→từng cột) → pagination.
|
|
46
|
+
- **Nhóm 2 Functional:** filter (đơn→combined) → search → reset → pagination → data integrity → actions → negative.
|
|
47
|
+
- Phủ implicit: rate limit, concurrent, session, empty state, max data, special chars.
|
|
48
|
+
- Mỗi TC bám khối Format trên; trace BR; TC chặn bởi gap → 🚫 Block.
|
|
49
|
+
|
|
50
|
+
## Output
|
|
51
|
+
File `TC_<FEATURE>.md` trong `{paths.qc_dir}/{UC-ID}/test-cases/`. In bảng `TC_ID | Title | Priority | Tags | Trace`
|
|
52
|
+
+ Trace matrix + bảng TC block. Bàn giao `qa-reviewer` (test-case).
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Test Case — Integration API
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa** để viết TC tích hợp qua API: caller → API → service/DB/hệ thống ngoài,
|
|
10
|
+
verify luồng dữ liệu & contract giữa các thành phần. Chỉ cần load file này.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- Test điểm tích hợp API ↔ service backend / hệ thống ngoài (vd LMS ↔ CRM)
|
|
14
|
+
- Verify dữ liệu sau gọi API lan tới chặng tiếp (DB/event)
|
|
15
|
+
|
|
16
|
+
## Khi KHÔNG trigger
|
|
17
|
+
- Chỉ verify request/response 1 endpoint → `functional/api`
|
|
18
|
+
- Verify riêng trạng thái DB → `integration/db` · message/event → `integration/kafka`
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Format file TC (bắt buộc)
|
|
23
|
+
- Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAPS.md)` (TC chặn vẫn viết đủ).
|
|
24
|
+
- **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu rõ chặng verify (response/bản ghi/event).
|
|
25
|
+
- Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
|
|
26
|
+
|
|
27
|
+
## Kỹ thuật áp dụng
|
|
28
|
+
- **Interface/Contract:** verify schema request/response giữa caller↔callee.
|
|
29
|
+
- **Data flow verification:** theo sơ đồ data flow, mỗi chặng verify dữ liệu biến đổi đúng.
|
|
30
|
+
- **Decision Table** khi định tuyến/đồng bộ phụ thuộc nhiều điều kiện.
|
|
31
|
+
- **Error/Retry/Timeout/Concurrency:** failure point, thao tác đồng thời (sinh số không trùng).
|
|
32
|
+
|
|
33
|
+
## Phase 1 — Clarify
|
|
34
|
+
Chuỗi tích hợp (caller→API→service/DB/API ngoài) · contract mỗi interface · điều kiện định tuyến/đồng bộ
|
|
35
|
+
(vd điều kiện đổ CRM) · failure point (timeout, lỗi service ngoài, partial commit).
|
|
36
|
+
|
|
37
|
+
## Phase 2 — Write
|
|
38
|
+
Nhóm TC: happy (dữ liệu đúng đầu→cuối) → contract negative (input sai → mã lỗi đúng) → failure/timeout/retry
|
|
39
|
+
→ concurrency → điều kiện đồng bộ (đổ/không đổ). Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
40
|
+
|
|
41
|
+
## Output
|
|
42
|
+
File TC integration trong `{paths.qc_dir}/{UC-ID}/test-cases/`. Ưu tiên P0 cho định tuyến & tiền-dữ liệu. Bàn giao `qa-reviewer`.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Test Case — Integration DB
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa** để viết TC verify **trạng thái dữ liệu trong DB** sau action:
|
|
10
|
+
insert/update/soft-delete đúng giá trị, side-effect, toàn vẹn. Chỉ cần load file này.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- Kiểm tra bản ghi DB sau thao tác (tạo ticket → ghi đúng bảng/cột); soft-delete, default, audit log
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Chỉ verify response API → `functional/api`/`integration/api` · message/event → `integration/kafka`
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Format file TC (bắt buộc)
|
|
21
|
+
- Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAPS.md)`.
|
|
22
|
+
- **Test Data** dạng list (giá trị input) · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu rõ **bảng.cột = giá trị**.
|
|
23
|
+
- Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
|
|
24
|
+
|
|
25
|
+
## Kỹ thuật áp dụng
|
|
26
|
+
- **State/DB verification:** verify bản ghi sau action (giá trị từng cột, flag, timestamp).
|
|
27
|
+
- **Data flow:** dữ liệu từ input lan tới DB đúng. **Decision Table** nếu ghi phụ thuộc điều kiện.
|
|
28
|
+
|
|
29
|
+
## Phase 1 — Clarify
|
|
30
|
+
Bảng & cột bị ảnh hưởng + giá trị kỳ vọng · loại thao tác (insert/update/soft-delete/cascade) ·
|
|
31
|
+
side-effect (audit log, timestamp, người tạo/sửa) · cleanup/rollback dữ liệu test.
|
|
32
|
+
|
|
33
|
+
## Phase 2 — Write
|
|
34
|
+
Nhóm TC: ghi đúng giá trị (happy) → default/null đúng → update không đụng cột khác → soft-delete (flag đúng)
|
|
35
|
+
→ audit log → ràng buộc/unique (negative). Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
36
|
+
|
|
37
|
+
## Output
|
|
38
|
+
File TC trong `{paths.qc_dir}/{UC-ID}/test-cases/`. Ghi rõ query kiểm tra DB + yêu cầu cleanup;
|
|
39
|
+
không hardcode ID, chuẩn bị/dọn data qua fixture. Bàn giao `qa-reviewer`.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Test Case — Integration GUI ↔ Backend
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa** để viết TC tích hợp UI ↔ backend: UI gọi API đúng, render đúng kết quả/
|
|
10
|
+
lỗi từ server, đồng bộ trạng thái hai chiều. Chỉ cần load file này.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- UI phản ánh đúng dữ liệu/lỗi backend (lookup, list, validate server-side); UI gọi đúng API + xử lý response
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Chỉ test layout/element tĩnh 1 màn → `functional/gui-screen`
|
|
17
|
+
- Chỉ test API không qua UI → `functional/api`/`integration/api`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Format file TC (bắt buộc)
|
|
22
|
+
- Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAPS.md)`.
|
|
23
|
+
- **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet (API liên quan + biểu hiện UI kỳ vọng).
|
|
24
|
+
- Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
|
|
25
|
+
|
|
26
|
+
## Kỹ thuật áp dụng
|
|
27
|
+
- **Data flow UI→API→UI:** verify request gửi đúng + render response đúng.
|
|
28
|
+
- **Error handling:** lỗi server (4xx/5xx) → message UI đúng. **State:** loading/empty/error.
|
|
29
|
+
|
|
30
|
+
## Phase 1 — Clarify
|
|
31
|
+
Điểm UI gọi backend (action→API) · mapping response→hiển thị (list/dropdown/message) ·
|
|
32
|
+
trạng thái loading/empty/error · debounce/cancel khi đổi input.
|
|
33
|
+
|
|
34
|
+
## Phase 2 — Write
|
|
35
|
+
Nhóm TC: UI render đúng dữ liệu backend (happy) → empty state → lỗi server → message đúng → loading state
|
|
36
|
+
→ đổi input reset/cancel request → đồng bộ sau action (tạo xong → list cập nhật). Locator ưu tiên data-testid/role.
|
|
37
|
+
Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
38
|
+
|
|
39
|
+
## Output
|
|
40
|
+
File TC trong `{paths.qc_dir}/{UC-ID}/test-cases/`. Mỗi TC nêu API liên quan + biểu hiện UI. Bàn giao `qa-reviewer`.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Test Case — Integration Kafka (Message/Event)
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa** để viết TC tích hợp qua Kafka: producer phát event đúng, consumer xử lý
|
|
10
|
+
đúng, đảm bảo ordering/idempotency/retry. Chỉ cần load file này.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- Action sinh event Kafka (vd tạo ticket → phát event sang service/CRM); verify topic/payload/thứ tự/khử trùng
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Tích hợp đồng bộ qua API → `integration/api` · verify DB → `integration/db`
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Format file TC (bắt buộc)
|
|
21
|
+
- Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAPS.md)`.
|
|
22
|
+
- **Test Data** dạng list (payload) · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu **topic + field payload / hành vi consumer**.
|
|
23
|
+
- Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
|
|
24
|
+
|
|
25
|
+
## Kỹ thuật áp dụng
|
|
26
|
+
- **Message/event:** verify topic, key, payload schema, điều kiện phát.
|
|
27
|
+
- **Ordering & idempotency:** thứ tự theo key, message trùng/out-of-order.
|
|
28
|
+
- **Error/Retry:** consumer lỗi → retry/DLQ.
|
|
29
|
+
|
|
30
|
+
## Phase 1 — Clarify
|
|
31
|
+
Topic/key/payload + điều kiện phát (khi nào phát/không) · consumer xử lý gì + side-effect + idempotent ·
|
|
32
|
+
yêu cầu ordering · xử lý trùng/out-of-order/lỗi (retry, DLQ).
|
|
33
|
+
|
|
34
|
+
## Phase 2 — Write
|
|
35
|
+
Nhóm TC: phát đúng topic+payload (happy) → điều kiện không phát → consumer xử lý đúng → message trùng (idempotent)
|
|
36
|
+
→ out-of-order → consumer lỗi → retry/DLQ → ordering theo key. Setup/teardown consumer test.
|
|
37
|
+
Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
38
|
+
|
|
39
|
+
## Output
|
|
40
|
+
File TC trong `{paths.qc_dir}/{UC-ID}/test-cases/`. Mỗi TC ghi topic, key, payload cần verify + hành vi consumer. Bàn giao `qa-reviewer`.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Test Case — Non-Functional
|
|
8
|
+
|
|
9
|
+
Skill **tự chứa** để viết TC phi chức năng: performance, security, accessibility, compatibility.
|
|
10
|
+
Trọng tâm "hệ thống hoạt động TỐT thế nào". Chỉ cần load file này.
|
|
11
|
+
|
|
12
|
+
## Khi nào trigger
|
|
13
|
+
- Yêu cầu hiệu năng/tải, bảo mật, accessibility, tương thích; feature có SLA, dữ liệu nhạy cảm, hoặc data lớn
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Kiểm thử chức năng theo đặc tả → `functional/*` · tích hợp module → `integration/*`
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Format file TC (bắt buộc)
|
|
21
|
+
- Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAPS.md)`.
|
|
22
|
+
- **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet có **ngưỡng đo cụ thể** (không "nhanh/ổn định").
|
|
23
|
+
- Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
|
|
24
|
+
|
|
25
|
+
## Kỹ thuật / loại
|
|
26
|
+
- **Performance:** response time dưới tải mục tiêu; danh sách lớn (max data); pagination; concurrency.
|
|
27
|
+
- **Security:** authZ/role (truy cập trái phép → chặn), injection, PII (SĐT) không lộ, session/timeout, rate limit.
|
|
28
|
+
- **Accessibility:** keyboard nav, focus, label/aria, contrast (WCAG).
|
|
29
|
+
- **Compatibility:** trình duyệt/thiết bị/độ phân giải mục tiêu.
|
|
30
|
+
|
|
31
|
+
## Phase 1 — Clarify
|
|
32
|
+
Loại non-functional + tiêu chí đo (ngưỡng cụ thể: thời gian, số user, WCAG level) · môi trường & công cụ
|
|
33
|
+
(load tool, scanner, axe/lighthouse) · dữ liệu/tải mẫu.
|
|
34
|
+
|
|
35
|
+
## Phase 2 — Write
|
|
36
|
+
Mỗi TC bám Format; **Expected có ngưỡng pass + công cụ đo**; đánh dấu TC cần môi trường/data đặc biệt.
|
|
37
|
+
Trace BR; gap chặn → 🚫 Block.
|
|
38
|
+
|
|
39
|
+
## Output
|
|
40
|
+
File TC non-functional trong `{paths.qc_dir}/{UC-ID}/test-cases/`. Mỗi TC ghi tiêu chí đo + ngưỡng + công cụ. Bàn giao `qa-reviewer`.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Lập Test Plan
|
|
8
|
+
|
|
9
|
+
Tổng hợp **output của qa-analyst** thành **Test Plan** cho một feature.
|
|
10
|
+
|
|
11
|
+
**Đầu vào (bắt buộc, chỉ 2 nguồn — đúng 2 file qa-analyst trả ra):**
|
|
12
|
+
1. `{paths.qc_dir}/{UC-ID}/REQUIREMENT_ANALYSIS.md` — chức năng, BR-xx, AC-xx, data flow (qa-analyst).
|
|
13
|
+
2. `{paths.qc_dir}/{UC-ID}/DOC_GAPS.md` — bảng gap GAP-xx, mức độ, gap Blocker (qa-analyst).
|
|
14
|
+
|
|
15
|
+
## Khi nào trigger
|
|
16
|
+
- "lập test plan cho [Feature]" / "viết test plan"
|
|
17
|
+
- Sau khi qa-analyst xong (đã có REQUIREMENT_ANALYSIS + DOC_GAPS)
|
|
18
|
+
- Trước khi qa-designer thiết kế chi tiết TC — test plan là khung định hướng
|
|
19
|
+
|
|
20
|
+
## Khi KHÔNG trigger
|
|
21
|
+
- Chưa có REQUIREMENT_ANALYSIS / DOC_GAPS → chạy qa-analyst trước
|
|
22
|
+
- Thiết kế test case chi tiết (.Test.md) → dùng qa-designer
|
|
23
|
+
- Bóc tách yêu cầu/spec, lập danh sách gap → dùng qa-analyst
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Phase 1 — Thu thập đầu vào
|
|
28
|
+
|
|
29
|
+
1. Đọc `REQUIREMENT_ANALYSIS.md`: nắm chức năng, các BR-xx và AC-xx, data flow,
|
|
30
|
+
integration/failure point.
|
|
31
|
+
2. Đọc `DOC_GAPS.md`: lấy danh sách gap, đặc biệt **gap Blocker còn Open** → đây là
|
|
32
|
+
nguồn cho cột "Phụ thuộc" và cho Entry criteria.
|
|
33
|
+
3. Map mỗi nhóm BR sang **layer test** của qa-designer: functional/gui-screen,
|
|
34
|
+
gui-feature, api, integration, e2e/journey, non-functional.
|
|
35
|
+
4. **Bỏ qua nội dung gạch ngang** (đã loại ở qa-analyst) — không đưa vào plan.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Phase 2 — Lập Test Plan
|
|
40
|
+
|
|
41
|
+
Điền đủ template bên dưới. Nguyên tắc:
|
|
42
|
+
- Mỗi **vùng test** map về BR-xx cụ thể, gắn **Layer + Loại test + Priority + ước lượng TC**;
|
|
43
|
+
hiển thị **rule chi tiết** ngay trong bảng (cột riêng, dùng `<br>` cho nhiều rule).
|
|
44
|
+
- **Priority theo rủi ro suy ra từ BR + gap:** core function / logic định tuyến / sinh
|
|
45
|
+
mã / tiền-dữ liệu = P0.
|
|
46
|
+
- Vùng/journey còn phụ thuộc **gap Blocker** → ghi rõ cột "Phụ thuộc" (GAP#); Entry
|
|
47
|
+
criteria yêu cầu đóng các gap đó trước khi thiết kế TC.
|
|
48
|
+
- Liệt kê **E2E journey** đầy đủ (mỗi journey: tiền điều kiện, kết quả/định tuyến kỳ
|
|
49
|
+
vọng, BR, phụ thuộc, priority) + bộ **verify point chung** sau submit.
|
|
50
|
+
- Mục Rủi ro: rút trực tiếp từ gap Blocker + các BR logic phức tạp.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Output — Template `TEST_PLAN.md`
|
|
55
|
+
|
|
56
|
+
Đặt tại `{paths.qc_dir}/{UC-ID}/TEST_PLAN.md`:
|
|
57
|
+
|
|
58
|
+
```markdown
|
|
59
|
+
# Test Plan – <Feature>
|
|
60
|
+
|
|
61
|
+
| Trường | Giá trị |
|
|
62
|
+
|---|---|
|
|
63
|
+
| Feature / Project / Module | … |
|
|
64
|
+
| Người lập | qa-planner |
|
|
65
|
+
| Ngày / Phiên bản | … |
|
|
66
|
+
| Nguồn | REQUIREMENT_ANALYSIS · DOC_GAPS |
|
|
67
|
+
|
|
68
|
+
## 1. Mục tiêu
|
|
69
|
+
Mục tiêu test của feature (1–3 câu).
|
|
70
|
+
|
|
71
|
+
## 2. Phạm vi
|
|
72
|
+
- **In scope:** chức năng/BR được test.
|
|
73
|
+
- **Out of scope:** phần để tài liệu/feature khác; nội dung gạch ngang đã loại.
|
|
74
|
+
|
|
75
|
+
## 3. Test items theo vùng & độ ưu tiên
|
|
76
|
+
Bảng — mỗi vùng kèm rule chi tiết + metadata:
|
|
77
|
+
|
|
78
|
+
| # | Vùng test | Rule chi tiết | Layer (qa-designer) | Loại test | Pri | Ước lượng |
|
|
79
|
+
|---|---|---|---|---|---|---|
|
|
80
|
+
| ① | <vùng> | **BR-xx:** … <br>**BR-yy:** … | functional/gui-screen | Functional/Negative | P0 | n |
|
|
81
|
+
| … | … | … | … | … | … | … |
|
|
82
|
+
|
|
83
|
+
> Tổng ước lượng sơ bộ: ~N test case (+ E2E).
|
|
84
|
+
|
|
85
|
+
### 3.1 Danh sách E2E đầy đủ
|
|
86
|
+
Verify points chung (sau Submit): V1 tạo thành công · V2 mã/ID đúng · V3 hiển thị danh
|
|
87
|
+
sách · V4… · Trục bao phủ: <các chiều tổ hợp>.
|
|
88
|
+
|
|
89
|
+
| ID | Journey | Tiền điều kiện | Kết quả kỳ vọng | BR | Phụ thuộc | Pri |
|
|
90
|
+
|---|---|---|---|---|---|---|
|
|
91
|
+
| E2E-XX-01 | … | … | … | BR-… | GAP# | P0 |
|
|
92
|
+
|
|
93
|
+
## 4. Cách tiếp cận (Test approach)
|
|
94
|
+
Kỹ thuật áp dụng: EP+BVA, Decision Table (cho logic điều kiện), state/lookup,
|
|
95
|
+
integration, negative/exploratory; tự động hoá theo `CLAUDE.md` (Playwright + pytest-playwright + Trace + pytest-html).
|
|
96
|
+
|
|
97
|
+
## 5. Tiêu chí Vào / Ra
|
|
98
|
+
- **Entry:** gap Blocker (trong DOC_GAPS) đã Answered; doc phụ thuộc sẵn sàng; môi trường + tài khoản role.
|
|
99
|
+
- **Exit:** pass P0=100%, P1≥95%; không còn defect Blocker/Critical; mọi BR/AC được trace; báo cáo pytest-html + Playwright Trace.
|
|
100
|
+
|
|
101
|
+
## 6. Rủi ro (risk-based)
|
|
102
|
+
| Rủi ro | Ảnh hưởng | Mức | Giảm thiểu |
|
|
103
|
+
(rút từ gap Blocker + BR logic phức tạp)
|
|
104
|
+
|
|
105
|
+
## 7. Dữ liệu & Môi trường
|
|
106
|
+
Tài khoản các role, dữ liệu mẫu (biên/edge), môi trường staging.
|
|
107
|
+
|
|
108
|
+
## 8. Deliverables
|
|
109
|
+
Test case `.Test.md`, script Playwright/pytest + Page Object, báo cáo pytest-html + Playwright Trace.
|
|
110
|
+
|
|
111
|
+
## 9. Lịch trình (milestone phụ thuộc gap)
|
|
112
|
+
| Mốc | Điều kiện | Trạng thái |
|
|
113
|
+
M0 phân tích → M1 đóng gap → M2 thiết kế TC → M3 review TC → M4 chạy → M5 review script.
|
|
114
|
+
|
|
115
|
+
## 10. Trạng thái hiện tại
|
|
116
|
+
Blocked/Ready + phần có thể làm sớm (không phụ thuộc gap Blocker).
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Kết thúc bằng: tóm tắt số vùng test + tổng TC ước lượng + trạng thái (Ready/Blocked dựa
|
|
120
|
+
trên gap Blocker còn Open) và gợi ý bước kế tiếp (bàn giao qa-designer khi đã Ready).
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Script — E2E Journey
|
|
8
|
+
|
|
9
|
+
Review Python pytest script cho test end-to-end và đánh giá chất lượng code.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review script E2E cho [Feature]" / "check code E2E quality"
|
|
13
|
+
- Sau khi qa-runner sinh script E2E, trước khi merge
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review script functional 1 màn → `script/functional`
|
|
17
|
+
- Review script integration → `script/integration`
|
|
18
|
+
- Review session note → `script/exploratory`
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Phase 1 — Clarify
|
|
23
|
+
|
|
24
|
+
1. Đọc file Python test E2E được chỉ định (thường `tests/<project>/e2e/test_*.py`)
|
|
25
|
+
2. Đọc các Page Object liên quan (nhiều PO cho nhiều màn)
|
|
26
|
+
3. Đọc TC E2E Markdown gốc để so sánh coverage journey
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Phase 2 — Review
|
|
31
|
+
|
|
32
|
+
Đánh giá theo 6 tiêu chí:
|
|
33
|
+
|
|
34
|
+
A. JOURNEY COVERAGE:
|
|
35
|
+
- Mỗi journey trong TC E2E có test function tương ứng không?
|
|
36
|
+
- Test function có traverse đủ các màn/module của journey không?
|
|
37
|
+
- Main flow / alternate flow / exception flow đủ không?
|
|
38
|
+
|
|
39
|
+
B. CROSS-MODULE DATA INTEGRITY:
|
|
40
|
+
- Data nhập ở Page A có được verify ở Page B/DB/hệ thống ngoài không?
|
|
41
|
+
- Assertion sau mỗi chặng (không chỉ assert ở bước cuối)?
|
|
42
|
+
- Không bỏ qua bước trung gian để "shortcut" đến màn cuối?
|
|
43
|
+
|
|
44
|
+
C. FIXTURE & PRECONDITION:
|
|
45
|
+
- Precondition phức tạp (nhiều entity) có fixture riêng, không inline trong test?
|
|
46
|
+
- Fixture tạo data → có teardown/cleanup tương ứng (yield + cleanup)?
|
|
47
|
+
- Không hardcode ID của entity đã tạo ở bước trước → dùng biến trả về fixture?
|
|
48
|
+
- Fixture scope đúng (`function` cho E2E, không dùng `session`)?
|
|
49
|
+
|
|
50
|
+
D. WAIT & TIMING:
|
|
51
|
+
- Timeout đủ dài cho navigation giữa màn (≥15s cho `networkidle`)?
|
|
52
|
+
- Không `time.sleep()`; dùng `wait_for_url` / `wait_for_load_state` / `expect(...).to_be_visible`?
|
|
53
|
+
- Không timeout ngắn (<5s) cho API call cross-module?
|
|
54
|
+
|
|
55
|
+
E. ASSERTION DEPTH:
|
|
56
|
+
- Không chỉ assert URL cuối; phải assert nội dung tại mỗi chặng?
|
|
57
|
+
- Verify đúng data flow: giá trị nhập màn A xuất hiện đúng ở màn B?
|
|
58
|
+
- Negative journey (thất bại giữa chừng): assert đúng màn dừng lại + thông báo lỗi?
|
|
59
|
+
|
|
60
|
+
F. CONVENTION:
|
|
61
|
+
- Marker `@pytest.mark.e2e` + `@pytest.mark.smoke` (nếu critical journey)?
|
|
62
|
+
- Marker phân loại = tên journey; docstring = TC ID + mô tả journey?
|
|
63
|
+
- `with step(...)` (`from utils.steps`) rõ từng chặng (màn nào → hành động nào)?
|
|
64
|
+
- Docstring ghi TC ID + mô tả journey ngắn?
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Checklist chi tiết
|
|
69
|
+
|
|
70
|
+
### Page Objects
|
|
71
|
+
- Mỗi màn có PO riêng; test không gọi `page.click()` / `page.fill()` trực tiếp.
|
|
72
|
+
- Selector constants khai báo đầu class; không rải rác trong test.
|
|
73
|
+
- Action method `return self` để chain; assertion method gọi `take_screenshot()` cuối.
|
|
74
|
+
|
|
75
|
+
### Test file
|
|
76
|
+
- Fixture `logged_in_page` hoặc fixture composite (vd `logged_in_as_teacher`) làm base.
|
|
77
|
+
- Không dùng biến global chia sẻ state giữa test function.
|
|
78
|
+
- Compile & collect trước submit: `python3 -m py_compile` + `pytest --collect-only -q`.
|
|
79
|
+
- Số journey collect = số TC E2E trong `.md`.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Output
|
|
84
|
+
|
|
85
|
+
Mỗi issue: `file:line` | severity | mô tả | suggestion fix.
|
|
86
|
+
Severity: 🔴 fix ngay (missing cleanup, dữ liệu không verify cross-module, shortcut journey) · 🟠 quan trọng (timeout thiếu, assertion chỉ ở bước cuối) · 🟡 nhỏ (style, docstring/title sai).
|
|
87
|
+
Score: A/B/C/D · Top 5 issue cần fix trước merge.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Session Note — Exploratory
|
|
8
|
+
|
|
9
|
+
Review session note sau khi test, coaching QC cải thiện kỹ năng.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review session note" / sau khi QC hoàn thành exploratory session
|
|
13
|
+
- Khi lead/senior muốn đánh giá chất lượng session của junior
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review Python script → dùng qa-reviewer/script/functional
|
|
17
|
+
- Review charter → dùng qa-reviewer/test-case/exploratory
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1 — Read
|
|
22
|
+
|
|
23
|
+
Đọc session note .md được chỉ định.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Phase 2 — Review
|
|
28
|
+
|
|
29
|
+
7 tiêu chí:
|
|
30
|
+
1. CHARTER COMPLETION: Đi đúng charter? Coverage %?
|
|
31
|
+
2. NOTE QUALITY: Ratio #TEST / #BUG ≥ 3:1? Mỗi #TEST có mô tả action + observation?
|
|
32
|
+
3. BUG QUALITY: Steps rõ? Expected/Actual cụ thể? Severity hợp lý?
|
|
33
|
+
4. OBSERVATION DEPTH: Có dùng FEW HICCUPPS? Hay chỉ test surface?
|
|
34
|
+
5. TIME ALLOCATION: Setup <15%, Test >70%, Investigation <15%?
|
|
35
|
+
6. FOLLOW-UP: #QUESTION gửi dev? #IDEA move vào ideas/?
|
|
36
|
+
7. DEBRIEF: Có Summary cuối? Coverage, risks, next recommendation?
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
|
|
43
|
+
Mỗi tiêu chí: ✅/⚠️/❌ + feedback cụ thể
|
|
44
|
+
Top 3 improvement suggestions (coaching tone)
|
|
45
|
+
Đề xuất charter tiếp theo nếu chưa đủ coverage
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Script — Functional
|
|
8
|
+
|
|
9
|
+
Review Python pytest script và đánh giá chất lượng code.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review script cho [Feature]" / "check code quality"
|
|
13
|
+
- Sau khi qa-runner xong, trước khi merge vào main
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review TC nghiệp vụ → dùng qa-reviewer
|
|
17
|
+
- Review exploratory session note → dùng qa-reviewer/script/exploratory
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1 — Clarify
|
|
22
|
+
|
|
23
|
+
1. Đọc file Python test được chỉ định
|
|
24
|
+
2. Đọc Page Object liên quan
|
|
25
|
+
3. Đọc TC markdown gốc (để so sánh coverage)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase 2 — Review
|
|
30
|
+
|
|
31
|
+
Đánh giá theo 6 tiêu chí:
|
|
32
|
+
|
|
33
|
+
A. LOCATOR:
|
|
34
|
+
- XPath dài/phức tạp → đề xuất data-testid / role
|
|
35
|
+
- Locator phụ thuộc text tiếng Việt → fragile khi đổi copy
|
|
36
|
+
- Locator nằm trong Page Object, KHÔNG hardcode trong test
|
|
37
|
+
- Dùng .first()/[n] → không reliable
|
|
38
|
+
|
|
39
|
+
B. WAIT & TIMING:
|
|
40
|
+
- time.sleep() → phải đổi sang Playwright auto-wait / expect
|
|
41
|
+
- Timeout quá ngắn (<3s) hoặc quá dài (>30s)
|
|
42
|
+
|
|
43
|
+
C. TEST INDEPENDENCE:
|
|
44
|
+
- Hardcode user ID/data ID → fragile
|
|
45
|
+
- Phụ thuộc thứ tự chạy (test_b cần test_a)
|
|
46
|
+
- Thiếu cleanup/teardown khi tạo data
|
|
47
|
+
- Global state
|
|
48
|
+
|
|
49
|
+
D. ASSERTION:
|
|
50
|
+
- assert True / not error → vô nghĩa
|
|
51
|
+
- Chỉ assert URL, không assert content → thiếu
|
|
52
|
+
- Thiếu negative assertion
|
|
53
|
+
|
|
54
|
+
E. CONVENTION:
|
|
55
|
+
- Marker đúng (@pytest.mark.functional + platform)?
|
|
56
|
+
- Tên: test_<feature>_<scenario>_<expected>?
|
|
57
|
+
- Docstring có TC_ID?
|
|
58
|
+
- Fixture từ conftest, không tự tạo browser?
|
|
59
|
+
|
|
60
|
+
F. PAGE OBJECT:
|
|
61
|
+
- Test gọi page.click() trực tiếp → phải qua PO
|
|
62
|
+
- PO method quá dài (>15 dòng) → tách
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Checklist chi tiết review code
|
|
67
|
+
|
|
68
|
+
### Phần 1 — Page Object (`pages/<feature>_page.py`)
|
|
69
|
+
- Kế thừa `BasePage`; selector constants `UPPER_SNAKE_CASE` tập trung đầu class (không rải rác).
|
|
70
|
+
- Tách 3 lớp: Locators (`_private()` chỉ trả `Locator`) → Actions (`public()` + `return self`, KHÔNG decorator) → Assertions (`assert_*()` + `expect()` + `take_screenshot()` cuối).
|
|
71
|
+
- Wait: KHÔNG `time.sleep()`; `wait_for_timeout()` chỉ khi cần (≤1000ms); sau nav/submit dùng `wait_for_load_state("networkidle")`; không `wait_for_timeout` ngay sau `networkidle`.
|
|
72
|
+
- KHÔNG hardcode URL/credential/timeout → `Env.*`, `CONFIG`.
|
|
73
|
+
- Column index dùng named constant (`COL_TTHAI = 7`), không magic number `cells[7]`.
|
|
74
|
+
- Assertion: dùng `expect()` cho element; `assert` Python cho logic (count/regex); screenshot tên `TC<NNN>_mo_ta`; KHÔNG silent fail → `raise AssertionError`, không `log.warning`.
|
|
75
|
+
- Lỗi assertion hay gặp: "ordered" phải verify thứ tự thật (`last_pos`); đúng cột; Counter ≠ Pagination total (không assert `==`); P0 strict / P1 `_or_empty`.
|
|
76
|
+
- Public API: có `get_row_count()`, `get_all_rows()` thay vì test gọi `_private()`; helper trả data là method thường (không cần bọc step).
|
|
77
|
+
|
|
78
|
+
### Phần 2 — Test file (`tests/test_<feature>.py`)
|
|
79
|
+
- Đủ class `TestFeatureUI` / `TestFeatureFunctional` / `TestFeatureNegative`; fixture scope `function`, base `logged_in_page`.
|
|
80
|
+
- KHÔNG Allure: phân loại/độ ưu tiên qua pytest markers (`smoke`/`regression`/domain); docstring/`__doc__` ghi `TC_FEATURE_NNN – …`; Priority khớp marker (P0→smoke, P1/P2→regression).
|
|
81
|
+
- Marker: ≥1 category (`smoke`/`regression`) + 1 domain (`ui`/`filter`/`search`/`pagination`/`action`/`negative`); đã đăng ký `pytest.ini`.
|
|
82
|
+
- Step: bọc bước bằng `with step("…")` (`from utils.steps import step`) rõ Action/Verify; KHÔNG step rỗng `: pass`.
|
|
83
|
+
- Isolation: độc lập thứ tự; không global state; không gọi `_private()` từ test.
|
|
84
|
+
- Logic nghiệp vụ nghi ngờ → `@pytest.mark.xfail(strict=False, reason=...)` giải thích rõ.
|
|
85
|
+
|
|
86
|
+
### Phần 4 — Tổng quát
|
|
87
|
+
- Compile & collect bắt buộc trước submit:
|
|
88
|
+
`python3 -m py_compile pages/<f>_page.py tests/test_<f>.py` · `pytest tests/test_<f>.py --collect-only -q`
|
|
89
|
+
- Số test collect = số TC trong `.md`; không warning marker chưa đăng ký.
|
|
90
|
+
- Naming: class `PascalCase`+`Page`; method `test_TC<NNN>_<snake>`; constant `UPPER_SNAKE`; locator `_snake()`; action `verb_noun()`; assert `assert_condition()`.
|
|
91
|
+
|
|
92
|
+
### Lỗi phổ biến (TC_TRUCLOP)
|
|
93
|
+
empty step `:pass` · test gọi `_private()` · Counter≠Pagination → xfail · "ordered" không verify thứ tự · magic `cells[7]` · silent fail → raise · Reset thiếu domain marker · `wait_for_timeout` thừa sau networkidle · orphan selector constant.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Output
|
|
98
|
+
|
|
99
|
+
Mỗi issue: file:line | severity | mô tả | suggestion fix.
|
|
100
|
+
Severity: 🔴 fix ngay (sai logic, POM breach, silent fail) · 🟠 quan trọng (fragile selector, wrong column, missing assert) · 🟡 nhỏ (style, thừa wait, orphan constant).
|
|
101
|
+
Score: A/B/C/D · Top 5 issue cần fix trước.
|