@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.
Files changed (59) hide show
  1. package/bin/build.js +11 -0
  2. package/bin/qc-base-map.json +119 -49
  3. package/bin/self-check.js +30 -0
  4. package/core/FRAMEWORK_VERSION +1 -1
  5. package/core/commands/qc-analyze.md +6 -119
  6. package/core/commands/qc-design-test.md +123 -143
  7. package/core/commands/qc-plan.md +6 -119
  8. package/core/commands/qc-review.md +59 -125
  9. package/core/commands/qc-run-test.md +6 -119
  10. package/core/commands/setup-ai-first.md +5 -5
  11. package/core/commands/update-framework.md +1 -1
  12. package/core/commands/validate-traces.md +1 -1
  13. package/core/rules/workflow.md +1 -1
  14. package/core/skills/qc/qa-analyst/DOC_GAP.template.md +1 -1
  15. package/core/skills/qc/qa-analyst/spec-breakdown.md +2 -2
  16. package/core/skills/qc/qa-designer/api/auth-chain.md +155 -0
  17. package/core/skills/qc/qa-designer/api/auth-sequence.md +75 -0
  18. package/core/skills/qc/qa-designer/api/common-headers.md +61 -0
  19. package/core/skills/qc/qa-designer/api/crud-sequence.md +122 -0
  20. package/core/skills/qc/qa-designer/api/endpoint.md +231 -0
  21. package/core/skills/qc/qa-designer/api/http-status-codes.md +102 -0
  22. package/core/skills/qc/qa-designer/e2e/journey.md +13 -8
  23. package/core/skills/qc/qa-designer/exploratory/charter.md +2 -0
  24. package/core/skills/qc/qa-designer/exploratory/explore-to-functional.md +7 -4
  25. package/core/skills/qc/qa-designer/functional/api.md +87 -18
  26. package/core/skills/qc/qa-designer/functional/gui-feature.md +12 -9
  27. package/core/skills/qc/qa-designer/functional/gui-screen.md +12 -10
  28. package/core/skills/qc/qa-designer/integration/api.md +12 -5
  29. package/core/skills/qc/qa-designer/integration/db.md +12 -6
  30. package/core/skills/qc/qa-designer/integration/gui.md +12 -5
  31. package/core/skills/qc/qa-designer/integration/kafka.md +12 -5
  32. package/core/skills/qc/qa-designer/non-functional.md +12 -5
  33. package/core/skills/qc/qa-designer/shared/action-keywords-glossary.md +91 -0
  34. package/core/skills/qc/qa-designer/shared/duplicate-check-procedure.md +105 -0
  35. package/core/skills/qc/qa-designer/shared/implicit-scenarios.md +22 -0
  36. package/core/skills/qc/qa-designer/shared/precision-rules.md +198 -0
  37. package/core/skills/qc/qa-designer/shared/read-doc-gap-inputs.md +25 -0
  38. package/core/skills/qc/qa-designer/shared/skill-decision-tree.md +93 -0
  39. package/core/skills/qc/qa-designer/shared/tc-metadata-format.md +243 -0
  40. package/core/skills/qc/qa-planner/risk-model.md +1 -1
  41. package/core/skills/qc/qa-reviewer/script/e2e.md +9 -1
  42. package/core/skills/qc/qa-reviewer/script/exploratory.md +9 -1
  43. package/core/skills/qc/qa-reviewer/script/functional.md +9 -1
  44. package/core/skills/qc/qa-reviewer/script/integration.md +9 -1
  45. package/core/skills/qc/qa-reviewer/script/non-functional.md +9 -1
  46. package/core/skills/qc/qa-reviewer/shared/read-doc-gap-inputs.md +26 -0
  47. package/core/skills/qc/qa-reviewer/shared/review-check-groups.md +207 -0
  48. package/core/skills/qc/qa-reviewer/shared/review-file-template.md +228 -0
  49. package/core/skills/qc/qa-reviewer/test-case/e2e.md +71 -13
  50. package/core/skills/qc/qa-reviewer/test-case/exploratory.md +53 -4
  51. package/core/skills/qc/qa-reviewer/test-case/functional.md +63 -15
  52. package/core/skills/qc/qa-reviewer/test-case/integration.md +64 -12
  53. package/core/skills/qc/qa-reviewer/test-case/non-functional.md +72 -13
  54. package/core/skills/qc/qa-runner/e2e.md +1 -1
  55. package/docs/02-concepts/pipeline-steps/09-validate-traces.md +1 -1
  56. package/docs/04-reference/trace-schema.md +1 -1
  57. package/docs/explain/00-setup-ai-first.md +1 -1
  58. package/docs/plans/qc-implementation-log.md +145 -3
  59. package/package.json +1 -1
@@ -1,13 +1,15 @@
1
1
  ---
2
2
  version: 1.0
