@educa-corp/sdd-framework 0.9.3 → 0.9.5
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/lint-trace.js +230 -2
- package/bin/qc-base-map.json +119 -49
- package/bin/self-check.js +54 -0
- package/bin/trace-schema.json +58 -4
- package/core/FRAMEWORK_VERSION +1 -1
- package/core/commands/generate-bdd.md +1 -0
- package/core/commands/generate-code.md +39 -2
- package/core/commands/generate-tech-docs.md +21 -2
- package/core/commands/map-testids.md +88 -8
- package/core/commands/qc-analyze.md +429 -472
- package/core/commands/qc-design-test.md +251 -207
- package/core/commands/qc-plan.md +97 -197
- package/core/commands/qc-report.md +76 -60
- package/core/commands/qc-review.md +135 -185
- package/core/commands/qc-run-test.md +235 -274
- package/core/commands/review-tech-docs.md +20 -0
- 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/modules/qc-playwright/stack-profile.yaml +1 -1
- package/core/rules/data-protection.md +52 -0
- package/core/rules/workflow.md +1 -1
- package/core/skills/qc/_shared/self-review-principles.md +112 -0
- 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 +3 -3
- package/core/skills/qc/qa-runner/functional/gui-feature.md +9 -3
- package/core/skills/qc/qa-runner/functional/gui-screen.md +9 -3
- package/core/skills/qc/qa-runner/integration.md +1 -1
- package/core/skills/qc/qa-runner/non-functional.md +1 -1
- package/core/skills/spec/SKILL.md +1 -1
- package/core/steps/context-loader.md +7 -2
- package/core/steps/gap-verify.md +67 -0
- package/core/steps/report-footer.md +3 -3
- package/core/templates/feature.template +1 -0
- package/core/templates/tech-design.template.md +1 -0
- package/docs/02-concepts/pipeline-steps/09-validate-traces.md +1 -1
- package/docs/04-reference/commands.md +1 -1
- package/docs/04-reference/trace-schema.md +39 -1
- package/docs/explain/00-setup-ai-first.md +1 -1
- package/docs/explain/11-map-testids.md +70 -69
- package/docs/plans/qc-implementation-log.md +145 -3
- package/docs/plans/qc-surgery/00-nhat-ky.md +497 -0
- package/docs/plans/qc-surgery/01-checklist.md +92 -0
- package/docs/plans/qc-surgery/02-lo-trinh.md +266 -0
- package/docs/plans/qc-surgery/buoc/0-01-testid-attr-co-cho-o.md +157 -0
- package/docs/plans/qc-surgery/buoc/0-02-mot-nguon-cho-testid-attr.md +135 -0
- package/docs/plans/qc-surgery/buoc/0-03-skill-thoi-day-do-dom.md +167 -0
- package/docs/plans/qc-surgery/buoc/0-04-may-canh-hop-dong.md +173 -0
- package/docs/plans/qc-surgery/buoc/0-05-don-nhan-cot-va-2b.md +133 -0
- package/docs/plans/qc-surgery/buoc/0-06-hop-dong-truoc-code.md +226 -0
- package/docs/plans/qc-surgery/buoc/1-01-guard-br-tag.md +156 -0
- package/docs/plans/qc-surgery/buoc/1-02-guard-sc-coverage.md +153 -0
- package/docs/plans/qc-surgery/buoc/1-03-fail-3-nhan.md +176 -0
- package/docs/plans/qc-surgery/buoc/1-04-self-review-dung-chung.md +175 -0
- package/docs/plans/qc-surgery/buoc/1-05-spec-la-du-lieu.md +164 -0
- package/docs/plans/qc-surgery/buoc/1-06-gap-verify-du-bo.md +162 -0
- package/docs/plans/qc-surgery/buoc/README.md +85 -0
- package/docs/plans/qc-surgery/exec-d0-b1-testid-attr-header.md +147 -0
- package/docs/plans/qc-surgery/exec-d0-b2-thong-nhat-nguon-testid-attr.md +152 -0
- package/docs/plans/qc-surgery/exec-d0-b3-sua-skill-probe-dom.md +173 -0
- package/docs/plans/qc-surgery/exec-d0-b4-may-canh-4-5-6.md +168 -0
- package/docs/plans/qc-surgery/exec-d0-b5-don-nhan-lech.md +196 -0
- package/docs/plans/qc-surgery/exec-d0-b6-contract-truoc-code.md +350 -0
- package/docs/plans/qc-surgery/exec-d1-b1-guard-br-tag.md +129 -0
- package/docs/plans/qc-surgery/exec-d1-b2-guard-sc-coverage.md +159 -0
- package/docs/plans/qc-surgery/exec-d1-b3-fail-3-bucket.md +158 -0
- package/docs/plans/qc-surgery/exec-d1-b4-self-review-principles.md +145 -0
- package/docs/plans/qc-surgery/exec-d1-b5-noi-quy-spec-la-du-lieu.md +156 -0
- package/docs/plans/qc-surgery/exec-d1-b6-gap-verify-mo-rong.md +179 -0
- package/docs/plans/qc-surgery/exec-d2-b1-tach-qc-review.md +166 -0
- package/docs/plans/qc-surgery/exec-d2-b2-tach-qc-run-test-atomic.md +267 -0
- package/docs/plans/qc-surgery/exec-d2-b3-qc-automation-assess.md +198 -0
- package/docs/plans/qc-surgery/exec-d3-b1-qc-report-gate-decision.md +209 -0
- package/docs/plans/qc-surgery/exec-d4-b1-qc-design-testdata.md +146 -0
- package/docs/plans/qc-surgery/exec-d4-b2-qc-smoke-test.md +179 -0
- package/docs/plans/qc-surgery/exec-d4-b3-qc-metrics-va-lint.md +198 -0
- package/docs/plans/qc-surgery/exec-d4-b4-lint-spec-injection.md +199 -0
- package/package.json +1 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-designer/api-testcase-designer/api/templates/endpoint.md
|
|
6
|
+
upstream_sha: 7b38edd94e5efd37ff561f53cff92adedabaff7f
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
> **VIẾT LẠI, không copy** *(B12)*. Bản upstream ra đời **trước** luật ATOMIC (đội QC chốt
|
|
10
|
+
> 2026-07-09) nên mỗi mẫu của nó gộp nhiều kết cục vào một `**Expected:**` nối bằng `;`, và
|
|
11
|
+
> dùng hệ mã `API-<FEATURE>-001` khác với `TC_<FEATURE>_NNN` mà phần còn lại dùng.
|
|
12
|
+
>
|
|
13
|
+
> Port nguyên là **dạy AI làm ngược luật vừa chốt** — mẫu cụ thể luôn thắng luật trừu tượng.
|
|
14
|
+
> Nội dung phủ (5 nhóm ca) giữ nguyên; cấu trúc TC theo `shared/tc-metadata-format.md`.
|
|
15
|
+
|
|
16
|
+
# Khuôn TC — một endpoint đơn
|
|
17
|
+
|
|
18
|
+
Mẫu khi viết TC cho 1 endpoint (GET / POST / PUT / DELETE). Thay mọi `<placeholder>` bằng giá
|
|
19
|
+
trị thật từ `TEST_PLAN.md` + hợp đồng API §4 của tech-doc gộp.
|
|
20
|
+
|
|
21
|
+
Phủ **5 nhóm ca**: happy · validation · auth thiếu token · auth sai quyền · not found.
|
|
22
|
+
Mã lỗi tra ở `http-status-codes.md`; header tra ở `common-headers.md`.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Nhóm ca 1 — Happy case
|
|
27
|
+
|
|
28
|
+
⚠️ **Một request thành công sinh RA NHIỀU kết cục → nhiều TC độc lập.** Upstream gộp
|
|
29
|
+
`HTTP 201; body.id = x; bản ghi có trong DB` vào một dòng — đó là **ba** kết cục:
|
|
30
|
+
|
|
31
|
+
### TC_<FEATURE>_001 — <METHOD> <path> trả về <success_code>
|
|
32
|
+
|
|
33
|
+
- **Title:** <METHOD> <path> với request hợp lệ trả về <success_code>
|
|
34
|
+
- **Feature:** <TICKET-ID> — <Tên feature>
|
|
35
|
+
- **Priority:** P0
|
|
36
|
+
- **Status:** Draft
|
|
37
|
+
- **Author:** AI
|
|
38
|
+
- **Tags:** api, happy-path, <feature-tag>
|
|
39
|
+
- **Trace:** BR-xx
|
|
40
|
+
- **@trace.verifies:** {UC-ID}-SC{N}
|
|
41
|
+
|
|
42
|
+
#### Preconditions
|
|
43
|
+
- Tài khoản role `<role>` đã có token hợp lệ.
|
|
44
|
+
- <Dữ liệu nền cần có, vd "đã tồn tại course id = 123">
|
|
45
|
+
|
|
46
|
+
#### Test Data
|
|
47
|
+
- Method: <GET|POST|PUT|DELETE>
|
|
48
|
+
- Path: `<path>`
|
|
49
|
+
- Headers:
|
|
50
|
+
- Authorization: Bearer `<valid_token_<role>>`
|
|
51
|
+
- Content-Type: application/json
|
|
52
|
+
- Body:
|
|
53
|
+
```json
|
|
54
|
+
{ "<field1>": "<valid_value>", "<field2>": "<valid_value>" }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
#### Test Steps
|
|
58
|
+
1. **[Action]** Gửi `<METHOD> <path>` với headers và body trên.
|
|
59
|
+
2. **[Verify]** Đọc status code của response.
|
|
60
|
+
|
|
61
|
+
#### Expected Result
|
|
62
|
+
- HTTP `<success_code>`
|
|
63
|
+
|
|
64
|
+
#### Teardown
|
|
65
|
+
- `DELETE <base_path>/{body.id}` — xoá bản ghi vừa tạo *(chỉ khi TC này tạo bản ghi thật)*
|
|
66
|
+
|
|
67
|
+
### TC_<FEATURE>_002 — body response chứa `<key_field>` đúng
|
|
68
|
+
|
|
69
|
+
- **Title:** <METHOD> <path> — body response có `<key_field>` = `<expected_value>`
|
|
70
|
+
- **Feature:** <TICKET-ID> — <Tên feature>
|
|
71
|
+
- **Priority:** P0
|
|
72
|
+
- **Status:** Draft
|
|
73
|
+
- **Author:** AI
|
|
74
|
+
- **Tags:** api, happy-path, <feature-tag>
|
|
75
|
+
- **Trace:** BR-xx
|
|
76
|
+
- **@trace.verifies:** {UC-ID}-SC{N}
|
|
77
|
+
|
|
78
|
+
#### Preconditions
|
|
79
|
+
- *(copy nguyên từ TC_001 — mỗi TC tách là testcase ĐỘC LẬP, giữ FULL steps)*
|
|
80
|
+
|
|
81
|
+
#### Test Data
|
|
82
|
+
- *(copy nguyên từ TC_001)*
|
|
83
|
+
|
|
84
|
+
#### Test Steps
|
|
85
|
+
1. **[Action]** Gửi `<METHOD> <path>` với headers và body trên.
|
|
86
|
+
2. **[Verify]** Đọc trường `<key_field>` trong body response.
|
|
87
|
+
|
|
88
|
+
#### Expected Result
|
|
89
|
+
- `body.<key_field>` = `<expected_value>`
|
|
90
|
+
|
|
91
|
+
#### Teardown
|
|
92
|
+
- `DELETE <base_path>/{body.id}` *(chỉ khi TC này tạo bản ghi thật)*
|
|
93
|
+
|
|
94
|
+
### TC_<FEATURE>_003 — side-effect được ghi
|
|
95
|
+
|
|
96
|
+
*Chỉ viết khi có side-effect cần verify. Nếu side-effect nằm ở DB/Kafka, TC này thuộc
|
|
97
|
+
**nhóm Integration API/DB/Kafka**, không thuộc nhóm Endpoint.*
|
|
98
|
+
|
|
99
|
+
- **Title:** <METHOD> <path> — bản ghi xuất hiện trong `<bảng>` với id = body.id
|
|
100
|
+
- **Priority:** P0
|
|
101
|
+
- **Tags:** api, integration, <feature-tag>
|
|
102
|
+
- **Trace:** BR-xx
|
|
103
|
+
|
|
104
|
+
#### Expected Result
|
|
105
|
+
- `<bảng>.id` = `body.id` AND `<bảng>.<cột>` = `<giá trị>`
|
|
106
|
+
|
|
107
|
+
> ✅ Bullet compound `A AND B` ở đây **hợp lệ**: cả hai vế nói về **cùng một** kết cục
|
|
108
|
+
> ("bản ghi đã được ghi đúng"). Còn `HTTP 201; body.id = x` là **hai** kết cục — phải tách.
|
|
109
|
+
> Phép soi nhanh: bullet nối bằng `;`, hoặc nối một khẳng định với một phủ định, là 2 kết cục.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Nhóm ca 2 — Validation: field bắt buộc để trống
|
|
114
|
+
|
|
115
|
+
### TC_<FEATURE>_004 — thiếu `<required_field>` trả về 400
|
|
116
|
+
|
|
117
|
+
- **Title:** POST <path> — thiếu `<required_field>` trả về 400
|
|
118
|
+
- **Priority:** P1
|
|
119
|
+
- **Status:** Draft
|
|
120
|
+
- **Author:** AI
|
|
121
|
+
- **Tags:** api, negative, validation, ep
|
|
122
|
+
- **Trace:** BR-xx
|
|
123
|
+
|
|
124
|
+
#### Test Data
|
|
125
|
+
- Method: POST
|
|
126
|
+
- Path: `<path>`
|
|
127
|
+
- Headers:
|
|
128
|
+
- Authorization: Bearer `<valid_token_<role>>`
|
|
129
|
+
- Content-Type: application/json
|
|
130
|
+
- Body: `{ }` — bỏ hẳn `<required_field>`
|
|
131
|
+
|
|
132
|
+
#### Test Steps
|
|
133
|
+
1. **[Action]** Gửi POST không có `<required_field>`.
|
|
134
|
+
2. **[Verify]** Đọc status code.
|
|
135
|
+
|
|
136
|
+
#### Expected Result
|
|
137
|
+
- HTTP 400
|
|
138
|
+
|
|
139
|
+
**Thông báo lỗi là một TC RIÊNG** — nội dung thông báo là oracle khác với mã trạng thái:
|
|
140
|
+
|
|
141
|
+
### TC_<FEATURE>_005 — thông báo lỗi nêu đúng field thiếu
|
|
142
|
+
|
|
143
|
+
#### Expected Result
|
|
144
|
+
- `body.message` contains `"<chuỗi nguyên văn từ PRD/tech-doc>"`
|
|
145
|
+
|
|
146
|
+
> ⚠️ Chuỗi này phải **có thật** trong PRD hoặc tech-doc của **chính feature này**. Chưa chốt →
|
|
147
|
+
> để trống + gắn `🚫 Block: [GAP-UC{N}-{nnn}](../DOC_GAP.md)`, **đừng bịa oracle**.
|
|
148
|
+
|
|
149
|
+
*Mỗi field bắt buộc là một cặp TC như trên. Field có ràng buộc độ dài/khoảng giá trị → thêm TC
|
|
150
|
+
BVA riêng, số giá trị biên tra ở `../shared/precision-rules.md` §7.*
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Nhóm ca 3 — Auth: không có token
|
|
155
|
+
|
|
156
|
+
### TC_<FEATURE>_006 — thiếu Authorization header trả về 401
|
|
157
|
+
|
|
158
|
+
- **Priority:** P0
|
|
159
|
+
- **Tags:** api, negative, auth, security
|
|
160
|
+
- **Trace:** BR-xx
|
|
161
|
+
|
|
162
|
+
#### Test Data
|
|
163
|
+
- Method: <METHOD>
|
|
164
|
+
- Path: `<path>`
|
|
165
|
+
- Headers: Content-Type: application/json — **bỏ hẳn** `Authorization`
|
|
166
|
+
|
|
167
|
+
#### Test Steps
|
|
168
|
+
1. **[Action]** Gửi `<METHOD> <path>` không kèm header `Authorization`.
|
|
169
|
+
2. **[Verify]** Đọc status code.
|
|
170
|
+
|
|
171
|
+
#### Expected Result
|
|
172
|
+
- HTTP 401
|
|
173
|
+
|
|
174
|
+
*Biến thể theo `common-headers.md` §"TC Negative liên quan header": token sai định dạng → 401 ·
|
|
175
|
+
`Content-Type` sai → 400 hoặc 415. Mỗi cái một TC.*
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## Nhóm ca 4 — Auth: đúng token, sai quyền
|
|
180
|
+
|
|
181
|
+
### TC_<FEATURE>_007 — token role `<wrong_role>` trả về 403
|
|
182
|
+
|
|
183
|
+
- **Priority:** P0
|
|
184
|
+
- **Tags:** api, negative, auth, security
|
|
185
|
+
- **Trace:** BR-xx
|
|
186
|
+
|
|
187
|
+
#### Test Data
|
|
188
|
+
- Headers: Authorization: Bearer `<valid_token_<wrong_role>>`
|
|
189
|
+
|
|
190
|
+
#### Test Steps
|
|
191
|
+
1. **[Action]** Gửi `<METHOD> <path>` bằng token của role không được phép.
|
|
192
|
+
2. **[Verify]** Đọc status code.
|
|
193
|
+
|
|
194
|
+
#### Expected Result
|
|
195
|
+
- HTTP 403
|
|
196
|
+
|
|
197
|
+
> **401 vs 403 là hai chuyện khác nhau** — 401 = chưa xác thực được anh là ai; 403 = biết anh
|
|
198
|
+
> là ai nhưng anh không được phép. Trộn hai cái là bỏ mất một lớp bảo mật khỏi phạm vi test.
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
|
|
202
|
+
## Nhóm ca 5 — Not found
|
|
203
|
+
|
|
204
|
+
### TC_<FEATURE>_008 — ID không tồn tại trả về 404
|
|
205
|
+
|
|
206
|
+
- **Priority:** P1
|
|
207
|
+
- **Tags:** api, negative, not-found
|
|
208
|
+
- **Trace:** BR-xx
|
|
209
|
+
|
|
210
|
+
#### Test Data
|
|
211
|
+
- Method: <GET|PUT|DELETE>
|
|
212
|
+
- Path: `<base_path>/<nonexistent_id>` (vd `/api/v1/courses/999999`)
|
|
213
|
+
- Headers: Authorization: Bearer `<valid_token_<role>>`
|
|
214
|
+
|
|
215
|
+
#### Test Steps
|
|
216
|
+
1. **[Action]** Gửi `<METHOD>` với ID chắc chắn không tồn tại trong hệ thống.
|
|
217
|
+
2. **[Verify]** Đọc status code.
|
|
218
|
+
|
|
219
|
+
#### Expected Result
|
|
220
|
+
- HTTP 404
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Nhắc lại ba luật hay bị bỏ
|
|
225
|
+
|
|
226
|
+
1. **Placeholder có tên rõ nghĩa** — `<valid_token_admin>`, `<expired_token>`,
|
|
227
|
+
`<token_wrong_role>`; **không** dùng `<token>` chung chung *(`common-headers.md` §Quy ước)*.
|
|
228
|
+
2. **`#### Teardown` là section riêng, KHÔNG phải bullet của Expected Result.** TC tạo bản ghi
|
|
229
|
+
thật thì bắt buộc có; TC chỉ GET hoặc chỉ cấu hình mock thì **không cần**.
|
|
230
|
+
3. **Mọi TC tách vẫn giữ FULL Test Steps** — lặp đủ bước để tới trạng thái assert. Không cắt
|
|
231
|
+
bước theo từng bullet, không đánh `(1/N)`, không hậu tố `001a`/`001b`.
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: 1.0
|
|
3
|
+
updated: 2026-09-04
|
|
4
|
+
ported_from: ui-automation-testing
|
|
5
|
+
upstream_path: skills/qa-tc-designer/api-testcase-designer/api/references/http-status-codes.md
|
|
6
|
+
upstream_sha: a82baa99350f63955245764a6aa57c9dca6d055f
|
|
7
|
+
---
|
|
8
|
+
# Bảng tra cứu — HTTP Status Codes
|
|
9
|
+
|
|
10
|
+
Dùng để điền chính xác mã lỗi vào cột Expected của TC API.
|
|
11
|
+
Tra theo nhóm (2xx/4xx/5xx) hoặc theo tình huống.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 2xx — Thành công
|
|
16
|
+
|
|
17
|
+
| Mã | Tên | Dùng khi | Expected điển hình |
|
|
18
|
+
|---|---|---|---|
|
|
19
|
+
| 200 | OK | GET, PUT thành công; login | Body chứa data/resource |
|
|
20
|
+
| 201 | Created | POST tạo bản ghi mới | Body chứa `id` + resource mới |
|
|
21
|
+
| 204 | No Content | DELETE thành công; PUT không trả body | Body rỗng |
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## 4xx — Lỗi phía client
|
|
26
|
+
|
|
27
|
+
| Mã | Tên | Dùng khi | Expected điển hình |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| 400 | Bad Request | Body/params sai format, thiếu field bắt buộc, giá trị không hợp lệ | `body.message` hoặc `body.errors` mô tả field lỗi |
|
|
30
|
+
| 401 | Unauthorized | Không có token, token hết hạn, token sai | `body.message` = "Unauthorized" hoặc "Token invalid/expired" |
|
|
31
|
+
| 403 | Forbidden | Token hợp lệ nhưng không đủ quyền (sai role) | `body.message` = "Forbidden" hoặc "Access denied" |
|
|
32
|
+
| 404 | Not Found | Resource ID không tồn tại | `body.message` = "Not found" |
|
|
33
|
+
| 409 | Conflict | Tạo trùng bản ghi (unique constraint) | `body.message` mô tả field trùng |
|
|
34
|
+
| 422 | Unprocessable Entity | Business rule validation (vd: ngày end < ngày start) | `body.errors` liệt kê vi phạm |
|
|
35
|
+
| 429 | Too Many Requests | Vượt rate limit | `Retry-After` header; body thông báo limit |
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 5xx — Lỗi phía server (không test chủ động; ghi vào TC edge nếu plan đề cập)
|
|
40
|
+
|
|
41
|
+
| Mã | Tên | Ghi chú |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| 500 | Internal Server Error | Không nên trigger trong test bình thường; ghi vào TC nếu plan có scenario |
|
|
44
|
+
| 503 | Service Unavailable | Chỉ test trong integration/availability scope |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Mapping tình huống → mã (LMS Edupia)
|
|
49
|
+
|
|
50
|
+
| Tình huống | Mã kỳ vọng | Ghi chú |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| Login đúng | 200 | Body có `access_token` |
|
|
53
|
+
| Login sai password | 401 hoặc 400 | Xác nhận lại với dev |
|
|
54
|
+
| Tạo mới thành công | 201 | Body có `id` |
|
|
55
|
+
| Lấy danh sách | 200 | Body có `data[]` + `pagination` |
|
|
56
|
+
| Lấy 1 record hợp lệ | 200 | Body có đầy đủ fields |
|
|
57
|
+
| Xóa thành công | 200 hoặc 204 | Xác nhận lại với dev |
|
|
58
|
+
| Field bắt buộc để trống | 400 | `body.errors` có field name |
|
|
59
|
+
| Vượt độ dài tối đa | 400 | `body.errors` có field name + giới hạn |
|
|
60
|
+
| Format sai (email/phone) | 400 | `body.errors` mô tả format |
|
|
61
|
+
| Token không có | 401 | — |
|
|
62
|
+
| Token hết hạn | 401 | — |
|
|
63
|
+
| Role không đủ quyền | 403 | — |
|
|
64
|
+
| ID không tồn tại | 404 | — |
|
|
65
|
+
| Tên/code trùng | 409 | Xác nhận field unique với dev |
|
|
66
|
+
| Ngày end trước ngày start | 422 | Business rule validation |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Cấu trúc body lỗi chuẩn (tham khảo)
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
// 400 / 422 — validation error
|
|
74
|
+
{
|
|
75
|
+
"statusCode": 400,
|
|
76
|
+
"message": "Validation failed",
|
|
77
|
+
"errors": [
|
|
78
|
+
{ "field": "name", "message": "Trường này là bắt buộc" },
|
|
79
|
+
{ "field": "startDate", "message": "Ngày bắt đầu không được để trống" }
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// 401 — unauthorized
|
|
84
|
+
{
|
|
85
|
+
"statusCode": 401,
|
|
86
|
+
"message": "Unauthorized"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 403 — forbidden
|
|
90
|
+
{
|
|
91
|
+
"statusCode": 403,
|
|
92
|
+
"message": "Forbidden resource"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 404 — not found
|
|
96
|
+
{
|
|
97
|
+
"statusCode": 404,
|
|
98
|
+
"message": "Resource not found"
|
|
99
|
+
}
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
> Cấu trúc thực tế có thể khác — xác nhận với dev/API spec trước khi điền vào TC.
|
|
@@ -17,11 +17,14 @@ Skill **tự chứa** để viết TC end-to-end: hành trình đầu→cuối x
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
## Format file TC
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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ừ).
|
|
25
28
|
|
|
26
29
|
## Kỹ thuật áp dụng
|
|
27
30
|
- **Use Case/Scenario:** mỗi journey = main + alternate + exception flow.
|
|
@@ -34,8 +37,10 @@ Lấy danh sách journey + trục bao phủ + verify points từ TEST_PLAN · m
|
|
|
34
37
|
|
|
35
38
|
## Phase 2 — Write
|
|
36
39
|
Mỗi journey → 1 TC bám Format; Expected = chuỗi verify point; chuẩn bị tiền điều kiện & cleanup, mỗi journey độc lập.
|
|
37
|
-
**Journey phụ thuộc gap vẫn viết + 🚫 Block: GAP-
|
|
40
|
+
**Journey phụ thuộc gap vẫn viết + 🚫 Block: [GAP-UC{N}-{nnn}]**, định tuyến ghi "dự kiến theo BR". Trace BR.
|
|
38
41
|
|
|
39
42
|
## Output
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
|
|
44
|
+
Ghi vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` — **Nhóm 6 E2E**. Mỗi journey một TC; tiền điều kiện · kết quả/định tuyến kỳ vọng · BR · phụ thuộc gap · priority ghi dạng trường danh sách.
|
|
45
|
+
|
|
46
|
+
**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`.
|
|
@@ -66,3 +66,5 @@ Sinh 10-15 câu hỏi cho dev/BA (assumptions, edge case, error handling, securi
|
|
|
66
66
|
Charter files: {paths.qc_dir}/exploratory/charters/<feature>_01.md, _02.md...
|
|
67
67
|
Ideas file: {paths.qc_dir}/exploratory/ideas/<feature>.md
|
|
68
68
|
Bảng tổng kết: STT | Charter | Tour | Risk | Time-box
|
|
69
|
+
|
|
70
|
+
*(Charter KHÔNG phải file TC — luật "không bảng" chỉ áp cho `*.Test.md`. Charter chuyển thành TC ở `explore-to-functional.md`, lúc đó mới theo luật đó.)*
|
|
@@ -32,12 +32,15 @@ So requirement vs draft: requirement chưa phủ → thêm TC · TC sai logic
|
|
|
32
32
|
chỉnh Priority theo business. Không có requirement → giữ draft Phase 2.
|
|
33
33
|
|
|
34
34
|
## Phase 4 — Convert to Functional (format chuẩn)
|
|
35
|
-
Chuyển draft → TC chính thức bám **format file `TC_<FEATURE>.md`**:
|
|
35
|
+
Chuyển draft → TC chính thức bám **format file `TC_<FEATURE>.Test.md`**:
|
|
36
36
|
- Metadata **list**: Title · Feature · Priority(P0/P1/P2) · Status(Draft) · Author(AI) · Tags ·
|
|
37
|
-
**Trace** `[BR-xx](REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có BR → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-
|
|
37
|
+
**Trace** `[BR-xx](../REQUIREMENT_ANALYSIS.md#3-business-rules)` (không có BR → `⚠️ Chưa có Business Rule`) · **🚫 Block** `[GAP-UC{N}-{nnn}]` nếu chặn.
|
|
38
38
|
- **Test Data** dạng list · **Steps** `[Action]`/`[Verify]` · **Expected** 1 bullet cụ thể.
|
|
39
39
|
- Phân nhóm GUI/Functional · cuối file: Trace matrix + bảng TC block · bỏ nội dung gạch ngang.
|
|
40
|
-
- Đặt file `{qc_artifact_dir}test-cases/TC_<FEATURE>.md
|
|
40
|
+
- Đặt file `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` (nhóm 3 Functional).
|
|
41
41
|
|
|
42
42
|
## Output
|
|
43
|
-
|
|
43
|
+
|
|
44
|
+
Ghi TC đã chuyển thành functional vào `{qc_artifact_dir}test-cases/TC_<FEATURE>.Test.md` — **Nhóm 3 Functional**.
|
|
45
|
+
|
|
46
|
+
**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`.
|
|
@@ -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`.
|