@educa-corp/sdd-framework 0.9.3 → 0.9.4
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/bin/build.js +11 -0
- package/bin/qc-base-map.json +119 -49
- package/bin/self-check.js +30 -0
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/qc-analyze.md +6 -119
- package/core/commands/qc-design-test.md +123 -143
- package/core/commands/qc-plan.md +6 -119
- package/core/commands/qc-review.md +59 -125
- package/core/commands/qc-run-test.md +6 -119
- package/core/commands/setup-ai-first.md +5 -5
- package/core/commands/update-framework.md +1 -1
- package/core/commands/validate-traces.md +1 -1
- package/core/rules/workflow.md +1 -1
- package/core/skills/qc/qa-analyst/DOC_GAP.template.md +1 -1
- package/core/skills/qc/qa-analyst/spec-breakdown.md +2 -2
- package/core/skills/qc/qa-designer/api/auth-chain.md +155 -0
- package/core/skills/qc/qa-designer/api/auth-sequence.md +75 -0
- package/core/skills/qc/qa-designer/api/common-headers.md +61 -0
- package/core/skills/qc/qa-designer/api/crud-sequence.md +122 -0
- package/core/skills/qc/qa-designer/api/endpoint.md +231 -0
- package/core/skills/qc/qa-designer/api/http-status-codes.md +102 -0
- package/core/skills/qc/qa-designer/e2e/journey.md +13 -8
- package/core/skills/qc/qa-designer/exploratory/charter.md +2 -0
- package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +7 -4
- package/core/skills/qc/qa-designer/functional/api.md +87 -18
- package/core/skills/qc/qa-designer/functional/gui-feature.md +12 -9
- package/core/skills/qc/qa-designer/functional/gui-screen.md +12 -10
- package/core/skills/qc/qa-designer/integration/api.md +12 -5
- package/core/skills/qc/qa-designer/integration/db.md +12 -6
- package/core/skills/qc/qa-designer/integration/gui.md +12 -5
- package/core/skills/qc/qa-designer/integration/kafka.md +12 -5
- package/core/skills/qc/qa-designer/non-functional.md +12 -5
- package/core/skills/qc/qa-designer/shared/action-keywords-glossary.md +91 -0
- package/core/skills/qc/qa-designer/shared/duplicate-check-procedure.md +105 -0
- package/core/skills/qc/qa-designer/shared/implicit-scenarios.md +22 -0
- package/core/skills/qc/qa-designer/shared/precision-rules.md +198 -0
- package/core/skills/qc/qa-designer/shared/read-doc-gap-inputs.md +25 -0
- package/core/skills/qc/qa-designer/shared/skill-decision-tree.md +93 -0
- package/core/skills/qc/qa-designer/shared/tc-metadata-format.md +243 -0
- package/core/skills/qc/qa-planner/risk-model.md +1 -1
- package/core/skills/qc/qa-reviewer/script/e2e.md +9 -1
- package/core/skills/qc/qa-reviewer/script/exploratory.md +9 -1
- package/core/skills/qc/qa-reviewer/script/functional.md +9 -1
- package/core/skills/qc/qa-reviewer/script/integration.md +9 -1
- package/core/skills/qc/qa-reviewer/script/non-functional.md +9 -1
- package/core/skills/qc/qa-reviewer/shared/read-doc-gap-inputs.md +26 -0
- package/core/skills/qc/qa-reviewer/shared/review-check-groups.md +207 -0
- package/core/skills/qc/qa-reviewer/shared/review-file-template.md +228 -0
- package/core/skills/qc/qa-reviewer/test-case/e2e.md +71 -13
- package/core/skills/qc/qa-reviewer/test-case/exploratory.md +53 -4
- package/core/skills/qc/qa-reviewer/test-case/functional.md +63 -15
- package/core/skills/qc/qa-reviewer/test-case/integration.md +64 -12
- package/core/skills/qc/qa-reviewer/test-case/non-functional.md +72 -13
- package/core/skills/qc/qa-runner/e2e.md +1 -1
- package/docs/02-concepts/pipeline-steps/09-validate-traces.md +1 -1
- package/docs/04-reference/trace-schema.md +1 -1
- package/docs/explain/00-setup-ai-first.md +1 -1
- package/docs/plans/qc-implementation-log.md +145 -3
- package/package.json +1 -1
|
@@ -123,4 +123,12 @@ def test_compatibility(browser_name, playwright):
|
|
|
123
123
|
|
|
124
124
|
Mỗi issue: `file:line` | severity | mô tả | suggestion fix.
|
|
125
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
|
-
|
|
126
|
+
**Điểm `XX/100`** — ánh xạ mức độ sang điểm trừ: 🔴 = `FAIL` (−5đ) · 🟠 = `WARN` (−2đ) ·
|
|
127
|
+
🟡 = ghi nhận, không trừ. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
|
|
128
|
+
**Verdict:** `≥80` VÀ không còn 🔴 → **`APPROVED`**; ngược lại **`NEEDS_FIX`**.
|
|
129
|
+
|
|
130
|
+
**Ghi vào `{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** — thêm một hàng vào bảng Tổng quan
|
|
131
|
+
(cột `Tầng` phân biệt vai soát-code với vai soát-kịch-bản; **không ghi đè** hàng của vai kia).
|
|
132
|
+
Khuôn + quy tắc ghi: `../shared/review-file-template.md`.
|
|
133
|
+
|
|
134
|
+
**KHÔNG tự sửa code** — chỉ nêu `file:line` + cách sửa. Người sửa là `/qc-run-test`.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-reviewer/shared/read-doc-gap-inputs.md
|
|
6
|
+
upstream_sha: 3caa1562399ef1167ac2dc620add2c6c729e55df
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Thủ tục: Nạp TOÀN BỘ tài liệu input từ DOC_GAP (BẮT BUỘC trước khi review TC)
|
|
10
|
+
|
|
11
|
+
> Mục tiêu: reviewer phải đọc **đúng bộ tài liệu nguồn mà `/qc-analyze` đã dùng** để dựng TEST_PLAN + DOC_GAP — không chỉ file domain. Chỉ khi nắm đủ ngữ cảnh nguồn mới bắt được TC hiểu sai nghiệp vụ, thiếu case, hoặc trace sai spec.
|
|
12
|
+
|
|
13
|
+
## Các bước
|
|
14
|
+
|
|
15
|
+
1. **Tìm file DOC_GAP** tại `{qc_artifact_dir}DOC_GAP.md` — **một file cho cả PRD**, các UC là các hàng phân biệt bằng cột `UC`. Không có → chạy `/qc-analyze {TICKET-ID} {platform}` trước; **đừng soát TC trên ngữ cảnh thiếu** (soát mù thì kết luận "0 lỗi" là vô nghĩa).
|
|
16
|
+
2. **`Read` toàn bộ DOC_GAP.** Định vị mục **`## Tài liệu đầu vào đã đọc để phân tích`** — bảng liệt kê **đầy đủ** file nguồn (cột "Đường dẫn", tính từ `{paths.specs_dir}/`), kèm vai trò & phiên bản.
|
|
17
|
+
3. **`Read` TỪNG file trong bảng đó** — ghép prefix `{paths.specs_dir}/` vào đường dẫn ở cột. Đọc HẾT, không bỏ sót dòng nào (spec chính + ref bắt buộc + transitive 1-hop). Nếu bảng liệt kê phiên bản, kiểm tra file hiện tại khớp; lệch phiên bản → ghi chú vào REVIEW.
|
|
18
|
+
4. **Đối chiếu chéo:** file nào có mặt ở header DOC_GAP ("Tài liệu nguồn (spec chính)"/"Coverage Attestation") mà thiếu trong bảng → vẫn đọc.
|
|
19
|
+
5. Chỉ sau khi đã nạp xong toàn bộ input + file domain (`business-dictionary.md`, `product-definition/`) mới bắt đầu review — dùng chúng làm chuẩn đối chiếu để phán quyết `APPROVED` / `NEEDS_FIX`.
|
|
20
|
+
|
|
21
|
+
## Nguyên tắc
|
|
22
|
+
|
|
23
|
+
- **Chuẩn đối chiếu = tài liệu nguồn**, không phải suy đoán riêng của reviewer. Mọi nhận xét "TC hiểu sai/thiếu case" phải chỉ được về đoạn spec cụ thể trong các file đã đọc.
|
|
24
|
+
- **Không đọc thiếu:** nếu DOC_GAP nói "Tổng: N tài liệu" thì phải mở đủ N.
|
|
25
|
+
- Gap còn `Open` trong DOC_GAP: TC chạm vùng đó phải phản ánh đúng (đánh dấu blocked/assumption), không được coi như spec đã rõ.
|
|
26
|
+
- Lane API: nếu DOC_GAP ghi SKIP → không đòi hỏi TC endpoint không tồn tại.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-reviewer/ui-test-reviewer.md
|
|
6
|
+
upstream_sha: 54f81eb6a132d3fb331f18ce0f1a7eb3a9cf19df
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
> **Bộ xương 7 nhóm kiểm tra + registry nhãn lỗi dùng chung** *(B13 phần 2)*.
|
|
10
|
+
>
|
|
11
|
+
> Cả 5 tầng của upstream dùng **đúng 7 tên nhóm giống nhau**, và **32/46 nhãn lỗi** có ở cả 5 —
|
|
12
|
+
> nên bộ xương và registry về đây. Phần **thân** của mỗi nhóm khác nhau theo tầng (chỉ trùng
|
|
13
|
+
> ~10/33 dòng giữa UI và API) nên **ở lại từng file tầng**.
|
|
14
|
+
>
|
|
15
|
+
> **Một chỗ CỐ Ý sửa lệch của upstream, không port nguyên:** Nhóm 1 của bản gốc đòi
|
|
16
|
+
> *"**bảng** Tổng hợp TC"* và *"**bảng** Mục lục"* — nhưng luật trạm 3 của **chính họ**
|
|
17
|
+
> (`qa-tc-designer/shared/tc-metadata-format.md`) ghi *"TOÀN BỘ file TC viết dạng LIST — KHÔNG
|
|
18
|
+
> dùng bảng Markdown, áp dụng cho **Tổng hợp TC**, Trace Matrix, TC bị Block"*. Hai file của
|
|
19
|
+
> upstream nói ngược nhau; luật trạm 3 mới hơn và có ngày tháng nên **luật trạm 3 thắng**.
|
|
20
|
+
> Port nguyên Nhóm 1 là nhập khẩu đúng cái lỗi "cổng canh sai luật" mà B13 đang chữa.
|
|
21
|
+
|
|
22
|
+
# 7 nhóm kiểm tra (dùng chung mọi tầng)
|
|
23
|
+
|
|
24
|
+
**Chạy tuần tự.** Mỗi lỗi ghi đủ bốn phần:
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
TC ID · loại lỗi (nhãn) · mô tả · gợi ý sửa
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Thiếu *gợi ý sửa* thì finding không dùng được — trạm 3 nhận về một lời phàn nàn, không phải một
|
|
31
|
+
việc. Và mỗi lỗi phải quy được về `FAIL` hoặc `WARN` để chấm điểm *(xem
|
|
32
|
+
`review-file-template.md` §Thang điểm)*.
|
|
33
|
+
|
|
34
|
+
| Nhóm | Kiểm gì | Thân nhóm ở đâu |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| **1 — Cấu trúc & Header** | Bố cục file · các mục bắt buộc · phân cấp heading · định dạng ngày | dùng chung, dưới đây |
|
|
37
|
+
| **2 — Mã TC & Đặt tên** | Prefix theo nền/feature · số 3 chữ số · không trùng · tên ≤ 60 ký tự | dùng chung, dưới đây |
|
|
38
|
+
| **3 — Phân nhóm & Type** | TC nằm đúng nhóm · `Type` khớp nội dung | riêng theo tầng |
|
|
39
|
+
| **4 — Tags & Mức độ** | `smoke` vs `regression` · mức độ khớp `Type` | dùng chung, dưới đây |
|
|
40
|
+
| **5 — Nội dung TC** | Preconditions · Test Data · Steps · **Expected Result** | **→ `review-file-template.md`** §Kiểm tra cấu trúc TC |
|
|
41
|
+
| **6 — Coverage** | Đủ nhóm test · không trùng · tỷ lệ · **7 mẫu hay thiếu** | dùng chung + riêng theo tầng |
|
|
42
|
+
| **7 — Traceability** | TC ↔ hàm test ↔ Page Object ↔ marker | dùng chung, dưới đây |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Nhóm 1 — Cấu trúc & Header
|
|
47
|
+
|
|
48
|
+
Bố cục đúng: `#` header → mục **Tổng hợp TC** → mục **Mục lục** → `## Nhóm <N>` → `### TC` →
|
|
49
|
+
`####` section.
|
|
50
|
+
|
|
51
|
+
- Có mục **Tổng hợp TC** đặt **trước** Mục lục → thiếu → `[MISSING_SUMMARY_TABLE]`.
|
|
52
|
+
Số TC trong đó khớp số TC thực tế → sai → `[SUMMARY_COUNT_MISMATCH]`.
|
|
53
|
+
- **Cả hai mục phải là DANH SÁCH, không phải bảng** — có ký tự `|` → `[SHOULD_BE_LIST]`.
|
|
54
|
+
*(Tên nhãn `[MISSING_SUMMARY_TABLE]` giữ theo từ vựng đội QC dù nội dung giờ là danh sách —
|
|
55
|
+
đổi tên nhãn là bắt họ đổi thói quen mà không được gì.)*
|
|
56
|
+
- **KHÔNG** có mục "Danh sách TC" tách rời khỏi Mục lục → có → `[HAS_TC_LIST]`.
|
|
57
|
+
- **KHÔNG** có mục "Phạm vi & ranh giới" / "Gap ảnh hưởng" trong file TC → **đây KHÔNG phải
|
|
58
|
+
lỗi.** Thông tin đó thuộc `TEST_PLAN.md` và `DOC_GAP.md`. **Đừng gắn nhãn lỗi khi thiếu chúng.**
|
|
59
|
+
- Các nhóm đánh số **liên tục từ 1** → sai → `[BAD_GROUP_NUMBERING]`. Thiếu một nhóm đáng lẽ có
|
|
60
|
+
→ `[MISSING_GROUP]`.
|
|
61
|
+
- Phân cấp `##` → `###` → `####` → sai → `[BAD_HEADING_LEVEL]`.
|
|
62
|
+
- Mỗi TC đủ header + **4 section** (Preconditions · Test Data · Test Steps · Expected Result) →
|
|
63
|
+
thiếu → `[MISSING_SECTION]`; thiếu một trường metadata → `[MISSING_FIELD]`.
|
|
64
|
+
- `Last updated` đúng `YYYY-MM-DD` → sai → `[BAD_DATE]`. `Status` ∈
|
|
65
|
+
{`Draft` | `Reviewed` | `Automated` | `Deprecated`}.
|
|
66
|
+
- Dùng khuôn cũ (còn `#### Python Test Mapping`, còn `→ [Expected]` ở bước) → `[OLD_TEMPLATE]`.
|
|
67
|
+
|
|
68
|
+
**Thứ tự nhóm trong file TC là CỐ ĐỊNH** *(B12)*:
|
|
69
|
+
`GUI → Validation → Functional → Integration (qua UI) → NFR → E2E` cho file giao diện;
|
|
70
|
+
`Endpoint → Integration API/DB/Kafka` cho file API. Sai thứ tự → `[BAD_GROUP_NUMBERING]`.
|
|
71
|
+
|
|
72
|
+
## Nhóm 2 — Mã TC & Đặt tên
|
|
73
|
+
|
|
74
|
+
- Prefix đúng nền/feature; số **3 chữ số**; **liên tục toàn file**, không đánh lại theo từng
|
|
75
|
+
nhóm → sai → `[WRONG_PREFIX]` / `[WRONG_FORMAT]`.
|
|
76
|
+
- **Không trùng mã** → trùng → `[DUP_ID]`. *(Hay xảy ra sau một lần tách/đánh số lại bằng
|
|
77
|
+
script — xem `review-file-template.md` §dấu vết hỏng thầm lặng.)*
|
|
78
|
+
- Tên TC **< 60 ký tự**, nêu được cả tình huống lẫn kết quả.
|
|
79
|
+
- **Web và app là hai bộ TC ĐỘC LẬP**, mỗi nền một thư mục (`{qc_dir}/{TICKET-ID}/web/` vs
|
|
80
|
+
`/app/`). Kiểm:
|
|
81
|
+
- Không TC nào có `Module = App + Web` — phải đã chốt một nền → `[MODULE_NOT_SPLIT]`
|
|
82
|
+
- File của nền này không chứa TC chỉ-có-ở-nền-kia → `[APP_ONLY_IN_WEB]` / `[PLATFORM_MIX]`
|
|
83
|
+
- Trace BDD không trỏ chéo nền (file web không có `BDD App SCxx`) → `[CROSS_PLATFORM_TRACE]`
|
|
84
|
+
|
|
85
|
+
⚠️ **Trùng logic giữa hai nền là CHỦ ĐÍCH, không phải lỗi trùng lặp.** Mỗi nền phải tự đạt
|
|
86
|
+
full coverage. Đừng gắn `[DUPLICATE]` cho cặp web/app cùng kiểm một luật.
|
|
87
|
+
|
|
88
|
+
## Nhóm 4 — Tags & Mức độ
|
|
89
|
+
|
|
90
|
+
- `smoke` = luồng chính / cốt lõi · `regression` = biên, âm, lỗi, ca ít gặp.
|
|
91
|
+
- Mỗi TC **≥ 1 tag mức độ**; mức độ **khớp `Type`** → lệch → `[WRONG_LEVEL]`; thiếu →
|
|
92
|
+
`[MISSING_TAG]`.
|
|
93
|
+
- TC giao diện trên mobile cần `@pytest.mark.flaky` trong Tags → thiếu → `[MISSING_FLAKY_MARK]`.
|
|
94
|
+
|
|
95
|
+
## Nhóm 5 — Nội dung TC (phần KHÔNG có ở `review-file-template.md`)
|
|
96
|
+
|
|
97
|
+
Phần lớn Nhóm 5 nằm ở `review-file-template.md` §*Kiểm tra cấu trúc TC* (ATOMIC · không ký tự
|
|
98
|
+
`|` · cụm từ mơ hồ · teardown đúng chỗ · marker ≠ oracle). Bốn phép kiểm còn lại:
|
|
99
|
+
|
|
100
|
+
- **Preconditions ≥1 điều cụ thể** và **Test Steps ≥2 bước**. Chỉ có một hành động → thêm bước
|
|
101
|
+
`[Verify]` quan sát kết quả → thiếu → `[TOO_FEW_STEPS]`.
|
|
102
|
+
- **Test Data có giá trị thật + ghi chú kỹ thuật** (`EP: valid` · `BVA: biên trên` · `DT: rule 3`)
|
|
103
|
+
→ thiếu → `[MISSING_DATA]`.
|
|
104
|
+
- **Teardown THỪA** → `[REDUNDANT_TEARDOWN]`: TC chỉ đọc (GET), chỉ verify giao diện tĩnh, hoặc
|
|
105
|
+
chỉ cấu hình mock/intercept **không cần** Teardown — fixture `conftest.py` (scope=function) đã
|
|
106
|
+
tự dọn. Ghi *"Reset mock về default"* vào từng TC là thừa, không phải cẩn thận.
|
|
107
|
+
- **Rủi ro flaky**:
|
|
108
|
+
| Dấu hiệu | Nhãn |
|
|
109
|
+
|---|---|
|
|
110
|
+
| Steps định vị element bằng **chỉ số / vị trí** (`nth(3)`, "nút thứ 2") thay vì test-id | `[FLAKY_RISK]` |
|
|
111
|
+
| TC nhìn thấy rõ là dễ flaky (animation · chờ mạng · thứ tự bất định) mà thiếu ghi chú `⚠️ Flaky:` | `[MISSING_FLAKY_NOTE]` |
|
|
112
|
+
|
|
113
|
+
*Định vị theo vị trí trượt ngay khi ai đó chèn thêm một element — và nó trượt **im lặng**, báo
|
|
114
|
+
"không tìm thấy" chứ không báo "spec đã đổi".*
|
|
115
|
+
|
|
116
|
+
## Nhóm 6 — Coverage (phần dùng chung)
|
|
117
|
+
|
|
118
|
+
- Mỗi tính năng **≥ 1 smoke**; có TC âm; có TC biên; có TC xử lý lỗi → thiếu → `[GAP]`.
|
|
119
|
+
- Không trùng logic *(trừ cặp web/app — xem Nhóm 2)* → trùng → `[DUPLICATE]`.
|
|
120
|
+
- Tỷ lệ `smoke` 50–70% · `regression` 30–50%; cân Positive vs Negative/Edge → lệch →
|
|
121
|
+
`[RATIO_WARN]`.
|
|
122
|
+
- Logic điều kiện có bảng quyết định mà thiếu rule → `[DT_COVERAGE_GAP]`.
|
|
123
|
+
- Giả định QA tự suy mà không ghi ra → `[MISSING_ASSUMPTION]`. Thiếu TC dạng error-guessing →
|
|
124
|
+
`[MISSING_EG]`.
|
|
125
|
+
|
|
126
|
+
### 7 mẫu hay thiếu — đối chiếu lại BDD/PRD rồi soi bộ TC
|
|
127
|
+
|
|
128
|
+
Đây là phần **đắt nhất** của cả nhóm 6: bảy chỗ mà bộ TC trông đầy đủ nhưng thực tế hụt.
|
|
129
|
+
|
|
130
|
+
| Kiểm | Dấu hiệu thiếu | Nhãn |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| **Liệt kê biến thể** | Spec nêu *"Google/Facebook"*, *"Lớp 1–6"*, *"iOS/Android"* — bộ TC chỉ có **một** TC chung | `[MISSING_VARIANT]` |
|
|
133
|
+
| **Định tuyến hai chiều** | Spec có *"bỏ qua UC nếu đủ điều kiện"* mà chỉ có TC *"vào UC"*, không có TC *"bỏ qua"* (hoặc ngược lại) | `[MISSING_ROUTING_BRANCH]` |
|
|
134
|
+
| **Telemetry từng event** | Spec liệt kê **≥2** event analytics mà gộp trong một TC | `[EVENTS_NOT_SPLIT]` |
|
|
135
|
+
| **Assertion âm / quyền riêng tư** | Spec có *"KHÔNG vào event"*, *"KHÔNG ghi PII"*, *"read-only"* mà **không TC nào** verify vế âm đó | `[MISSING_NEGATIVE_ASSERT]` |
|
|
136
|
+
| **Nhánh con của AC** | AC dạng *"(1)… → …; (2)… → …"* mà chỉ có TC cho một nhánh | `[MISSING_AC_SUBCASE]` |
|
|
137
|
+
| **Validation kế thừa** | Spec trỏ *"chuẩn hoá theo ACx"* / *"logic như UCy"* mà không TC nào phủ luật chuẩn-hoá của UC nguồn | `[MISSING_INHERITED_VALIDATION]` |
|
|
138
|
+
| **Dòng `Examples`** | BDD có `Scenario Outline` + `Examples` với **N dòng hành vi khác nhau** mà chỉ có một TC | `[OUTLINE_NOT_EXPANDED]` |
|
|
139
|
+
|
|
140
|
+
Mỗi `[GAP]` phát hiện → ghi vào bảng **Coverage gaps** của file review.
|
|
141
|
+
|
|
142
|
+
> **Vì sao bảy mẫu này, không phải "hãy kiểm coverage cho kỹ".** Chúng đều là chỗ **bộ TC trông
|
|
143
|
+
> đủ**: có TC, có trace, có Expected cụ thể — nên một lượt đọc bình thường sẽ cho qua. Chỉ khi
|
|
144
|
+
> **đếm lại từ spec** (spec nêu mấy biến thể? mấy event? AC có mấy nhánh?) mới lộ ra. Đó là lý do
|
|
145
|
+
> chúng phải là **danh sách kiểm**, không phải một lời nhắc chung.
|
|
146
|
+
|
|
147
|
+
## Nhóm 7 — Traceability
|
|
148
|
+
|
|
149
|
+
- Mỗi TC có `**Trace:**` về `BR-xx` *(hoặc `⚠️ Chưa có Business Rule`)* và
|
|
150
|
+
`**@trace.verifies:** {UC-ID}-SC{N}` — thiếu `@trace.verifies` thì kết quả chạy **không vào
|
|
151
|
+
được sổ trace**.
|
|
152
|
+
- Nếu đã có `pages/` + `tests/`: mỗi TC có hàm test khớp mã · mỗi step có method Page Object ·
|
|
153
|
+
marker pytest khớp Tags · mobile có `@pytest.mark.flaky(reruns=2, reruns_delay=3)`.
|
|
154
|
+
Chưa sinh code → `[PENDING_IMPL]` *(không phải lỗi — là trạng thái)*.
|
|
155
|
+
- TC bị chặn bởi gap có `🚫 Block: [GAP-UC{N}-{nnn}](../DOC_GAP.md)`; gap đã `Answered` mà TC vẫn
|
|
156
|
+
còn cờ chặn → `[ESCALATION_PENDING]`.
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
# Nền tảng ISTQB (CTFL v4.0) — reviewer phải nắm
|
|
161
|
+
|
|
162
|
+
**7 nguyên tắc test:** ① Test chỉ chứng minh **CÓ** lỗi, không chứng minh **KHÔNG** lỗi ② Test
|
|
163
|
+
toàn bộ là bất khả thi ③ Test sớm (shift-left) ④ Lỗi tụ cụm (Pareto) ⑤ Nghịch lý thuốc trừ sâu
|
|
164
|
+
(test dùng mãi thì mòn → phải làm mới) ⑥ Phụ thuộc ngữ cảnh ⑦ Ảo tưởng "không lỗi" (không có bug
|
|
165
|
+
≠ hệ thống đúng nhu cầu).
|
|
166
|
+
|
|
167
|
+
> Nguyên tắc ① và ⑦ là nền của luật *"mặc định HOÀI NGHI"*: một kết luận *"APPROVED, 0 lỗi"*
|
|
168
|
+
> không chứng minh file sạch — nó chỉ nói lượt soát này không tìm ra gì.
|
|
169
|
+
|
|
170
|
+
**Confirmation vs Regression:** confirmation = chạy lại test đã trượt sau khi fix; regression =
|
|
171
|
+
chạy lại cả bộ sau mỗi thay đổi (ứng viên số 1 cho tự động hoá / CI).
|
|
172
|
+
|
|
173
|
+
**Test Pyramid:** Unit/Component (nhiều) > Integration (vừa) > E2E/UI (ít). Nên E2E chỉ dành cho
|
|
174
|
+
luồng P0/P1 quan trọng; NFR và Integration nằm tầng trên, chạy ít / nightly.
|
|
175
|
+
|
|
176
|
+
**Testing Quadrants:** Q1 unit/component (CI) · Q2 functional + API/integration · Q3
|
|
177
|
+
exploratory/usability/UAT · Q4 smoke + NFR.
|
|
178
|
+
|
|
179
|
+
**Báo cáo lỗi tối thiểu (B.5):** mã · tiêu đề · ngày + người + vai · đối tượng test & môi trường ·
|
|
180
|
+
bối cảnh (TC/kỹ thuật/dữ liệu) · bước tái hiện + log/ảnh · expected vs actual · severity ·
|
|
181
|
+
priority · status · tham chiếu.
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
# Anti-pattern cần tránh
|
|
186
|
+
|
|
187
|
+
- **TC chung chung, không làm được** → mỗi TC phải chạy được **độc lập**.
|
|
188
|
+
- **Expected dạng "hiển thị đúng"** → phải nêu element/nhãn/chuỗi/giá trị cụ thể → `[VAGUE_EXPECTED]`.
|
|
189
|
+
- **Hardcode thông tin đăng nhập / URL** trong Test Data → dùng placeholder có tên rõ nghĩa
|
|
190
|
+
(`<valid_token_admin>`, không phải `<token>`).
|
|
191
|
+
- **Field có ràng buộc mà thiếu EP + BVA**, hoặc logic AND/OR không có bảng quyết định.
|
|
192
|
+
- **State machine có transition mà thiếu TC transition bị cấm.**
|
|
193
|
+
- **Reviewer tự sửa file rồi tự duyệt** — bỏ mất cái cổng. Chỉ nhận xét và chấm điểm.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
# Phase 3 — Coverage tổng thể
|
|
198
|
+
|
|
199
|
+
Sau khi duyệt hết từng TC, kiểm **bộ TC** có đủ các nhóm không. Bảng kỳ vọng tối thiểu **khác
|
|
200
|
+
nhau theo tầng** — xem mục `Phase 3` trong file tầng tương ứng.
|
|
201
|
+
|
|
202
|
+
Nhóm nào thiếu → ghi vào bảng **Coverage gaps** của file review, kèm nhãn `[GAP]` và **mã TC đề
|
|
203
|
+
xuất bổ sung**.
|
|
204
|
+
|
|
205
|
+
> **Đừng dừng ở Phase 2.** Phase 2 duyệt *"từng TC có đúng không"*; Phase 3 hỏi *"bộ TC có đủ
|
|
206
|
+
> không"*. Một bộ TC mà **mọi TC đều đạt** vẫn có thể **hụt cả một nhóm** — và đó là lỗi đắt hơn
|
|
207
|
+
> mọi lỗi định dạng cộng lại, vì nó không lộ ra ở đâu cả.
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-reviewer/shared/review-file-template.md
|
|
6
|
+
upstream_sha: bd596393ecc016cbea106835681a4979c0a9ca0e
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
> **Khuôn file kết quả review — dùng chung cho mọi tầng** *(B13 phần 1)*.
|
|
10
|
+
>
|
|
11
|
+
> **Hai chỗ CỐ Ý khác upstream:**
|
|
12
|
+
>
|
|
13
|
+
> | | Upstream | Ở đây | Vì sao |
|
|
14
|
+
> |---|---|---|---|
|
|
15
|
+
> | Verdict | `APPROVE` / `REJECT` | **`APPROVED` / `NEEDS_FIX`** | Đây là từ vựng chung của framework — `/review-code` dùng đúng cặp này. Đổi theo upstream là làm ba lệnh review nói ba kiểu |
|
|
16
|
+
> | Bảng Tổng quan | mỗi vòng **ghi đè** hàng của tầng đó | mỗi vòng **thêm một hàng** | Ghi đè thì mất điểm vòng trước, và **không ai thấy được điểm có tăng không**. Các bảng chi tiết vẫn ghi đè (chúng là trạng thái hiện tại, tích luỹ chỉ thành nhiễu) |
|
|
17
|
+
|
|
18
|
+
# Khuôn file Review (dùng chung)
|
|
19
|
+
|
|
20
|
+
## ⚠️ Nguyên tắc review (BẮT BUỘC — mặc định HOÀI NGHI)
|
|
21
|
+
|
|
22
|
+
- **Không đóng dấu cho qua.** Kết luận *"APPROVED, 0 lỗi"* trên một khối lượng lớn thường là dấu
|
|
23
|
+
hiệu **chưa đào đủ**, không phải hoàn hảo — hãy giả định "có ít nhất vài vấn đề" và đi tìm cho
|
|
24
|
+
ra; nếu thật sự sạch thì **nêu rõ đã kiểm những gì** để loại.
|
|
25
|
+
- **Đối chiếu số liệu nghiệp vụ / biên / trace với SPEC NGUỒN**, không tin nhãn của TC. Mở file
|
|
26
|
+
trong `{paths.specs_dir}` kiểm off-by-one, sai chiều so sánh, thiếu ca biên đối xứng, trace khống.
|
|
27
|
+
- **Đọc đủ tài liệu** — lỗ hổng thường nằm ở vùng lượt trước CHƯA đọc (vd chỉ đọc BDD app mà bỏ
|
|
28
|
+
web/system, hoặc bỏ design-spec phần a11y). Review lần 2 thì đọc phần còn thiếu.
|
|
29
|
+
*Thủ tục nạp đủ nguồn: `read-doc-gap-inputs.md` cùng thư mục này.*
|
|
30
|
+
- **Phân biệt rõ chặn vs không-chặn** để không thổi phồng mức độ: Blocker / Major / Minor. Lệch
|
|
31
|
+
giữa tài-liệu-nền-cũ và PRD đã duyệt là **lệch đồng bộ, KHÔNG chặn** — không phải mâu thuẫn
|
|
32
|
+
chặn. *(Khung "gap thật = QA KHÔNG tự quyết được" — xem `steps/gap-verify.md`.)*
|
|
33
|
+
- **KHÔNG tự sửa** kịch bản hay code. Chỉ nhận xét, chấm điểm, và nêu cụ thể sửa gì. Người sửa là
|
|
34
|
+
trạm 3 (`/qc-design-test`) hoặc trạm 5 (`/qc-run-test`).
|
|
35
|
+
|
|
36
|
+
## Kiểm tra cấu trúc TC (bắt buộc mỗi vòng)
|
|
37
|
+
|
|
38
|
+
> Đây là **tầng thi hành** cho các luật mà `/qc-design-test` đặt ra *(B12)*. Luật ở
|
|
39
|
+
> `qa-designer/shared/tc-metadata-format.md` + `precision-rules.md`; chỗ **kiểm** là ở đây.
|
|
40
|
+
|
|
41
|
+
- **1 bullet Expected / TC (ATOMIC — đội QC chốt 2026-07-09):** mỗi TC có đúng **1**
|
|
42
|
+
`#### Expected Result` với **ĐÚNG 1 bullet**; Test Steps chỉ `[Action]`/`[Verify]`, **không**
|
|
43
|
+
còn `→ [Expected]` ở bước. Đếm nhanh: số header `### TC_` = số `#### Expected Result` = số
|
|
44
|
+
bullet Expected. **TC có ≥2 bullet → `NEEDS_FIX` `[MULTI_BULLET_EXPECTED]`**, yêu cầu tách
|
|
45
|
+
thành nhiều TC độc lập (mỗi TC 1 bullet, giữ full steps, đánh số lại tuần tự).
|
|
46
|
+
- **Soi bullet 2-kết-cục ẩn (ATOMIC = 1 KẾT CỤC, không chỉ đếm bullet):** bullet nối bằng `;`
|
|
47
|
+
kiểu "khẳng-định + phủ-định" (grep bullet chứa `;` **và** `không/KHÔNG`, vd
|
|
48
|
+
*"Có lối Đăng nhập**;** KHÔNG có OTP"*) = 2 kết cục → cũng `[MULTI_BULLET_EXPECTED]`, tách
|
|
49
|
+
tiếp. Compound chỉ chấp nhận khi **cùng 1 kết cục** (vd *"chỉ 5 slide: đúng 5 dots; slide 6,7
|
|
50
|
+
không xuất hiện"*). **Đừng đóng dấu cho qua — tự grep tìm đúng chỗ.**
|
|
51
|
+
- **KHÔNG có ký tự `|` trong file TC** *(luật B12)*. Bảng Markdown trong `*.Test.md` →
|
|
52
|
+
`[SHOULD_BE_LIST]`. ⚠️ Luật này **chỉ áp cho file TC** — file review này và mọi tài liệu khác
|
|
53
|
+
dùng bảng bình thường.
|
|
54
|
+
- **Cụm từ mơ hồ** trong Expected Result → `[VAGUE_EXPECTED]`: *"hiển thị đúng"* ·
|
|
55
|
+
*"hoạt động bình thường"* · *"không lỗi"* · *"phù hợp"* … Danh sách 9 cụm bị cấm:
|
|
56
|
+
`qa-designer/shared/precision-rules.md` §1. Phép thử: **hai người soát đọc có ra cùng một kết
|
|
57
|
+
luận đỗ/trượt không?**
|
|
58
|
+
- **Teardown đúng vị trí:** flow **TẠO bản ghi DB** (đăng ký / tạo tài khoản mới) phải có
|
|
59
|
+
`#### Teardown` **thành SECTION riêng** — không phải bullet của Expected. TC có Expected là
|
|
60
|
+
hành động dọn dữ liệu (*"Xoá tài khoản test…"*) → `[TEARDOWN_AS_TC]` (teardown bị nhét thành
|
|
61
|
+
oracle, nên steps ↔ expected mâu thuẫn và TC không đỗ/trượt được). Flow tạo tài khoản mà 0
|
|
62
|
+
Teardown → `[MISSING_TEARDOWN]`. Flow login trên dữ liệu seed **không cần** Teardown.
|
|
63
|
+
- **Assertion loại-trừ không bị đánh rơi:** sau khi trạm 3 rút gọn hoặc dời bước (nhất là bằng
|
|
64
|
+
script cơ học), đối chiếu để chắc các oracle *"KHÔNG hiển thị / KHÔNG xảy ra"* vẫn còn trong
|
|
65
|
+
Expected Result. Đây là **mất mát thầm lặng hay gặp nhất** — bullet phủ định dễ bị bỏ nhất.
|
|
66
|
+
- **Chế độ ATOMIC TỐI ĐA** *(cờ `--atomic-max` của trạm 3)*: danh sách completeness
|
|
67
|
+
(*"hiển thị **đủ** [A,B,C]"*) phải nổ **mỗi thành phần 1 TC**; đa-kết-cục tách hết. Ba rủi ro
|
|
68
|
+
riêng của chế độ này phải soi:
|
|
69
|
+
| | Rủi ro | Cách soi |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| **a** | **Mất assertion khi tách** | Cộng các TC con của một TC cha phải phủ **ĐỦ** Expected gốc — cha *"A và B và không C"* → đủ **3** con, không rơi C |
|
|
72
|
+
| **b** | **Tách vụn quá mức** | Predicate-định-nghĩa-một-khái-niệm (*"chưa bắt đầu & ≥10'"*) · ngưỡng (`≥44pt`) · exclusivity · qualifier **PHẢI giữ 1 TC**. Bị tách → cờ lỗi over-split |
|
|
73
|
+
| **c** | **Trùng nghĩa mới sinh ra** | Một vế bị nhân bản giữa hai TC |
|
|
74
|
+
|
|
75
|
+
Kiểm parity **web ↔ app** (chênh nhau chỉ ở nhóm NFR theo nền là hợp lý).
|
|
76
|
+
Chi tiết: `qa-designer/shared/precision-rules.md` §2.1.
|
|
77
|
+
- **Marker ≠ oracle:** bullet `- Mobile: @pytest.mark.flaky(...)` nằm trong
|
|
78
|
+
`#### Expected Result` là **metadata**, không phải kết cục → **KHÔNG** tính là
|
|
79
|
+
`[MULTI_BULLET_EXPECTED]`, nhưng cờ `[MARKER_IN_EXPECTED]` (khuyến nghị dời ra Tags/meta).
|
|
80
|
+
Đếm nhầm nó là "bullet thứ 2" sẽ kết luận **SAI** rằng file cần tách.
|
|
81
|
+
- **Sau mọi lần tách / đánh số lại bằng script — soi dấu vết hỏng thầm lặng** *(script chạy xong
|
|
82
|
+
không báo lỗi mà file đã hỏng)*: **(a)** ID trùng do remap hai lần · **(b)** mã master bị ghi
|
|
83
|
+
đè (diff tập master-ID với bản backup) · **(c)** dòng `>` note trong Expected bị nuốt ·
|
|
84
|
+
**(d)** dòng-trống-kép / nhiễu whitespace so với backup · **(e)** tiêu đề nhân đôi khi title
|
|
85
|
+
con = `<heading cha> — <bullet>` mà cha liệt kê nhiều vế · **(f)** chữ không nguyên văn với
|
|
86
|
+
nguồn. Tất cả không-chặn **trừ (a) và (b)**, nhưng phải nêu **mã TC cụ thể**.
|
|
87
|
+
- **Oracle tự chứa và đúng nguồn:** chuỗi sao-nguyên-văn (tiêu đề · nhãn · chữ trên nút · thông
|
|
88
|
+
báo lỗi) mà TC assert phải ghi nguyên văn trong Expected Result **và** khớp design-spec/PRD của
|
|
89
|
+
**chính feature này**. Soi kỹ chuỗi **mượn nhầm từ feature anh em** (vd *"tạo tài khoản"* vs
|
|
90
|
+
*"tạo câu hỏi"*). Chuỗi chưa có nguồn chốt mà bị bịa oracle → `NEEDS_FIX`; đúng ra phải để
|
|
91
|
+
`Status: PENDING` hoặc gắn `🚫 Block: [GAP-UC{N}-{nnn}]`.
|
|
92
|
+
|
|
93
|
+
## Thang điểm
|
|
94
|
+
|
|
95
|
+
**Điểm chất lượng `XX/100`:** trừ **5đ** mỗi lỗi `FAIL`, trừ **2đ** mỗi `WARN`.
|
|
96
|
+
|
|
97
|
+
| Điểm | Nghĩa |
|
|
98
|
+
|---|---|
|
|
99
|
+
| **≥ 80** | đạt |
|
|
100
|
+
| 60–79 | cần cải thiện |
|
|
101
|
+
| < 60 | không đạt |
|
|
102
|
+
|
|
103
|
+
**Verdict suy ra được, không chấm cảm tính:**
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
điểm ≥ 80 VÀ không còn lỗi FAIL chặn → APPROVED
|
|
107
|
+
ngược lại → NEEDS_FIX
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
> **Vì sao là số, không phải chữ cái.** Framework trước đây ghi `Score: A / B / C / D` mà **không
|
|
111
|
+
> có luật chấm** — nên hai người soát ra hai kết quả, và vòng 2 không so được với vòng 1. Một con
|
|
112
|
+
> số có luật trừ điểm làm được cả ba: **so được các vòng** · **verdict suy ra được** · **hai
|
|
113
|
+
> người soát ra cùng một số**.
|
|
114
|
+
|
|
115
|
+
## Quy tắc ghi file
|
|
116
|
+
|
|
117
|
+
File kết quả: **`{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** — đứng **cạnh** file TC mà nó
|
|
118
|
+
soát:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
{qc_artifact_dir}test-cases/
|
|
122
|
+
├── TC_<FEATURE>.Test.md
|
|
123
|
+
├── REVIEW_<FEATURE>.md ← soát file trên
|
|
124
|
+
├── TC_<FEATURE>_API.Test.md
|
|
125
|
+
└── REVIEW_<FEATURE>_API.md ← soát file trên
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
⚠️ **Tên file review KHÔNG có đuôi `.Test.md`.** Đuôi đó là của file test case; gắn vào file
|
|
129
|
+
review sẽ làm `/qc-run-test` nhặt nó lên như một file test case rồi cố sinh script từ một bảng
|
|
130
|
+
điểm.
|
|
131
|
+
|
|
132
|
+
- **Chưa tồn tại** → `Write` toàn bộ khuôn bên dưới, điền hàng của tầng vừa soát, các tầng khác
|
|
133
|
+
để `—`.
|
|
134
|
+
- **Đã tồn tại** → `Read` **toàn bộ** → `Edit` chỉ phần của tầng vừa soát; các tầng khác **giữ
|
|
135
|
+
nguyên**.
|
|
136
|
+
- **Bảng Tổng quan: THÊM một hàng mỗi vòng**, không ghi đè — để thấy điểm có tăng không.
|
|
137
|
+
Các bảng chi tiết (Nhóm kiểm tra · Kết quả từng TC · Coverage gaps · Điều kiện để APPROVED) thì
|
|
138
|
+
**ghi đè** phần của tầng đó, vì chúng là trạng thái hiện tại.
|
|
139
|
+
- **Hai vai ghi vào CÙNG một file.** Vai soát kịch bản (sau trạm 3) và vai soát code (sau trạm 5)
|
|
140
|
+
đều thêm hàng vào bảng Tổng quan, phân biệt bằng cột `Tầng`. Hai vai cách nhau một trạm — hàng
|
|
141
|
+
của vai sau **không được ghi đè** hàng của vai trước.
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Khuôn đầy đủ (dùng khi `Write` mới)
|
|
146
|
+
|
|
147
|
+
```markdown
|
|
148
|
+
# Review Report — <FEATURE>
|
|
149
|
+
|
|
150
|
+
> Sinh bởi /qc-review. Cập nhật sau mỗi vòng soát. Bảng Tổng quan tích luỹ theo vòng.
|
|
151
|
+
|
|
152
|
+
## Tổng quan
|
|
153
|
+
|
|
154
|
+
| Tầng | Ngày soát | Vòng | Điểm | Verdict |
|
|
155
|
+
|---|---|---|---|---|
|
|
156
|
+
| Functional | — | — | — | — |
|
|
157
|
+
| API | — | — | — | — |
|
|
158
|
+
| Integration | — | — | — | — |
|
|
159
|
+
| NFR | — | — | — | — |
|
|
160
|
+
| E2E | — | — | — | — |
|
|
161
|
+
| Exploratory | — | — | — | — |
|
|
162
|
+
|
|
163
|
+
## Nhóm kiểm tra
|
|
164
|
+
|
|
165
|
+
| Tầng | Nhóm | Kết quả | Số lỗi |
|
|
166
|
+
|---|---|---|---|
|
|
167
|
+
|
|
168
|
+
## Kết quả từng TC
|
|
169
|
+
|
|
170
|
+
> **Trạng thái:** `Open` — lỗi mới · `Fixed` — đã sửa · `Waived` — chấp nhận không sửa
|
|
171
|
+
|
|
172
|
+
| TC ID | Tầng | Trạng thái | Đạt/Chưa đạt | Lý do | Đề xuất sửa |
|
|
173
|
+
|---|---|---|---|---|---|
|
|
174
|
+
|
|
175
|
+
## Coverage gaps
|
|
176
|
+
|
|
177
|
+
| Tầng | Kịch bản còn thiếu |
|
|
178
|
+
|---|---|
|
|
179
|
+
|
|
180
|
+
## Điều kiện để APPROVED (khi đang NEEDS_FIX)
|
|
181
|
+
|
|
182
|
+
| Tầng | Điều kiện cần sửa |
|
|
183
|
+
|---|---|
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
*Tên tầng khớp file kỹ năng: `test-case/functional.md` · `api.md` · `integration.md` ·
|
|
187
|
+
`non-functional.md` · `e2e.md` · `exploratory.md`.*
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## Bảng riêng theo tầng (thêm vào cuối file khi tầng đó được soát lần đầu)
|
|
192
|
+
|
|
193
|
+
**Tầng API:**
|
|
194
|
+
```markdown
|
|
195
|
+
## Coverage endpoint (API)
|
|
196
|
+
|
|
197
|
+
| Endpoint | Happy | Validation | Auth 401 | Auth 403 | 404 | Edge |
|
|
198
|
+
|---|---|---|---|---|---|---|
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Tầng E2E:**
|
|
202
|
+
```markdown
|
|
203
|
+
## Coverage journey/path (E2E)
|
|
204
|
+
|
|
205
|
+
| Journey / Path ID | Loại | TC ID | Đủ coverage? | Đủ isolation? |
|
|
206
|
+
|---|---|---|---|---|
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**Tầng NFR:**
|
|
210
|
+
```markdown
|
|
211
|
+
## Chi tiết NFR
|
|
212
|
+
|
|
213
|
+
| Loại NFR | Kết quả | Thiếu ngưỡng | Cần môi trường riêng |
|
|
214
|
+
|---|---|---|---|
|
|
215
|
+
| Performance | — | — | — |
|
|
216
|
+
| Security | — | — | — |
|
|
217
|
+
| Accessibility | — | — | — |
|
|
218
|
+
| i18n | — | — | — |
|
|
219
|
+
| Compatibility | — | — | — |
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Tầng Integration:**
|
|
223
|
+
```markdown
|
|
224
|
+
## Coverage handshake (Integration)
|
|
225
|
+
|
|
226
|
+
| Module A ↔ Module B | Happy | Failure | Timeout | Rollback |
|
|
227
|
+
|---|---|---|---|---|
|
|
228
|
+
```
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
version: 1.0
|
|
3
|
-
updated: 2026-
|
|
3
|
+
updated: 2026-09-04
|
|
4
4
|
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-reviewer/e2e-test-reviewer.md
|
|
6
|
+
upstream_sha: 276d0516f95421c726c8c55dc84c3c9244cf70e1
|
|
5
7
|
---
|
|
6
8
|
|
|
7
9
|
# Review Test Case — E2E Journey
|
|
@@ -10,7 +12,7 @@ Review bộ TC end-to-end và đánh giá chất lượng.
|
|
|
10
12
|
|
|
11
13
|
## Khi nào trigger
|
|
12
14
|
- "review TC E2E cho [Feature]" / "check coverage E2E"
|
|
13
|
-
- Sau khi qa-designer/e2e/journey xong, trước khi
|
|
15
|
+
- Sau khi qa-designer/e2e/journey xong, trước khi /qc-run-test
|
|
14
16
|
|
|
15
17
|
## Khi KHÔNG trigger
|
|
16
18
|
- Review TC functional 1 màn → `test-case/functional`
|
|
@@ -18,6 +20,33 @@ Review bộ TC end-to-end và đánh giá chất lượng.
|
|
|
18
20
|
|
|
19
21
|
---
|
|
20
22
|
|
|
23
|
+
## Trọng tâm review — tầng E2E
|
|
24
|
+
|
|
25
|
+
- **Journey đầy đủ**: mỗi TC phủ luồng cơ bản **và** có luồng thay thế / ngoại lệ tương ứng;
|
|
26
|
+
điều kiện trước và sau rõ. Thiếu nhánh ngoại lệ → `[GAP]`.
|
|
27
|
+
- **State Transition theo vòng đời**: object nhiều trạng thái phải phủ các transition hợp lệ
|
|
28
|
+
(0-switch). *Vd lịch học: Sắp diễn ra → Đếm ngược → Đang diễn ra → Đã kết thúc / Đã huỷ.*
|
|
29
|
+
- **Given/When/Then mạch lạc**, mỗi bước có điểm quan sát đo được.
|
|
30
|
+
- **Test Pyramid — E2E phải ÍT**: chỉ tự động hoá path P0/P1. Tự động hoá cả luồng nhỏ →
|
|
31
|
+
`[RATIO_WARN]`, đề xuất đẩy xuống tầng API hoặc giao diện.
|
|
32
|
+
- **Đa màn / đa API**: mỗi bước đi qua một màn hoặc một API phải verify được **kết quả trung
|
|
33
|
+
gian**, không chỉ kết quả cuối.
|
|
34
|
+
- **Bảng quyết định cho độ phủ journey**: trục bao phủ có ≥2 điều kiện (vai × loại × bộ phận) →
|
|
35
|
+
dựng bảng đếm N journey tối thiểu; thiếu → `[DT_COVERAGE_GAP]`.
|
|
36
|
+
- **Phân nhóm & `Type`** *(Nhóm 3 riêng của tầng này)*: journey thuộc nhóm **E2E**; `Type` khớp
|
|
37
|
+
nội dung — Happy Path · Positive · Negative · Edge. Sai nhóm → `[WRONG_GROUP]`; `Type` lệch →
|
|
38
|
+
`[WRONG_TYPE]`; một journey gánh nhiều mục tiêu nghiệp vụ → `[SPLIT_NEEDED]`.
|
|
39
|
+
|
|
40
|
+
## 7 nhóm kiểm tra
|
|
41
|
+
|
|
42
|
+
> **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-check-groups.md`** — bộ xương 7 nhóm
|
|
43
|
+
> chạy tuần tự · registry nhãn lỗi dùng chung · 7 mẫu-hay-thiếu của Nhóm 6 · nền tảng ISTQB ·
|
|
44
|
+
> anti-pattern. Nhóm 5 (Nội dung TC) trỏ tiếp sang `shared/review-file-template.md`.
|
|
45
|
+
>
|
|
46
|
+
> Dưới đây chỉ là phần **riêng của tầng này**.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
21
50
|
## Phase 1 — Clarify
|
|
22
51
|
|
|
23
52
|
1. Đọc tất cả TC E2E (ID dạng `E2E-<FEATURE>-NN`) trong folder chỉ định
|
|
@@ -49,25 +78,54 @@ C. INDEPENDENCE & PRECONDITION:
|
|
|
49
78
|
D. FORMAT & TRACE:
|
|
50
79
|
- ID đúng dạng `E2E-<FEATURE>-NN`?
|
|
51
80
|
- 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-
|
|
53
|
-
- Cuối file có Trace matrix + bảng TC
|
|
81
|
+
- TC phụ thuộc gap có dòng `🚫 Block: [GAP-UC{N}-{nnn}]`?
|
|
82
|
+
- Cuối file có **Trace matrix** (BR ↔ TC ↔ SC) + **danh sách** TC bị block — cả hai **dạng danh sách, KHÔNG bảng** (file TC không được có ký tự `|` — luật B12)?
|
|
54
83
|
- Expected là 1 bullet tổng hợp (không `✅ PASS/❌ FAIL`, không "hoạt động bình thường")?
|
|
55
84
|
|
|
56
85
|
---
|
|
57
86
|
|
|
58
|
-
##
|
|
87
|
+
## Phase 3 — Coverage tổng thể
|
|
88
|
+
|
|
89
|
+
**Theo journey:**
|
|
90
|
+
|
|
91
|
+
| Journey (từ TEST_PLAN) | Loại | TC ID | Đủ tiêu chí phủ? | Đủ isolation? |
|
|
92
|
+
|---|---|---|---|---|
|
|
93
|
+
| `<tên journey>` | happy / alt / exception | `E2E-XXX-01` | ✅/❌ | ✅/❌ |
|
|
94
|
+
| `<journey thiếu TC>` | — | — (thiếu) | — | — |
|
|
95
|
+
|
|
96
|
+
**Theo path:**
|
|
97
|
+
|
|
98
|
+
| Path ID | Loại | TC ID | Đi hết node? | Dữ liệu truyền đúng? | Đủ isolation? |
|
|
99
|
+
|---|---|---|---|---|---|
|
|
100
|
+
| `PATH-001` | HP | `E2E-XXX-01` | ✅/❌ | ✅/❌ | ✅/❌ |
|
|
101
|
+
| `PATH-005` | ER | — (thiếu) | — | — | — |
|
|
59
102
|
|
|
60
|
-
|
|
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`.
|
|
103
|
+
Điền kết quả vào bảng **Coverage journey/path (E2E)** ở cuối file review.
|
|
65
104
|
|
|
66
105
|
---
|
|
67
106
|
|
|
107
|
+
## Kiểm tra cấu trúc file TC
|
|
108
|
+
|
|
109
|
+
> **Nạp `{paths.qc_skills_dir}/qa-reviewer/shared/review-file-template.md`** §*Kiểm tra cấu trúc
|
|
110
|
+
> TC* — luật ATOMIC 1-bullet · không ký tự `|` · 9 cụm từ mơ hồ · teardown đúng chỗ · marker ≠
|
|
111
|
+
> oracle · 6 dấu vết hỏng sau khi chạy script tách. **Không lặp lại ở đây.**
|
|
112
|
+
>
|
|
113
|
+
> Luật gốc mà trạm 3 phải theo nằm ở `qa-designer/shared/tc-metadata-format.md` +
|
|
114
|
+
> `precision-rules.md`. **Cổng và luật phải đọc từ cùng một chỗ** — giữ hai bản là tự tạo lại
|
|
115
|
+
> chỗ chúng lệch nhau, và cổng lệch thì nó đánh trượt file làm đúng.
|
|
116
|
+
|
|
68
117
|
## Output
|
|
69
118
|
|
|
70
|
-
|
|
71
|
-
|
|
119
|
+
**Ghi vào `{qc_artifact_dir}test-cases/REVIEW_<FEATURE>.md`** — đứng cạnh file TC vừa soát.
|
|
120
|
+
Nạp `../shared/review-file-template.md` để lấy khuôn + quy tắc ghi (tích luỹ theo vòng, chỉ sửa
|
|
121
|
+
hàng của tầng mình, KHÔNG ghi đè tầng khác).
|
|
122
|
+
|
|
123
|
+
Mỗi tiêu chí: ✅ PASS | ⚠️ WARN | ❌ FAIL + evidence cụ thể (TC ID / journey)
|
|
124
|
+
|
|
125
|
+
**Điểm `XX/100`** — trừ 5đ mỗi `FAIL`, 2đ mỗi `WARN`. ≥80 đạt · 60–79 cần cải thiện · <60 không đạt.
|
|
126
|
+
**Verdict:** `điểm ≥ 80` VÀ không còn `FAIL` chặn → **`APPROVED`**; ngược lại **`NEEDS_FIX`**.
|
|
127
|
+
|
|
72
128
|
Danh sách journey thiếu TC; TC cần sửa Expected; TC vi phạm isolation.
|
|
73
|
-
|
|
129
|
+
Điền thêm bảng **Coverage journey/path (E2E)** ở cuối file review.
|
|
130
|
+
|
|
131
|
+
**KHÔNG tự sửa file TC** — chỉ nhận xét, chấm điểm, nêu cụ thể sửa gì. Người sửa là `/qc-design-test`.
|