3
- updated: 2026-06-11
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
- Skill **tự chứa** để viết TC kiểm thử một API endpoint ở mức chức năng (request → response).
10
- Chỉ cần load file này.
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 `TC_<FEATURE>.md` (bắt buộc)
22
- - 1 file/feature · mỗi TC **1 concept** · metadata **list** (không bảng/emoji): Title · Feature ·
23
- Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
24
- - **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; không có BR → `⚠️ Chưa có Business Rule`.
25
- - **🚫 Block:** TC phụ thuộc gap vẫn viết đủ + `[GAP-xx](DOC_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
- ## Kỹ thuật áp dụng
31
- - Mỗi field request **EP** (phân vùng valid/invalid) + **BVA** (biên độ dài/giá trị).
32
- - Tổ hợp điều kiện (auth × param × state) **Decision Table**.
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 (200 + schema đúng) → validation (400 từng field, dùng EP/BVA) → auth (401/403)
102
+ - Nhóm TC: happy ( 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 khối Format; Expected ghi status code + phần body verify; trace BR; gap chặn → 🚫 Block.
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
- File TC (`TC_<FEATURE>_API.md` hoặc gộp trong file feature) trong `{qc_artifact_dir}test-cases/`.
45
- In bảng TC + Trace matrix. Bàn giao `qa-reviewer`.
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 `TC_<FEATURE>.md` (bắt buộc)
22
- - 1 file/feature · mỗi TC **1 concept** · metadata **list** (không bảng/emoji): Title · Feature ·
23
- Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
24
- - **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; không BR `⚠️ Chưa 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** (không bảng). **Steps:** `[Action]`/`[Verify]`, không `*Expected:*`/bước. **Expected:** 1 bullet cụ thể.
27
- - Cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · không `#### Python Test Mapping` · bỏ nội dung gạch ngang.
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ừ 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
- File `TC_<FEATURE>.md` trong `{qc_artifact_dir}test-cases/`. In bảng TC + Trace matrix + bảng TC block.
46
- Bàn giao `qa-reviewer` (test-case).
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 `TC_<FEATURE>.md` (bắt buộc)
22
- - 1 file/feature · mỗi TC **1 concept** · metadata **list** (mỗi trường 1 dòng, không bảng/emoji):
23
- Title · Feature · Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags · Trace · 🚫 Block(nếu có).
24
- - **Trace:** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)`; TC không BR `⚠️ Chưa Business Rule`.
25
- - **🚫 Block:** TC phụ thuộc gap **vẫn viết đủ** + `[GAP-xx](DOC_GAP.md) do`; chưa chạy tới khi gap Answered.
26
- - **Test Data:** dạng **list** (`- **Trường:** giá trị`), không bảng.
27
- - **Test Steps:** `**[Action]**` / `**[Verify]**`, KHÔNG `- *Expected:*` sau bước. **Expected:** 1 bullet cụ thể (không ✅/❌).
28
- - Phân nhóm GUI/Functional · cuối file: **Trace matrix** (BR↔TC, ⚠️ TC thiếu BR) + **bảng TC bị block** · KHÔNG `#### Python Test Mapping` · bỏ nội dung gạch ngang.
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ừ 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
- File `TC_<FEATURE>.md` trong `{qc_artifact_dir}test-cases/`. In bảng `TC_ID | Title | Priority | Tags | Trace`
52
- + Trace matrix + bảng TC block. Bàn giao `qa-reviewer` (test-case).
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 (bắt buộc)
23
- - Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAP.md)` (TC chặn vẫn viết đủ).
24
- - **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu rõ chặng verify (response/bản ghi/event).
25
- - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
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
- File TC integration trong `{qc_artifact_dir}test-cases/`. Ưu tiên P0 cho định tuyến & tiền-dữ liệu. Bàn giao `qa-reviewer`.
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 (bắt buộc)
21
- - Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAP.md)`.
22
- - **Test Data** dạng list (giá trị input) · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu rõ **bảng.cột = giá trị**.
23
- - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
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
- File TC trong `{qc_artifact_dir}test-cases/`. Ghi rõ query kiểm tra DB + yêu cầu cleanup;
39
- không hardcode ID, chuẩn bị/dọn data qua fixture. Bàn giao `qa-reviewer`.
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 (bắt buộc)
22
- - Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAP.md)`.
23
- - **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet (API liên quan + biểu hiện UI kỳ vọng).
24
- - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
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
- File TC trong `{qc_artifact_dir}test-cases/`. Mỗi TC nêu API liên quan + biểu hiện UI. Bàn giao `qa-reviewer`.
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 (bắt buộc)
21
- - Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAP.md)`.
22
- - **Test Data** dạng list (payload) · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet nêu **topic + field payload / hành vi consumer**.
23
- - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
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
- File TC trong `{qc_artifact_dir}test-cases/`. Mỗi TC ghi topic, key, payload cần verify + hành vi consumer. Bàn giao `qa-reviewer`.
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 (bắt buộc)
21
- - Metadata **list**: Title · Feature · Priority · Status(Draft) · Author(AI) · Tags · **Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-xx](DOC_GAP.md)`.
22
- - **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet có **ngưỡng đo cụ thể** (không "nhanh/ổn định").
23
- - Cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
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
- File TC non-functional trong `{qc_artifact_dir}test-cases/`. Mỗi TC ghi tiêu chí đo + ngưỡng + công cụ. Bàn giao `qa-reviewer`.
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.