@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
|
@@ -1,13 +1,15 @@
|
|
|
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-designer/api-testcase-designer.md
|
|
6
|
+
upstream_sha: 211c18728baf029a7572f0ffb161e92a933fa8fb
|
|
5
7
|
---
|
|
6
8
|
|
|
7
9
|
# Test Case — Functional API (không qua UI)
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
Viết TC kiểm thử một API endpoint ở mức chức năng (request → response).
|
|
12
|
+
Nạp cùng `shared/` (khuôn + độ chính xác + từ điển hành động) và `../api/` (mẫu + bảng tra).
|
|
11
13
|
|
|
12
14
|
## Khi nào trigger
|
|
13
15
|
- "viết test case cho API [method] [path]" — verify contract, validation, mã lỗi của endpoint
|
|
@@ -18,28 +20,95 @@ Chỉ cần load file này.
|
|
|
18
20
|
|
|
19
21
|
---
|
|
20
22
|
|
|
21
|
-
## Format file
|
|
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_GAP.md) — lý do`.
|
|
26
|
-
- **Test Data:** dạng **list** (request cụ thể: method/path/headers/body). **Steps:** `[Action]`/`[Verify]`.
|
|
27
|
-
**Expected:** 1 bullet nêu rõ **status code + field response cần chốt** (không ✅/❌).
|
|
28
|
-
- Cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · bỏ nội dung gạch ngang.
|
|
23
|
+
## Format file TC
|
|
29
24
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
26
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
27
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
28
|
+
>
|
|
29
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
30
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
31
|
+
|
|
32
|
+
## Đầu vào — sáu trường bắt buộc cho mỗi endpoint
|
|
33
|
+
|
|
34
|
+
Trước khi viết TC, mỗi endpoint phải biết đủ **sáu** thứ. Thiếu bất kỳ trường nào → **hỏi, đừng đoán**:
|
|
35
|
+
|
|
36
|
+
| # | Trường | Lấy ở đâu |
|
|
37
|
+
|---|---|---|
|
|
38
|
+
| 1 | Endpoint (method + path) | tech-doc gộp §4 Hợp đồng API |
|
|
39
|
+
| 2 | Auth / role được phép | §4 + PRD phần phân quyền |
|
|
40
|
+
| 3 | Schema request (field · kiểu · bắt buộc · ràng buộc) | §4 |
|
|
41
|
+
| 4 | Response thành công (mã + schema) | §4 |
|
|
42
|
+
| 5 | **Các mã lỗi** và body lỗi | §4 + §8 Xử lý lỗi & biên |
|
|
43
|
+
| 6 | Side-effect (ghi DB, phát event) | §6 Điểm tích hợp |
|
|
44
|
+
|
|
45
|
+
Trường 5 và 6 là hai chỗ hay thiếu nhất. Thiếu 5 → không viết được nhóm negative. Thiếu 6 →
|
|
46
|
+
side-effect không ai verify, và lỗi mất dữ liệu lọt qua toàn bộ dây chuyền.
|
|
47
|
+
|
|
48
|
+
## Kỹ thuật ISTQB cho tầng API *(CTFL v4.0)*
|
|
49
|
+
|
|
50
|
+
| Tình huống | Kỹ thuật |
|
|
51
|
+
|---|---|
|
|
52
|
+
| Tham số có kiểu / phạm vi / định dạng | **EP + BVA** |
|
|
53
|
+
| Tổ hợp điều kiện (quyền × trạng thái × input) | **Decision Table** |
|
|
54
|
+
| Spec mỏng, nghi có lỗi tiềm ẩn | **Error Guessing** |
|
|
55
|
+
|
|
56
|
+
- **EP/BVA từng tham số**: valid + invalid (thiếu · sai kiểu · vượt biên · rỗng · quá dài).
|
|
57
|
+
Mỗi phân vùng một TC. Số giá trị biên (3 hay 4) tra `../shared/precision-rules.md` §7.
|
|
58
|
+
- **Decision Table cho phân quyền**: điều kiện = (role, sở hữu resource, trạng thái resource)
|
|
59
|
+
→ hành động = mã trạng thái. **Mỗi rule một TC**, kể cả rule mà kết quả là "không làm gì".
|
|
60
|
+
- **Error Guessing theo mã trạng thái** — phủ đủ mã **áp dụng được** cho endpoint đó:
|
|
61
|
+
|
|
62
|
+
| Mã | Khi nào |
|
|
63
|
+
|---|---|
|
|
64
|
+
| 400 | thiếu / sai tham số |
|
|
65
|
+
| 401 | thiếu hoặc sai token |
|
|
66
|
+
| 403 | đúng token, sai quyền |
|
|
67
|
+
| 404 | resource không tồn tại |
|
|
68
|
+
| 409 | trùng giá trị unique |
|
|
69
|
+
| 422 | validate nghiệp vụ (đúng định dạng, sai luật) |
|
|
70
|
+
| 5xx | lỗi hệ thống / dịch vụ phụ thuộc |
|
|
71
|
+
|
|
72
|
+
Bảng đầy đủ + nghĩa trong ngữ cảnh: `../api/http-status-codes.md`. **401 ≠ 403** — trộn hai cái
|
|
73
|
+
là bỏ mất một lớp bảo mật khỏi phạm vi test.
|
|
74
|
+
|
|
75
|
+
## Thứ tự viết
|
|
76
|
+
|
|
77
|
+
**1. Positive → 2. Negative → 3. Edge → 4. Implicit.**
|
|
78
|
+
|
|
79
|
+
Bước 4 nạp `../shared/implicit-scenarios.md` — 7 tình huống bắt buộc nghĩ tới (rate limit ·
|
|
80
|
+
đồng thời · hết hạn phiên · trạng thái rỗng · dữ liệu tối đa · ký tự đặc biệt · ghi log).
|
|
81
|
+
Áp cho **mọi** nhóm TC, không riêng nhóm edge.
|
|
82
|
+
|
|
83
|
+
**Trước khi viết TC mới**: nạp `../shared/duplicate-check-procedure.md` — grep từ khoá trong file
|
|
84
|
+
TC hiện có. Một TC "email đã tồn tại" có thể đã nằm ở nhóm Validation của file giao diện.
|
|
85
|
+
|
|
86
|
+
## Năm luật chất lượng *(để reviewer không phải trả lại)*
|
|
87
|
+
|
|
88
|
+
1. **Title ≤ 60 ký tự**, nêu được cả tình huống lẫn kết quả.
|
|
89
|
+
2. **Test Steps ≥ 2 bước.** Chỉ một hành động → thêm bước `[Verify]` quan sát kết quả.
|
|
90
|
+
3. **Expected Result đo được** — cấm cụm mơ hồ. Phép thử: *hai QC đọc có ra cùng một kết luận
|
|
91
|
+
pass/fail không?* Danh sách 9 cụm bị cấm: `../shared/precision-rules.md` §1.
|
|
92
|
+
4. **Test Data ghi note kỹ thuật**: `EP: valid`, `BVA: biên trên`, `DT: rule 3`.
|
|
93
|
+
5. **Priority có nghĩa cố định**: P0 = chặn phát hành · P1 = smoke · P2 = regression.
|
|
33
94
|
|
|
34
95
|
## Phase 1 — Clarify
|
|
35
96
|
Endpoint (method/path/auth/role/content-type) · request (path/query/body schema: field, kiểu, bắt buộc, ràng buộc) ·
|
|
36
97
|
response (schema thành công + các mã lỗi 4xx/5xx + body lỗi) · side-effect (nếu cần verify → cân nhắc `integration/api`).
|
|
37
98
|
|
|
99
|
+
*Có `TEST_PLAN.md` đủ sáu trường trên → bỏ qua Phase 1, sang thẳng Phase 2.*
|
|
100
|
+
|
|
38
101
|
## Phase 2 — Write
|
|
39
|
-
- Nhóm TC: happy (
|
|
102
|
+
- Nhóm TC: happy (mã thành công + schema) → validation (400 từng field, EP/BVA) → auth (401/403)
|
|
40
103
|
→ not found (404) → edge (payload lớn, ký tự đặc biệt, rate limit).
|
|
41
|
-
- Mỗi TC bám
|
|
104
|
+
- Mỗi TC bám mẫu `../api/endpoint.md`; chuỗi nhiều bước bám `../api/auth-chain.md`.
|
|
105
|
+
- **Không hardcode URL / thông tin đăng nhập.** Placeholder có tên rõ nghĩa
|
|
106
|
+
(`<valid_token_admin>`, không phải `<token>`).
|
|
42
107
|
|
|
43
108
|
## Output
|
|
44
|
-
|
|
45
|
-
|
|
109
|
+
|
|
110
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>_API.Test.md` — **Nhóm 1 Endpoint**.
|
|
111
|
+
|
|
112
|
+
File này chỉ sinh khi có cờ `--api` hoặc `--all`. Mẫu TC: `../api/endpoint.md` · chuỗi auth: `../api/auth-chain.md` · tra mã: `../api/http-status-codes.md` · header: `../api/common-headers.md`.
|
|
113
|
+
|
|
114
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -18,13 +18,14 @@ Skill **tự chứa** để viết TC functional cho feature có luồng span
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
-
## Format file
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
## Format file TC
|
|
22
|
+
|
|
23
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
24
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
25
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
26
|
+
>
|
|
27
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
28
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
28
29
|
|
|
29
30
|
## Kỹ thuật áp dụng
|
|
30
31
|
- **Use Case** cho flow tổng: main (P0) → alternate (P1) → exception (negative).
|
|
@@ -42,5 +43,7 @@ Liệt kê các màn/route + thứ tự điều hướng · state/dữ liệu tr
|
|
|
42
43
|
- Mỗi TC bám khối Format; trace BR; gap chặn → 🚫 Block.
|
|
43
44
|
|
|
44
45
|
## Output
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
|
|
47
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` — **Nhóm 3 Functional** (luồng đa màn trong cùng một feature).
|
|
48
|
+
|
|
49
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -18,14 +18,14 @@ Skill **tự chứa** để viết TC functional cho 1 màn hình đơn lẻ (we
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
-
## Format file
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
21
|
+
## Format file TC
|
|
22
|
+
|
|
23
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
24
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
25
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
26
|
+
>
|
|
27
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
28
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
29
29
|
|
|
30
30
|
## Kỹ thuật áp dụng
|
|
31
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`).
|
|
@@ -48,5 +48,7 @@ chức năng (input/action/display/nav) · constraint (required/min-max/format/e
|
|
|
48
48
|
- Mỗi TC bám khối Format trên; trace BR; TC chặn bởi gap → 🚫 Block.
|
|
49
49
|
|
|
50
50
|
## Output
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
|
|
52
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` — **Nhóm 1 GUI** · **Nhóm 2 Validation** · **Nhóm 3 Functional**.
|
|
53
|
+
|
|
54
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -19,10 +19,14 @@ verify luồng dữ liệu & contract giữa các thành phần. Chỉ cần loa
|
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
22
|
-
## Format file TC
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
## Format file TC
|
|
23
|
+
|
|
24
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
25
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
26
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
27
|
+
>
|
|
28
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
29
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
26
30
|
|
|
27
31
|
## Kỹ thuật áp dụng
|
|
28
32
|
- **Interface/Contract:** verify schema request/response giữa caller↔callee.
|
|
@@ -39,4 +43,7 @@ Nhóm TC: happy (dữ liệu đúng đầu→cuối) → contract negative (inpu
|
|
|
39
43
|
→ concurrency → điều kiện đồng bộ (đổ/không đổ). Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
40
44
|
|
|
41
45
|
## Output
|
|
42
|
-
|
|
46
|
+
|
|
47
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>_API.Test.md` — **Nhóm 2 Integration API/DB/Kafka**. Ưu tiên P0 cho định tuyến & tiền-dữ liệu. Chuỗi gọi phụ thuộc nhau: `../api/crud-sequence.md`.
|
|
48
|
+
|
|
49
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -17,10 +17,14 @@ insert/update/soft-delete đúng giá trị, side-effect, toàn vẹn. Chỉ c
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
## Format file TC
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
## Format file TC
|
|
21
|
+
|
|
22
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
23
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
24
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
25
|
+
>
|
|
26
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
27
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
24
28
|
|
|
25
29
|
## Kỹ thuật áp dụng
|
|
26
30
|
- **State/DB verification:** verify bản ghi sau action (giá trị từng cột, flag, timestamp).
|
|
@@ -35,5 +39,7 @@ Nhóm TC: ghi đúng giá trị (happy) → default/null đúng → update khôn
|
|
|
35
39
|
→ audit log → ràng buộc/unique (negative). Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
36
40
|
|
|
37
41
|
## Output
|
|
38
|
-
|
|
39
|
-
không hardcode ID, chuẩn bị/dọn data qua fixture
|
|
42
|
+
|
|
43
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>_API.Test.md` — **Nhóm 2 Integration API/DB/Kafka**. Ghi rõ query kiểm tra DB + yêu cầu cleanup; không hardcode ID, chuẩn bị/dọn data qua fixture (3 mức teardown: `../shared/precision-rules.md` §8).
|
|
44
|
+
|
|
45
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -18,10 +18,14 @@ lỗi từ server, đồng bộ trạng thái hai chiều. Chỉ cần load file
|
|
|
18
18
|
|
|
19
19
|
---
|
|
20
20
|
|
|
21
|
-
## Format file TC
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
## Format file TC
|
|
22
|
+
|
|
23
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
24
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
25
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
26
|
+
>
|
|
27
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
28
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
25
29
|
|
|
26
30
|
## Kỹ thuật áp dụng
|
|
27
31
|
- **Data flow UI→API→UI:** verify request gửi đúng + render response đúng.
|
|
@@ -37,4 +41,7 @@ Nhóm TC: UI render đúng dữ liệu backend (happy) → empty state → lỗi
|
|
|
37
41
|
Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
38
42
|
|
|
39
43
|
## Output
|
|
40
|
-
|
|
44
|
+
|
|
45
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` — **Nhóm 4 Integration (qua UI)**. Đây là tầng verify dòng dữ liệu API → giao diện, nên **vẫn thuộc file giao diện**: bỏ UI đi thì TC mất nghĩa.
|
|
46
|
+
|
|
47
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -17,10 +17,14 @@ Skill **tự chứa** để viết TC tích hợp qua Kafka: producer phát even
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
## Format file TC
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
## Format file TC
|
|
21
|
+
|
|
22
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
23
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
24
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
25
|
+
>
|
|
26
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
27
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
24
28
|
|
|
25
29
|
## Kỹ thuật áp dụng
|
|
26
30
|
- **Message/event:** verify topic, key, payload schema, điều kiện phát.
|
|
@@ -37,4 +41,7 @@ Nhóm TC: phát đúng topic+payload (happy) → điều kiện không phát →
|
|
|
37
41
|
Mỗi TC bám Format; trace BR; gap chặn → 🚫 Block.
|
|
38
42
|
|
|
39
43
|
## Output
|
|
40
|
-
|
|
44
|
+
|
|
45
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>_API.Test.md` — **Nhóm 2 Integration API/DB/Kafka**. Mỗi TC ghi topic, key, payload cần verify + hành vi consumer.
|
|
46
|
+
|
|
47
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -17,10 +17,14 @@ Trọng tâm "hệ thống hoạt động TỐT thế nào". Chỉ cần load fi
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
## Format file TC
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
## Format file TC
|
|
21
|
+
|
|
22
|
+
> **Nạp `{paths.qc_skills_dir}/qa-designer/shared/tc-metadata-format.md`** — khuôn TC, luật
|
|
23
|
+
> ATOMIC (1 kết cục = 1 TC), cách phân nhóm, hai file `.Test.md`, Trace + `@trace.verifies`,
|
|
24
|
+
> `🚫 Block`, dòng `Test-ID attribute`. **Không lặp lại luật format ở đây.**
|
|
25
|
+
>
|
|
26
|
+
> Khi viết Expected Result / Test Data: nạp thêm `shared/precision-rules.md` (cấm từ mơ hồ,
|
|
27
|
+
> đơn vị, toán tử) + `shared/action-keywords-glossary.md` (một hành động một từ).
|
|
24
28
|
|
|
25
29
|
## Kỹ thuật / loại
|
|
26
30
|
- **Performance:** response time dưới tải mục tiêu; danh sách lớn (max data); pagination; concurrency.
|
|
@@ -37,4 +41,7 @@ Mỗi TC bám Format; **Expected có ngưỡng pass + công cụ đo**; đánh d
|
|
|
37
41
|
Trace BR; gap chặn → 🚫 Block.
|
|
38
42
|
|
|
39
43
|
## Output
|
|
40
|
-
|
|
44
|
+
|
|
45
|
+
Ghi vào file theo cùng câu hỏi phân file *"verify được mà không cần UI?"*: a11y · responsive · touch-target → `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` **Nhóm 5 NFR**; tải/hiệu năng/bảo mật ở tầng API → `{qc_artifact_dir}test-cases/TC_<FEATURE>_API.Test.md`. Mỗi TC ghi tiêu chí đo + ngưỡng + công cụ, đơn vị theo `../shared/precision-rules.md` §3.
|
|
46
|
+
|
|
47
|
+
**Dạng danh sách, KHÔNG bảng** — file TC không được có ký tự `|` (`shared/tc-metadata-format.md` §Nguyên tắc format file). Cuối file: Trace matrix + danh sách TC bị block, cũng dạng danh sách. Bàn giao `/qc-review`.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-designer/shared/action-keywords-glossary.md
|
|
6
|
+
upstream_sha: df56df91eea42342537ccf67b5946df32d98dbf4
|
|
7
|
+
---
|
|
8
|
+
# Action Keywords Glossary — Từ Điển Chuẩn
|
|
9
|
+
|
|
10
|
+
> **Quy tắc:** Mỗi hành động chỉ dùng **1 từ duy nhất** trong toàn bộ tài liệu TC. Không dùng Enter/Type/Input xen kẽ. Không dùng Verify/Assert/Check lẫn lộn.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Nhóm 1 — UI Actions (Web & Mobile)
|
|
15
|
+
|
|
16
|
+
| Từ chuẩn | Dùng khi nào | Không dùng thay thế |
|
|
17
|
+
|---|---|---|
|
|
18
|
+
| **Click** | Nhấn vào element trên Web (button, link, checkbox, radio) | Press, Hit, Select (cho button) |
|
|
19
|
+
| **Tap** | Nhấn vào element trên Mobile | Click (cho mobile) |
|
|
20
|
+
| **Enter** | Nhập văn bản vào input field / textarea | Type, Input, Fill, Write |
|
|
21
|
+
| **Select** | Chọn option trong dropdown / listbox | Choose, Pick |
|
|
22
|
+
| **Check** | Tick vào checkbox | Enable, Mark |
|
|
23
|
+
| **Uncheck** | Bỏ tick checkbox | Disable, Unmark |
|
|
24
|
+
| **Scroll** | Cuộn trang/container theo chiều dọc | Swipe (cho web) |
|
|
25
|
+
| **Swipe** | Vuốt màn hình trên Mobile | Scroll (cho mobile) |
|
|
26
|
+
| **Hover** | Di chuột vào element (hiện tooltip/dropdown) | Mouse over |
|
|
27
|
+
| **Clear** | Xóa nội dung field | Delete, Empty |
|
|
28
|
+
| **Upload** | Tải file lên qua input file | Attach, Import |
|
|
29
|
+
| **Download** | Tải file về | Save, Export |
|
|
30
|
+
| **Navigate to** | Mở URL / chuyển trang | Go to, Open URL |
|
|
31
|
+
| **Refresh** | Tải lại trang | Reload |
|
|
32
|
+
| **Wait for** | Chờ element/condition xuất hiện | Sleep, Pause |
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Nhóm 2 — Verification Actions
|
|
37
|
+
|
|
38
|
+
| Từ chuẩn | Dùng khi nào | Không dùng thay thế |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| **Verify** | Kiểm tra trong test steps — kết quả trung gian | Assert, Check, Confirm |
|
|
41
|
+
| **Assert** | Kết quả cuối (Expected Result) — điều kiện pass/fail | Verify (ở Expected), Check |
|
|
42
|
+
| **Observe** | Ghi nhận trạng thái hiện tại (không pass/fail) | See, Notice |
|
|
43
|
+
|
|
44
|
+
> **Phân biệt Verify vs Assert:**
|
|
45
|
+
> - Trong **Test Steps**: dùng `[Verify]` → "Verify: Error message 'Email không hợp lệ' hiển thị dưới field"
|
|
46
|
+
> - Trong **Expected Result**: dùng `Assert` → "Assert: HTTP 201, body.id tồn tại, body.email = email đã gửi"
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Nhóm 3 — API Actions
|
|
51
|
+
|
|
52
|
+
| Từ chuẩn | Dùng khi nào | Không dùng thay thế |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| **Send** | Gửi HTTP request | Call, Hit, Invoke |
|
|
55
|
+
| **GET** | HTTP GET request | Fetch, Read |
|
|
56
|
+
| **POST** | HTTP POST request | Create, Submit |
|
|
57
|
+
| **PUT** | HTTP PUT request | Update (toàn bộ) |
|
|
58
|
+
| **PATCH** | HTTP PATCH request | Update (một phần) |
|
|
59
|
+
| **DELETE** | HTTP DELETE request | Remove |
|
|
60
|
+
| **Receive** | Nhận response từ server | Get response |
|
|
61
|
+
| **Authenticate** | Thực hiện xác thực (login/token) | Login (trong API context) |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Nhóm 4 — Test Setup / Teardown
|
|
66
|
+
|
|
67
|
+
| Từ chuẩn | Dùng khi nào |
|
|
68
|
+
|---|---|
|
|
69
|
+
| **Setup** | Chuẩn bị dữ liệu / trạng thái trước test |
|
|
70
|
+
| **Teardown** | Dọn dẹp sau test (xóa dữ liệu, reset state) |
|
|
71
|
+
| **Login as** | Đăng nhập với role cụ thể: "Login as Teacher" |
|
|
72
|
+
| **Logout** | Đăng xuất |
|
|
73
|
+
| **Reset** | Đưa hệ thống về trạng thái ban đầu |
|
|
74
|
+
| **Seed** | Tạo dữ liệu test (fixtures) trước khi chạy TC |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Nhóm 5 — Trạng thái kỳ vọng (Expected keywords)
|
|
79
|
+
|
|
80
|
+
| Từ chuẩn | Dùng khi nào | Không dùng |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| **displays** | UI hiển thị element/text | shows, appears, renders |
|
|
83
|
+
| **is visible** | Element có thể nhìn thấy | is shown, is displayed |
|
|
84
|
+
| **is enabled** | Element có thể tương tác | is active, is available |
|
|
85
|
+
| **is disabled** | Element không thể tương tác | is inactive, is grayed out |
|
|
86
|
+
| **is empty** | Field không có giá trị | is blank, is clear |
|
|
87
|
+
| **contains** | Text/list chứa giá trị cụ thể | has, includes |
|
|
88
|
+
| **equals** | Giá trị bằng chính xác | is, matches (cho exact match) |
|
|
89
|
+
| **returns** | API trả về response | gives, sends back |
|
|
90
|
+
| **persists** | Dữ liệu được lưu vào DB | saves, stores |
|
|
91
|
+
| **navigates to** | Trình duyệt chuyển sang URL/màn mới | redirects to, goes to |
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-designer/shared/duplicate-check-procedure.md
|
|
6
|
+
upstream_sha: c59357a56b289bb9fb7fae8490db37109209cb3a
|
|
7
|
+
---
|
|
8
|
+
# Duplicate Check Procedure
|
|
9
|
+
|
|
10
|
+
> **Bắt buộc thực hiện** trước khi viết TC mới. TC trùng lặp làm tăng thời gian chạy, gây nhầm lẫn kết quả, và không tăng coverage.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Định nghĩa TC trùng lặp
|
|
15
|
+
|
|
16
|
+
Hai TC là **trùng** khi **cả 3** điều kiện sau đều giống nhau:
|
|
17
|
+
1. **Điều kiện kiểm tra** (condition) — cùng scenario
|
|
18
|
+
2. **Preconditions** — cùng trạng thái đầu vào
|
|
19
|
+
3. **Test Data** — cùng partition/boundary value
|
|
20
|
+
|
|
21
|
+
> Nếu chỉ khác tên/title nhưng nội dung giống → **trùng**.
|
|
22
|
+
> Nếu cùng scenario nhưng khác role/data partition → **không trùng** (là 2 TC hợp lệ).
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Quy trình kiểm tra (3 bước)
|
|
27
|
+
|
|
28
|
+
### Bước 1 — Grep title keywords trong file TC hiện tại
|
|
29
|
+
|
|
30
|
+
Trước khi viết TC mới, tìm kiếm title keywords trong toàn bộ file:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
# Tìm TC có chứa từ khóa scenario sắp viết
|
|
34
|
+
grep -i "<từ_khóa_scenario>" {qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Ví dụ: Sắp viết TC "Nhập email không hợp lệ":
|
|
38
|
+
```bash
|
|
39
|
+
grep -i "email\|invalid\|không hợp lệ" {qc_artifact_dir}test-cases/TC_LOGIN.Test.md
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Bước 2 — So sánh preconditions + test data
|
|
43
|
+
|
|
44
|
+
Nếu grep tìm thấy TC tương tự, so sánh:
|
|
45
|
+
|
|
46
|
+
| Yếu tố | TC hiện có | TC sắp viết | Kết luận |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| Condition | Nhập email sai format | Nhập email sai format | Giống |
|
|
49
|
+
| Precondition | Chưa login | Chưa login | Giống |
|
|
50
|
+
| Test Data | `abc@` | `abc@` | Giống → **TRÙNG** |
|
|
51
|
+
| Test Data | `abc@` | `abc` (không có @) | Khác partition → **KHÔNG TRÙNG** |
|
|
52
|
+
|
|
53
|
+
### Bước 3 — Quyết định
|
|
54
|
+
|
|
55
|
+
| Kết quả so sánh | Hành động |
|
|
56
|
+
|---|---|
|
|
57
|
+
| Trùng hoàn toàn (cả 3 yếu tố) | Không viết TC mới — sử dụng TC cũ |
|
|
58
|
+
| Cùng condition, khác data/partition | Viết TC mới (hợp lệ) — thêm vào nhóm TC đó |
|
|
59
|
+
| Cùng condition, khác platform (Web/App) | **KHÔNG trùng** — mỗi nền một thư mục (`{qc_dir}/{TICKET-ID}/web/` vs `/app/`) và mỗi nền phải tự đạt full coverage. Trùng logic giữa hai nền là **chủ đích** |
|
|
60
|
+
| Không tìm thấy tương tự | Viết TC mới bình thường |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Trường hợp đặc biệt
|
|
65
|
+
|
|
66
|
+
### TC "uniqueness check" (kiểm tra trùng lặp dữ liệu)
|
|
67
|
+
- **Chỉ viết** khi spec có ràng buộc uniqueness rõ ràng (vd: "email phải là duy nhất", "tên lớp không được trùng trong cùng giáo viên").
|
|
68
|
+
- **Không viết** dựa trên suy đoán — cần có AC hoặc BR tường minh trong `{paths.specs_dir}`.
|
|
69
|
+
|
|
70
|
+
### TC kế thừa logic từ UC khác
|
|
71
|
+
- Nếu scenario giống UC khác đã có TC → **không viết lại**, ghi trace reference về UC nguồn.
|
|
72
|
+
- Ví dụ: "Validation SĐT ở UC3 kế thừa logic UC2" → Trace: `BR-UC2-BR15`, ghi note "logic tương tự UC2".
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Áp dụng theo file — grep ở đâu
|
|
77
|
+
|
|
78
|
+
Chỉ có **hai** file TC cho mỗi (tính năng × nền), chia theo *"verify được mà không cần UI?"*:
|
|
79
|
+
|
|
80
|
+
| File | Chứa nhóm | Phạm vi grep khi kiểm trùng |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| `TC_<FEATURE>.Test.md` | GUI · Validation · Functional · Integration-qua-UI · NFR · E2E | **Toàn file** — trùng hay xảy ra giữa nhóm GUI và nhóm Functional |
|
|
83
|
+
| `TC_<FEATURE>_API.Test.md` | Endpoint · Integration API/DB/Kafka | Toàn file — so cả **endpoint + method + phân vùng dữ liệu** |
|
|
84
|
+
|
|
85
|
+
**Grep CẢ HAI file khi chưa chắc**, vì cùng một hành vi có thể đã được viết ở tầng khác: một
|
|
86
|
+
TC "email đã tồn tại" có thể nằm ở nhóm Validation (qua UI) **hoặc** ở file API (409 Conflict).
|
|
87
|
+
Hai cái đó **không trùng** — chúng test hai tầng khác nhau — nhưng phải biết cả hai tồn tại để
|
|
88
|
+
không viết cái thứ ba.
|
|
89
|
+
|
|
90
|
+
## Trùng chéo UC — chỗ mới xuất hiện
|
|
91
|
+
|
|
92
|
+
Trước đây mỗi UC một thư mục riêng, nên TC của UC1 và UC2 không bao giờ gặp nhau. Giờ
|
|
93
|
+
**mọi UC của một PRD nằm chung một thư mục `test-cases/`** — nên trùng chéo UC vừa **nhìn thấy
|
|
94
|
+
được**, vừa **thực sự xảy ra**.
|
|
95
|
+
|
|
96
|
+
Hai UC của cùng một PRD rất hay dùng lại một luật nghiệp vụ (validate số điện thoại, quyền
|
|
97
|
+
truy cập, trạng thái hết hạn). Khi gặp:
|
|
98
|
+
|
|
99
|
+
- **KHÔNG viết lại TC.** Ghi `Trace` trỏ về `BR-xx` của UC nguồn + một dòng ghi chú
|
|
100
|
+
*"logic tương tự {UC-ID}, đã phủ ở TC_<FEATURE>_NNN"*.
|
|
101
|
+
- Chỉ viết TC mới khi **phân vùng dữ liệu hoặc tiền đề khác** — lúc đó không phải trùng.
|
|
102
|
+
|
|
103
|
+
> **Vì sao gạch này quan trọng hơn sau khi bật chế độ tách tối đa.** Tách tối đa nhân số TC lên
|
|
104
|
+
> (ví dụ thật: 82 → 130). Nhân một TC trùng lên 5 mảnh thì thành 5 TC trùng — và không ai đếm
|
|
105
|
+
> được nữa. Kiểm trùng phải chạy **trước** khi tách, không phải sau.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-designer/shared/implicit-scenarios.md
|
|
6
|
+
upstream_sha: 6eb801a137ef4dfda97870c1eb36db62f3c782bc
|
|
7
|
+
---
|
|
8
|
+
# Implicit Scenarios (Bắt buộc nghĩ tới)
|
|
9
|
+
|
|
10
|
+
**Với mọi TC ở mọi lane, luôn xét thêm các tình huống sau:**
|
|
11
|
+
|
|
12
|
+
| Tình huống | Gợi ý kỹ thuật |
|
|
13
|
+
|---|---|
|
|
14
|
+
| Rate limiting / spam click | EP: vượt ngưỡng → block/error |
|
|
15
|
+
| Concurrent / race condition | 2 request song song cùng resource |
|
|
16
|
+
| Session / auth timeout | Hết hạn giữa chừng → redirect login |
|
|
17
|
+
| Empty state | List rỗng, 0 kết quả, chưa có dữ liệu |
|
|
18
|
+
| Max data | Trường đạt giới hạn ký tự/số lượng tối đa |
|
|
19
|
+
| Ký tự đặc biệt | Emoji · Unicode · tiếng Việt có dấu · SQL injection attempt |
|
|
20
|
+
| Audit / log | Hành động quan trọng có ghi log đúng không |
|
|
21
|
+
|
|
22
|
+
> Không cần tạo TC riêng cho tất cả — đánh giá mức độ rủi ro: P0/P1 → viết TC, P2/P3 → ghi chú trong Test Data.
|