@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,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.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Script — Integration
|
|
8
|
+
|
|
9
|
+
Review Python pytest script cho test tích hợp (GUI↔Backend, API, DB) và đánh giá chất lượng code.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review script integration cho [Feature]" / "check code tích hợp"
|
|
13
|
+
- Sau khi qa-runner sinh script integration, trước khi merge
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review script functional 1 màn/endpoint → `script/functional`
|
|
17
|
+
- Review script E2E xuyên nhiều module → `script/e2e`
|
|
18
|
+
- Review session note → `script/exploratory`
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Phase 1 — Clarify
|
|
23
|
+
|
|
24
|
+
1. Đọc file Python test integration được chỉ định
|
|
25
|
+
2. Đọc Page Object và API/DB utility liên quan
|
|
26
|
+
3. Đọc TC integration Markdown gốc để so sánh coverage
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Phase 2 — Review
|
|
31
|
+
|
|
32
|
+
Đánh giá theo 6 tiêu chí:
|
|
33
|
+
|
|
34
|
+
A. NO MOCK ON INTEGRATION:
|
|
35
|
+
- Không mock API/DB trong integration test (mock → đây là unit test, không phải integration)?
|
|
36
|
+
- Dùng real network call / real DB query / `page.expect_response()` để capture API thật?
|
|
37
|
+
- Network interception chỉ dùng để **observe** (verify request), không để **stub** response?
|
|
38
|
+
|
|
39
|
+
B. BACKEND STATE VERIFICATION:
|
|
40
|
+
- Sau action UI, có verify trạng thái backend không (DB query / API GET để re-fetch)?
|
|
41
|
+
- **GUI↔Backend:** verify cả request gửi đúng (method/URL/payload) lẫn render UI đúng?
|
|
42
|
+
- **DB:** dùng trực tiếp DB fixture/util để query `bảng.cột = giá trị`; không chỉ verify qua UI?
|
|
43
|
+
- **API:** verify response schema + status code + downstream effect (DB/event)?
|
|
44
|
+
|
|
45
|
+
C. ERROR STATE COVERAGE:
|
|
46
|
+
- Có test 4xx/5xx response → UI hiển thị message đúng?
|
|
47
|
+
- Có test empty state / loading state / timeout state?
|
|
48
|
+
- Concurrency test: mô tả rõ số request đồng thời; assert không race condition (vd unique constraint giữ)?
|
|
49
|
+
|
|
50
|
+
D. DATA SETUP & CLEANUP:
|
|
51
|
+
- Data test được tạo qua fixture (không hardcode ID)?
|
|
52
|
+
- Fixture `yield` + teardown xóa/rollback data sau mỗi test?
|
|
53
|
+
- Không dùng data production hoặc shared data giữa các test?
|
|
54
|
+
|
|
55
|
+
E. WAIT & TIMING:
|
|
56
|
+
- Không `time.sleep()`; chờ API response bằng `page.expect_response()` hoặc `wait_for_response()`?
|
|
57
|
+
- Sau action có side-effect backend, chờ đủ trước khi assert state (vd `wait_for_load_state("networkidle")`)?
|
|
58
|
+
- Timeout đủ cho network round-trip (≥10s)?
|
|
59
|
+
|
|
60
|
+
F. CONVENTION:
|
|
61
|
+
- Marker `@pytest.mark.integration` + sub-domain (`gui`, `api`, `db`)?
|
|
62
|
+
- Marker phân loại = loại tích hợp; docstring = TC ID + điểm tích hợp?
|
|
63
|
+
- `with step(...)` (`from utils.steps`) rõ hành động → API call → verify response/DB?
|
|
64
|
+
- Helper DB/API truy cập trong `utils/`, không rải trong test file?
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Checklist chi tiết
|
|
69
|
+
|
|
70
|
+
### GUI↔Backend
|
|
71
|
+
- Dùng `page.expect_response("**/api/endpoint")` để capture và assert request/response.
|
|
72
|
+
- Assert: status code + response payload + UI change sau response.
|
|
73
|
+
|
|
74
|
+
### API integration
|
|
75
|
+
- Dùng `requests` hoặc Playwright API context; không dùng UI để trigger API call.
|
|
76
|
+
- Assert schema với JSON schema validator hoặc `assert key in response.json()`.
|
|
77
|
+
|
|
78
|
+
### DB integration
|
|
79
|
+
- DB fixture trả connection/cursor; cleanup `DELETE WHERE id = created_id`.
|
|
80
|
+
- `assert cursor.fetchone()["column"] == expected_value`; không hardcode row position.
|
|
81
|
+
|
|
82
|
+
### Compile & collect
|
|
83
|
+
`python3 -m py_compile` + `pytest --collect-only -q`; số test collect = số TC integration `.md`.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Output
|
|
88
|
+
|
|
89
|
+
Mỗi issue: `file:line` | severity | mô tả | suggestion fix.
|
|
90
|
+
Severity: 🔴 fix ngay (mock thay real call, missing DB verify, no cleanup) · 🟠 quan trọng (thiếu error state, hardcode ID, timeout ngắn) · 🟡 nhỏ (style, marker thiếu sub-domain).
|
|
91
|
+
Score: A/B/C/D · Top 5 issue cần fix trước merge.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Script — Non-Functional
|
|
8
|
+
|
|
9
|
+
Review Python pytest script cho test phi chức năng (performance, security, accessibility, compatibility) và đánh giá chất lượng code.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review script non-functional cho [Feature]" / "check code performance/security/accessibility"
|
|
13
|
+
- Sau khi qa-runner sinh script non-functional, trước khi merge
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review script functional → `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 non-functional được chỉ định
|
|
25
|
+
2. Xác định loại: performance / security / accessibility / compatibility
|
|
26
|
+
3. Đọc TC non-functional Markdown gốc để đối chiếu ngưỡng + công cụ đo
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Phase 2 — Review
|
|
31
|
+
|
|
32
|
+
Đánh giá theo 6 tiêu chí:
|
|
33
|
+
|
|
34
|
+
A. THRESHOLD ASSERTION — tiêu chí quan trọng nhất:
|
|
35
|
+
- Assertion có dùng **giá trị ngưỡng cụ thể** không? (`assert elapsed < 2.0`, `assert violations == []`)
|
|
36
|
+
- Không dùng assertion mơ hồ: `assert response` / `assert "ok" in text` / `assert True`?
|
|
37
|
+
- Ngưỡng khớp với TC Markdown gốc (không tự đặt giá trị khác)?
|
|
38
|
+
|
|
39
|
+
B. THEO LOẠI:
|
|
40
|
+
- **Performance:**
|
|
41
|
+
- Đo thời gian bằng `page.wait_for_load_state` + `performance.timing` hoặc `time.perf_counter()` (không `time.sleep()`)?
|
|
42
|
+
- Có parametrize tải mục tiêu (concurrent users / data volume)?
|
|
43
|
+
- `pytest-benchmark` hoặc custom fixture đo rõ ràng?
|
|
44
|
+
- Margin hợp lý (không `assert elapsed < 0.001` quá strict)?
|
|
45
|
+
- **Security:**
|
|
46
|
+
- Payload injection được lưu trong fixture/constant, không inline magic string?
|
|
47
|
+
- Test không thực sự tấn công server production; dùng môi trường test?
|
|
48
|
+
- Assert bị chặn đúng: status 4xx, message lỗi, KHÔNG tạo được record?
|
|
49
|
+
- PII test: assert response KHÔNG chứa SĐT/email raw?
|
|
50
|
+
- **Accessibility:**
|
|
51
|
+
- Dùng `axe-playwright` (`AxeBuilder`) hoặc `pytest-axe`?
|
|
52
|
+
- Assert `violations == []` hoặc filter đúng WCAG level (`wcag2a`, `wcag2aa`)?
|
|
53
|
+
- Không assert bằng element count / class name (không liên quan accessibility)?
|
|
54
|
+
- **Compatibility:**
|
|
55
|
+
- Parametrize `@pytest.mark.parametrize` trên browser/device/viewport?
|
|
56
|
+
- Mỗi parameter = 1 target trong TC Markdown?
|
|
57
|
+
- Dùng `playwright_browser_type` fixture, không hardcode `chromium`?
|
|
58
|
+
|
|
59
|
+
C. ENVIRONMENT GUARD:
|
|
60
|
+
- Test cần môi trường đặc biệt (load server, scanner) có `@pytest.mark.skipif` nếu env không đủ?
|
|
61
|
+
- Credentials/endpoint load test không hardcode → `Env.*` / `CONFIG`?
|
|
62
|
+
- Test security không gọi endpoint production?
|
|
63
|
+
|
|
64
|
+
D. DATA SETUP & TEARDOWN:
|
|
65
|
+
- Data lớn (performance) có fixture tạo trước, teardown sau?
|
|
66
|
+
- Không để lại data/artifact sau test (security test không tạo record rác)?
|
|
67
|
+
|
|
68
|
+
E. WAIT & TIMING:
|
|
69
|
+
- Không `time.sleep()` cho wait UI; dùng Playwright auto-wait?
|
|
70
|
+
- Đo elapsed time chính xác: bắt đầu/kết thúc đo rõ ràng, không bao gồm fixture setup?
|
|
71
|
+
|
|
72
|
+
F. CONVENTION:
|
|
73
|
+
- Marker `@pytest.mark.non_functional` + sub-domain (`performance`/`security`/`accessibility`/`compatibility`)?
|
|
74
|
+
- **KHÔNG Allure** (đã gỡ): không `@allure.*`; bọc bước bằng `with step("…")` (`from utils.steps import step`)?
|
|
75
|
+
- `with step(...)` rõ: setup tải → trigger → measure → assert ngưỡng?
|
|
76
|
+
- Docstring ghi TC ID + ngưỡng mục tiêu + công cụ đo?
|
|
77
|
+
- Report = Playwright Trace (`test-results/<nodeid>/trace.zip`, `playwright show-trace`) + pytest-html (`--html=… --self-contained-html`); không tham chiếu report tự viết/Allure?
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Checklist chi tiết
|
|
82
|
+
|
|
83
|
+
### Performance
|
|
84
|
+
```python
|
|
85
|
+
# ✅ Đúng
|
|
86
|
+
start = time.perf_counter()
|
|
87
|
+
page.goto(Env.BASE_URL + "/list")
|
|
88
|
+
page.wait_for_load_state("networkidle")
|
|
89
|
+
elapsed = time.perf_counter() - start
|
|
90
|
+
assert elapsed < 2.0, f"Load time {elapsed:.2f}s > 2.0s threshold"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Security
|
|
94
|
+
```python
|
|
95
|
+
# ✅ Đúng — payload trong constant, assert bị block
|
|
96
|
+
INJECTION_PAYLOADS = ["<script>alert(1)</script>", "' OR 1=1--"]
|
|
97
|
+
# assert response.status == 400 hoặc record không tồn tại
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Accessibility
|
|
101
|
+
```python
|
|
102
|
+
# ✅ Đúng — axe-playwright
|
|
103
|
+
from axe_playwright_python.sync_playwright import Axe
|
|
104
|
+
results = Axe().run(page)
|
|
105
|
+
assert results.violations_count == 0, results.generate_report()
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Compatibility
|
|
109
|
+
```python
|
|
110
|
+
# ✅ Đúng — parametrize browser
|
|
111
|
+
@pytest.mark.parametrize("browser_name", ["chromium", "firefox", "webkit"])
|
|
112
|
+
def test_compatibility(browser_name, playwright):
|
|
113
|
+
browser = getattr(playwright, browser_name).launch()
|
|
114
|
+
...
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Compile & collect
|
|
118
|
+
`python3 -m py_compile` + `pytest --collect-only -q`; số test collect = số TC non-functional `.md`.
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Output
|
|
123
|
+
|
|
124
|
+
Mỗi issue: `file:line` | severity | mô tả | suggestion fix.
|
|
125
|
+
Severity: 🔴 fix ngay (assertion không có ngưỡng, gọi production endpoint, hardcode credential) · 🟠 quan trọng (ngưỡng không khớp TC, thiếu parametrize, không teardown data) · 🟡 nhỏ (style, marker thiếu sub-domain, docstring thiếu ngưỡng).
|
|
126
|
+
Score: A/B/C/D · Top 5 issue cần fix trước merge.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Case — E2E Journey
|
|
8
|
+
|
|
9
|
+
Review bộ TC end-to-end và đánh giá chất lượng.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review TC E2E cho [Feature]" / "check coverage E2E"
|
|
13
|
+
- Sau khi qa-designer/e2e/journey xong, trước khi qa-runner
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review TC functional 1 màn → `test-case/functional`
|
|
17
|
+
- Review charter exploratory → `test-case/exploratory`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1 — Clarify
|
|
22
|
+
|
|
23
|
+
1. Đọc tất cả TC E2E (ID dạng `E2E-<FEATURE>-NN`) trong folder chỉ định
|
|
24
|
+
2. Đọc TEST_PLAN để lấy danh sách journey + trục bao phủ dự kiến
|
|
25
|
+
3. Đọc REQUIREMENT_ANALYSIS nếu có để đối chiếu BR
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase 2 — Review
|
|
30
|
+
|
|
31
|
+
Đánh giá theo 4 tiêu chí:
|
|
32
|
+
|
|
33
|
+
A. COVERAGE (quan trọng nhất):
|
|
34
|
+
- Mỗi journey trong TEST_PLAN có TC tương ứng không?
|
|
35
|
+
- Trục bao phủ (vd role × loại × bộ phận) có đủ không? (Decision Table)
|
|
36
|
+
- Còn alternate flow / exception flow nào chưa có TC?
|
|
37
|
+
|
|
38
|
+
B. END-TO-END INTEGRITY:
|
|
39
|
+
- Steps có xuyên suốt qua các màn/module liên quan không?
|
|
40
|
+
- Expected có verify **toàn chuỗi**: tạo → định tuyến → đồng bộ → hiển thị danh sách?
|
|
41
|
+
- Data nhập màn A → hiện đúng màn B/DB/hệ thống ngoài không?
|
|
42
|
+
- Verify points chung (V1…Vn) áp nhất quán cho mọi journey?
|
|
43
|
+
|
|
44
|
+
C. INDEPENDENCE & PRECONDITION:
|
|
45
|
+
- Mỗi journey có tiền điều kiện rõ (data + tài khoản/role) không?
|
|
46
|
+
- Journey phụ thuộc nhau thứ tự? (vi phạm test isolation)
|
|
47
|
+
- Có hướng dẫn cleanup/teardown sau mỗi journey?
|
|
48
|
+
|
|
49
|
+
D. FORMAT & TRACE:
|
|
50
|
+
- ID đúng dạng `E2E-<FEATURE>-NN`?
|
|
51
|
+
- Mỗi TC có `Trace: [BR-xx]`; nếu không có BR phải ghi `⚠️ Chưa có Business Rule`?
|
|
52
|
+
- TC phụ thuộc gap có dòng `🚫 Block: [GAP-xx]`?
|
|
53
|
+
- Cuối file có Trace matrix + bảng TC block?
|
|
54
|
+
- Expected là 1 bullet tổng hợp (không `✅ PASS/❌ FAIL`, không "hoạt động bình thường")?
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Checklist format file `.md`
|
|
59
|
+
|
|
60
|
+
- **Metadata:** Title · Feature · Priority · Status(Draft) · Author · Tags · Trace · Block — mỗi trường 1 dòng.
|
|
61
|
+
- **Test Data:** dạng list (không bảng); ghi cả tài khoản/role cần dùng.
|
|
62
|
+
- **Steps:** phân biệt `[Action]`/`[Verify]`; KHÔNG có `- *Expected:* ...` sau từng bước.
|
|
63
|
+
- **Expected:** 1 bullet; liệt kê chuỗi verify point rõ ràng.
|
|
64
|
+
- **KHÔNG** có section `#### Python Test Mapping`.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Output
|
|
69
|
+
|
|
70
|
+
Mỗi tiêu chí: ✅ PASS | ⚠️ PARTIAL | ❌ MISSING + evidence (TC ID / journey)
|
|
71
|
+
Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
|
|
72
|
+
Danh sách journey thiếu TC; TC cần sửa Expected; TC vi phạm isolation.
|
|
73
|
+
Kết luận: sẵn sàng cho `qa-runner` chưa.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Charter — Exploratory
|
|
8
|
+
|
|
9
|
+
Review chất lượng test charter trước khi QC chạy session.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review charter cho [Feature]"
|
|
13
|
+
- Sau khi qa-designer/exploratory/charter xong, trước khi chạy session
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review TC functional → dùng qa-reviewer/test-case/functional
|
|
17
|
+
- Review session note → dùng qa-reviewer/script/exploratory
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1 — Read
|
|
22
|
+
|
|
23
|
+
Đọc tất cả charter .md trong folder chỉ định + feature description nếu có.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Phase 2 — Review
|
|
28
|
+
|
|
29
|
+
7 tiêu chí:
|
|
30
|
+
1. FOCUS: Charter đủ focus chưa? (quá rộng "Explore checkout" → cần narrow)
|
|
31
|
+
2. RISK ALIGNMENT: Target vào risk cao nhất? (tiền → Money Tour, input → Saboteur)
|
|
32
|
+
3. SFDIPOT COVERAGE: Tập hợp charter cover đủ 7 dimension?
|
|
33
|
+
4. TOUR FIT: Tour phù hợp charter?
|
|
34
|
+
5. OVERLAP: 2 charter cover cùng area? → merge
|
|
35
|
+
6. MISSING: Area nào chưa có charter?
|
|
36
|
+
7. TIME BUDGET: Tổng time-box fit resource QC?
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
Mỗi charter: ✅ PASS | 🔧 REWORK | ✂️ SPLIT | 🔗 MERGE + feedback cụ thể
|
|
43
|
+
Overall assessment + charter bổ sung nếu có gap
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Case — Functional
|
|
8
|
+
|
|
9
|
+
Review bộ functional TC và đánh giá chất lượng.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review TC cho [Feature]" / "check coverage"
|
|
13
|
+
- Sau khi qa-designer xong, trước khi PO approve hoặc trước khi qa-runner
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review Python script → dùng qa-reviewer
|
|
17
|
+
- Review charter exploratory → dùng qa-reviewer/test-case/exploratory
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1 — Clarify
|
|
22
|
+
|
|
23
|
+
1. Đọc tất cả .Test.md trong folder được chỉ định
|
|
24
|
+
2. Đọc requirement/spec/user story nếu QC cung cấp
|
|
25
|
+
3. Nếu không có requirement → review dựa trên TC content (vẫn check internal consistency)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase 2 — Review
|
|
30
|
+
|
|
31
|
+
Đánh giá theo 4 tiêu chí:
|
|
32
|
+
|
|
33
|
+
A. COVERAGE (quan trọng nhất):
|
|
34
|
+
- Requirement nào chưa được phủ?
|
|
35
|
+
- TC nào không trace được về requirement? (TC dư)
|
|
36
|
+
- Thiếu negative / edge / boundary test?
|
|
37
|
+
|
|
38
|
+
B. TECHNIQUE:
|
|
39
|
+
- Field có constraints → có EP + BVA không?
|
|
40
|
+
- Logic AND/OR → có Decision Table không?
|
|
41
|
+
- State → có transition hợp lệ VÀ forbidden không?
|
|
42
|
+
- Thiếu implicit requirement? (rate limit, concurrent, audit, session, security)
|
|
43
|
+
|
|
44
|
+
C. QUALITY:
|
|
45
|
+
- Title rõ scenario + expected?
|
|
46
|
+
- Expected result CỤ THỂ (2 QC test ra cùng kết luận)?
|
|
47
|
+
- Test data có giá trị cụ thể (không placeholder)?
|
|
48
|
+
- Mỗi TC chỉ verify 1 thing?
|
|
49
|
+
- Priority đúng (core function = P0)?
|
|
50
|
+
|
|
51
|
+
D. ANTI-PATTERN:
|
|
52
|
+
- TC chung chung, không actionable?
|
|
53
|
+
- Expected dạng "hiển thị đúng" (cảm tính)?
|
|
54
|
+
- Hardcode credentials/URL?
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Checklist format file `.md` (đối chiếu skill layer qa-designer)
|
|
59
|
+
|
|
60
|
+
- **Metadata:** đủ Title, Feature, Priority, Status, Author, Tags, **Trace**; Priority `P0/P1/P2` (không emoji); Status `Draft` text thuần; mỗi trường 1 dòng riêng.
|
|
61
|
+
- **Trace:** mỗi TC link `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; TC không có BR → phải có ⚠️ cảnh báo (không để trống/`—`).
|
|
62
|
+
- **TC bị block:** TC phụ thuộc gap có dòng `🚫 Block: [GAP-xx]`; cuối file có **Trace matrix** (BR↔TC) + **bảng TC bị block** (Gap↔TC).
|
|
63
|
+
- **Test Data:** dạng list (`- **Trường:** giá trị`), không dùng bảng.
|
|
64
|
+
- **Test Steps:** phân biệt `[Action]`/`[Verify]`; KHÔNG có `- *Expected:* ...` sau mỗi bước.
|
|
65
|
+
- **Expected Result:** 1 dòng bullet `-`, cụ thể; KHÔNG `✅ PASS/❌ FAIL`; không viết "hoạt động bình thường".
|
|
66
|
+
- **KHÔNG** có section `#### Python Test Mapping`.
|
|
67
|
+
- **1 concept/TC**; phân nhóm GUI / Functional.
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Output
|
|
72
|
+
|
|
73
|
+
Mỗi tiêu chí: ✅ PASS | ⚠️ PARTIAL | ❌ MISSING + evidence cụ thể
|
|
74
|
+
Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
|
|
75
|
+
Đề xuất TC cần thêm/sửa/xoá, sắp theo priority. Liệt kê TC thiếu Trace BR (⚠️) cần bổ sung.
|
|
76
|
+
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Case — Integration
|
|
8
|
+
|
|
9
|
+
Review bộ TC tích hợp (GUI↔Backend, API, DB) và đánh giá chất lượng.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review TC integration cho [Feature]" / "check TC tích hợp"
|
|
13
|
+
- Sau khi qa-designer/integration/* xong, trước khi qa-runner
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review TC functional 1 màn/endpoint → `test-case/functional`
|
|
17
|
+
- Review E2E xuyên nhiều module → `test-case/e2e`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1 — Clarify
|
|
22
|
+
|
|
23
|
+
1. Đọc tất cả TC integration trong folder chỉ định; xác định loại: GUI↔Backend / API / DB
|
|
24
|
+
2. Đọc REQUIREMENT_ANALYSIS + DOC_GAPS nếu có
|
|
25
|
+
3. Xác định chuỗi tích hợp (caller → component → downstream)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase 2 — Review
|
|
30
|
+
|
|
31
|
+
Đánh giá theo 4 tiêu chí:
|
|
32
|
+
|
|
33
|
+
A. COVERAGE:
|
|
34
|
+
- Mỗi điểm tích hợp (API call / DB write / event) trong chuỗi có TC tương ứng?
|
|
35
|
+
- Đủ nhóm: happy → empty state / null → lỗi server (4xx/5xx) → failure/timeout → concurrency?
|
|
36
|
+
- TC GUI↔Backend: có verify cả request gửi đúng lẫn render response đúng?
|
|
37
|
+
|
|
38
|
+
B. INTEGRATION DEPTH (theo loại):
|
|
39
|
+
- **GUI↔Backend:** Expected ghi rõ API liên quan + biểu hiện UI; state loading/empty/error đủ.
|
|
40
|
+
- **API:** schema request/response đúng; failure/retry/timeout có TC; định tuyến phụ thuộc điều kiện có Decision Table.
|
|
41
|
+
- **DB:** Expected ghi `bảng.cột = giá trị` cụ thể; có TC soft-delete, audit log, unique constraint; có hướng dẫn cleanup/query kiểm tra.
|
|
42
|
+
|
|
43
|
+
C. QUALITY:
|
|
44
|
+
- Expected CỤ THỂ (không "phản hồi đúng", "lưu thành công" chung chung)?
|
|
45
|
+
- Test Data đủ (endpoint, payload mẫu, bảng/cột kiểm tra, điều kiện định tuyến)?
|
|
46
|
+
- TC concurrency: mô tả rõ 2+ request đồng thời + kết quả kỳ vọng?
|
|
47
|
+
|
|
48
|
+
D. FORMAT & TRACE:
|
|
49
|
+
- Metadata đủ; Trace `[BR-xx]` hoặc `⚠️ Chưa có Business Rule`; `🚫 Block: [GAP-xx]` nếu bị chặn?
|
|
50
|
+
- Cuối file có Trace matrix + bảng TC block?
|
|
51
|
+
- Steps phân biệt `[Action]`/`[Verify]`; Expected 1 bullet; KHÔNG `✅/❌` inline.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Checklist format file `.md`
|
|
56
|
+
|
|
57
|
+
- **Test Data:** dạng list; ghi rõ endpoint/payload/bảng cần kiểm tra.
|
|
58
|
+
- **Expected (DB):** phải có dạng `bảng.cột = giá trị` + query kiểm tra + cleanup instruction.
|
|
59
|
+
- **Expected (API):** ghi mã HTTP + cấu trúc response + downstream effect.
|
|
60
|
+
- **Expected (GUI):** ghi API gọi + biểu hiện UI (message/state/list cập nhật).
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Output
|
|
65
|
+
|
|
66
|
+
Mỗi tiêu chí: ✅ PASS | ⚠️ PARTIAL | ❌ MISSING + evidence (TC ID / điểm tích hợp)
|
|
67
|
+
Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
|
|
68
|
+
Điểm tích hợp thiếu TC; TC Expected mờ nhạt; TC DB thiếu cleanup.
|
|
69
|
+
Kết luận: sẵn sàng cho `qa-runner` chưa.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-06-11
|
|
4
|
+
ported_from: ai-automation-qc-base
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review Test Case — Non-Functional
|
|
8
|
+
|
|
9
|
+
Review bộ TC phi chức năng (performance, security, accessibility, compatibility) và đánh giá chất lượng.
|
|
10
|
+
|
|
11
|
+
## Khi nào trigger
|
|
12
|
+
- "review TC non-functional cho [Feature]" / "check TC hiệu năng/bảo mật/accessibility"
|
|
13
|
+
- Sau khi qa-designer/non-functional xong, trước khi qa-runner
|
|
14
|
+
|
|
15
|
+
## Khi KHÔNG trigger
|
|
16
|
+
- Review TC chức năng → `test-case/functional`
|
|
17
|
+
- Review TC tích hợp → `test-case/integration`
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Phase 1 — Clarify
|
|
22
|
+
|
|
23
|
+
1. Đọc tất cả TC non-functional trong folder chỉ định; xác định loại: performance / security / accessibility / compatibility
|
|
24
|
+
2. Đọc REQUIREMENT_ANALYSIS để lấy SLA, ngưỡng, môi trường mục tiêu
|
|
25
|
+
3. Xác định công cụ đo đã được thống nhất (load tool, scanner, axe, lighthouse…)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Phase 2 — Review
|
|
30
|
+
|
|
31
|
+
Đánh giá theo 4 tiêu chí:
|
|
32
|
+
|
|
33
|
+
A. COVERAGE (theo loại):
|
|
34
|
+
- **Performance:** đủ scenario tải mục tiêu (normal / peak / max-data / concurrency / pagination)?
|
|
35
|
+
- **Security:** có TC cho authZ/role (truy cập trái phép), injection, PII không lộ, session/timeout, rate limit?
|
|
36
|
+
- **Accessibility:** có TC cho keyboard nav, focus order, label/aria, contrast (WCAG level rõ)?
|
|
37
|
+
- **Compatibility:** liệt kê đủ browser/device/độ phân giải mục tiêu; mỗi target có TC riêng?
|
|
38
|
+
|
|
39
|
+
B. MEASURABILITY — tiêu chí quan trọng nhất:
|
|
40
|
+
- Expected có **ngưỡng pass cụ thể** không? (vd `< 2s`, `0 critical issues`, `WCAG 2.1 AA`)
|
|
41
|
+
- Expected **không được** dùng: "nhanh", "ổn định", "hiển thị đúng", "bảo mật tốt"
|
|
42
|
+
- Có ghi công cụ đo kèm theo ngưỡng không?
|
|
43
|
+
- Performance TC: ghi rõ số user đồng thời, kích thước data, thời gian tải tối đa?
|
|
44
|
+
- Security TC: ghi rõ payload thử nghiệm (OWASP top 10 input mẫu)?
|
|
45
|
+
|
|
46
|
+
C. ENVIRONMENT & DATA:
|
|
47
|
+
- TC cần môi trường đặc biệt (load test server, staging) có ghi chú rõ không?
|
|
48
|
+
- TC cần data lớn / pre-populated data có hướng dẫn chuẩn bị?
|
|
49
|
+
- Cleanup / teardown sau mỗi TC (đặc biệt security test)?
|
|
50
|
+
|
|
51
|
+
D. FORMAT & TRACE:
|
|
52
|
+
- Metadata đủ; Trace `[BR-xx]` / SLA source rõ; `🚫 Block: [GAP-xx]` nếu bị chặn?
|
|
53
|
+
- Steps phân biệt `[Action]`/`[Verify]`; Expected 1 bullet; KHÔNG `✅/❌` inline?
|
|
54
|
+
- Cuối file có Trace matrix + bảng TC block?
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Checklist format file `.md`
|
|
59
|
+
|
|
60
|
+
- **Expected:** PHẢI có `ngưỡng + đơn vị + công cụ đo` — không có → ❌ MISSING.
|
|
61
|
+
- **Performance TC:** ghi `concurrent users`, `data volume`, `target response time`.
|
|
62
|
+
- **Security TC:** ghi `attack vector`, `input payload`, `expected block/response`.
|
|
63
|
+
- **Accessibility TC:** ghi `WCAG version + level`, `tool (axe/lighthouse)`.
|
|
64
|
+
- **Compatibility TC:** ghi `browser/OS version + device/resolution`.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Output
|
|
69
|
+
|
|
70
|
+
Mỗi tiêu chí: ✅ PASS | ⚠️ PARTIAL | ❌ MISSING + evidence (TC ID)
|
|
71
|
+
Score: A (excellent) / B (good) / C (needs improvement) / D (redo)
|
|
72
|
+
Danh sách TC Expected mờ nhạt (thiếu ngưỡng); loại non-functional thiếu coverage.
|
|
73
|
+
Kết luận: sẵn sàng cho `qa-runner` chưa; ghi rõ TC nào cần môi trường đặc biệt.
|