spec-lite 1.5.2 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -8
- package/package.json +1 -1
- package/skills/ado-create/SKILL.md +1 -1
- package/skills/archive/SKILL.md +63 -52
- package/skills/artifact-audit/SKILL.md +3 -3
- package/skills/artifact-migrate/SKILL.md +3 -3
- package/skills/spec-brownfield-feature/SKILL.md +1 -1
- package/skills/spec-frd/SKILL.md +17 -10
- package/skills/spec-new/SKILL.md +15 -11
- package/skills/spec-test/SKILL.md +60 -59
- package/skills/spec-test-design/SKILL.md +243 -0
- package/skills/spec-test-exec/SKILL.md +251 -0
- package/skills-overview.md +43 -29
- package/templates/integrations/test-template.md +47 -25
- package/templates/main/feature/frd-template.md +43 -8
- package/templates/main/feature/test-design-template.md +289 -0
- package/templates/main/prd-template.md +2 -0
- package/templates/test-executions/test-exec-dm-template.md +83 -0
- package/templates/test-executions/test-exec-e2e-auto-template.md +299 -0
- package/templates/test-executions/test-exec-e2e-manual-template.md +231 -0
- package/templates/test-executions/test-exec-func-auto-template.md +155 -0
- package/templates/test-executions/test-exec-func-manual-template.md +203 -0
- package/templates/test-executions/test-exec-nfr-template.md +88 -0
- package/skills/spec-tsd/SKILL.md +0 -241
- package/templates/main/feature/tsd-template.md +0 -238
|
@@ -4,10 +4,15 @@ type: frd
|
|
|
4
4
|
status: draft
|
|
5
5
|
owner: "{BA}"
|
|
6
6
|
feature_id: "{Feature ID từ PRD Feature Index}"
|
|
7
|
-
template_version:
|
|
7
|
+
template_version: 2
|
|
8
8
|
migrations:
|
|
9
9
|
- to: 1
|
|
10
10
|
note: "baseline"
|
|
11
|
+
- to: 2
|
|
12
|
+
note: "Tách FAC theo type/execution-mode: FAC rescope còn end-to-end (journey + consistency + integrity); tách entries loại NFR → section 'Non-Functional Requirements' và loại data/migration → section 'Data & Migration', cả hai required-emptyable (heading luôn hiện, để trống nếu không có). NFR-F* tham chiếu NFR-* của PRD nếu có thể. Test case downstream giữ prefix TC-F*."
|
|
13
|
+
add: ["Non-Functional Requirements", "Data & Migration"]
|
|
14
|
+
update:
|
|
15
|
+
- { section: "Feature Acceptance Criteria", change: "rescope còn end-to-end (e2e liên story + cross-story consistency + integrity); tách entries loại NFR → section 'Non-Functional Requirements' (required-emptyable), loại data/migration → section 'Data & Migration' (required-emptyable); relocate tương tác, e2e/consistency giữ nguyên" }
|
|
11
16
|
referenced_by:
|
|
12
17
|
- conventions.md > 3. Main Artifacts > 3.3 Feature level > frd.md > Cấu trúc
|
|
13
18
|
- skills/spec-frd/SKILL.md > Process > Bước 5: Write — sinh draft
|
|
@@ -55,25 +60,55 @@ flowchart TD
|
|
|
55
60
|
|
|
56
61
|
## Feature Acceptance Criteria
|
|
57
62
|
|
|
58
|
-
Criteria áp
|
|
63
|
+
Criteria **end-to-end** áp cho toàn feature mà Story AC lẻ không cover được — verify sự **kết nối giữa các phần** (emergent), không phải behavior từng story. Mọi Feature AC phải test được pass/fail.
|
|
59
64
|
|
|
60
|
-
|
|
61
|
-
- **
|
|
62
|
-
- **
|
|
63
|
-
- **
|
|
64
|
-
- **Data & migration** — backfill, schema migration, không mất data cũ.
|
|
65
|
+
Gồm 3 shape (đều functional, scope rộng — trục phân chia + lý do xem `terms/001-frd-fac-pillars.md`; nền tảng type/scope xem `terms/002-functional-test-vs-e2e-test.md`):
|
|
66
|
+
- **Journey (liên story)** — full happy path đi *tuần tự* qua nhiều story trong 1 session; verify state persist + không đứt giữa các bước.
|
|
67
|
+
- **Consistency (đa màn)** — UI/behavior đồng nhất khi *so* nhiều màn trong feature với nhau.
|
|
68
|
+
- **Integrity (bất biến liên story)** — business invariant phải đúng khi *kết hợp* nhiều story, **không nhất thiết theo trình tự** (vd: xóa account → cascade xóa mọi order ở mọi module; tổng/đối soát khớp sau nhiều thao tác). Verify *trạng thái nhất quán cuối cùng*, không phải hành trình tuần tự — đây là nhà cho cross-story functional rule mà journey/consistency không ôm.
|
|
65
69
|
|
|
70
|
+
> NFR (performance, a11y, security, browser, i18n) và Data & Migration **KHÔNG** thuộc đây — chúng có section riêng bên dưới (khác type / execution-mode).
|
|
66
71
|
> Out of scope: release readiness (runbook/rollout/legal sign-off) và success metric/KPI post-release — đặt ở artifact khác (`tech.md`, `sad.md`, hoặc PMO checklist).
|
|
67
72
|
|
|
68
73
|
Feature AC ID format: `FAC-F{NNN}-{seq}` — counter **độc lập** với Story AC (`AC-F{NNN}-{seq}`). ID **stable** — không tái sử dụng seq khi xóa, không renumber.
|
|
69
74
|
|
|
70
|
-
Format: **Given/When/Then bắt buộc** — kể cả
|
|
75
|
+
Format: **Given/When/Then bắt buộc** — kể cả consistency. **Then phải đo được**: ngưỡng cụ thể HOẶC danh sách item so sánh.
|
|
71
76
|
|
|
72
77
|
- `FAC-{F_ID}-001`
|
|
73
78
|
- **Given** {precondition đo được}
|
|
74
79
|
- **When** {action}
|
|
75
80
|
- **Then** {outcome có threshold hoặc danh sách cụ thể, không vague}
|
|
76
81
|
|
|
82
|
+
## Non-Functional Requirements
|
|
83
|
+
|
|
84
|
+
<!-- Required-emptyable: GIỮ heading; để trống (không bullet) nếu feature không có NFR riêng ngoài bar chung của PRD. -->
|
|
85
|
+
|
|
86
|
+
NFR áp cho feature — **non-functional type** (performance, accessibility, security, browser support, i18n). Khác Feature AC ở chỗ verify *chất lượng dưới điều kiện*, không phải *làm đúng việc*.
|
|
87
|
+
|
|
88
|
+
> **Security — phân biệt rõ type:** access-control / authz rules ("role X không được thấy/làm Y") là **functional** → đặt ở Story AC hoặc Verification Rules, KHÔNG vào đây. Chỉ phần **non-functional** của security (pentest, vulnerability scan, security posture / hardening — verify bằng scanner, không phải walk UI) mới là NFR.
|
|
89
|
+
|
|
90
|
+
Quan hệ với PRD: mỗi NFR **tham chiếu `NFR-*` của PRD nếu có thể** (refine/siết bar chung cho feature này); nếu là yêu cầu **đặc thù-feature** mà PRD không có → đứng độc lập (không ref).
|
|
91
|
+
|
|
92
|
+
NFR ID format: `NFR-F{NNN}-{seq}` — counter độc lập. ID **stable** — không tái sử dụng seq khi xóa, không renumber. Format **Given/When/Then bắt buộc**, **Then đo được** (ngưỡng cụ thể).
|
|
93
|
+
|
|
94
|
+
- `NFR-{F_ID}-001` *(refines `NFR-P01` — nếu có)*
|
|
95
|
+
- **Given** {điều kiện đo được — vd: 100 RPS sustained 5 phút}
|
|
96
|
+
- **When** {action}
|
|
97
|
+
- **Then** {ngưỡng cụ thể — vd: p95 ≤ 500ms, error rate ≤ 0.1%}
|
|
98
|
+
|
|
99
|
+
## Data & Migration
|
|
100
|
+
|
|
101
|
+
<!-- Required-emptyable: GIỮ heading; để trống (không bullet) nếu feature không đụng migration / backfill data cũ. -->
|
|
102
|
+
|
|
103
|
+
Yêu cầu về **dữ liệu cũ qua nâng cấp** — backfill, schema migration, không mất/hỏng data hiện hữu. Functional-type nhưng execution-mode riêng (chạy migration trên dataset, không phải UI flow).
|
|
104
|
+
|
|
105
|
+
DM ID format: `DM-F{NNN}-{seq}` — counter độc lập. ID **stable** — không tái sử dụng seq khi xóa, không renumber. Format **Given/When/Then bắt buộc**, **Then đo được** (đếm bản ghi / so khớp cụ thể).
|
|
106
|
+
|
|
107
|
+
- `DM-{F_ID}-001`
|
|
108
|
+
- **Given** {dataset cũ đo được — vd: 10.000 bản ghi địa chỉ format cũ}
|
|
109
|
+
- **When** {chạy migration}
|
|
110
|
+
- **Then** {kết quả đo được — vd: 10.000/10.000 đọc được, 0 bản ghi null, count khớp trước/sau}
|
|
111
|
+
|
|
77
112
|
## User Stories
|
|
78
113
|
|
|
79
114
|
US ID format: `US-F{NNN}-{seq}` — đánh số tăng dần toàn feature. ID **stable** — không tái sử dụng seq khi xóa, không renumber.
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: test-design-{feature}
|
|
3
|
+
type: test-design
|
|
4
|
+
status: draft
|
|
5
|
+
owner: "{QC}"
|
|
6
|
+
feature_id: "{Feature ID — match frd.md}"
|
|
7
|
+
frd_ref: "feature/{F-XXX}-{slug}/frd.md"
|
|
8
|
+
template_version: 3
|
|
9
|
+
migrations:
|
|
10
|
+
- to: 1
|
|
11
|
+
note: "baseline"
|
|
12
|
+
- to: 2
|
|
13
|
+
note: "Mirror frd v2 + trim execution-leakage (giữ vai WHAT). Tách 'Feature AC Test Cases' (v1) theo type/execution-mode: đổi tên → 'E2E Test Cases' (chỉ FAC end-to-end: journey/consistency/integrity), tách TC loại NFR → 'Non-Functional Test Cases' và loại data/migration → 'Data & Migration Test Cases', cả hai required-emptyable. TC giữ prefix TC-F* chung sequence."
|
|
14
|
+
add: ["E2E Test Cases", "Non-Functional Test Cases", "Data & Migration Test Cases"]
|
|
15
|
+
remove:
|
|
16
|
+
- { section: "Feature AC Test Cases", reason: "đổi tên → 'E2E Test Cases' (chỉ cover FAC end-to-end) + tách TC Type=NFR → 'Non-Functional Test Cases' (required-emptyable), Type=data/migration → 'Data & Migration Test Cases' (required-emptyable); carry-over toàn bộ TC theo field Type, không mất nội dung" }
|
|
17
|
+
- { section: "Test Strategy > Environments", reason: "env assignment/scheduling là execution concern — design chỉ cần env requirement ở per-TC Preconditions" }
|
|
18
|
+
update:
|
|
19
|
+
- { section: "Test Data", change: "đổi thành 'Test Data Requirements' — bỏ cột Nguồn (fixture/factory = provisioning) + Refresh (cadence = execution), thêm cột 'Yêu cầu data (shape)'" }
|
|
20
|
+
- to: 3
|
|
21
|
+
note: "Thêm field Autoable (YES/MAYBE/NO) cho TC — test-design là SOURCE OF TRUTH route TC vào func-auto (YES/MAYBE) vs func-manual (toàn bộ + NO); hai track chỉ đọc, không tự quyết. Phân loại theo oracle của Expected: lập trình được (giá trị/state/record/HTTP/message/route)=YES, lập trình được nhưng setup nặng=MAYBE, visual (màu/layout/icon/animation)=NO. Mọi Validation TC = YES theo định nghĩa (không cần cột riêng)."
|
|
22
|
+
update:
|
|
23
|
+
- { section: "Functional Test Cases", change: "thêm field 'Autoable' (YES/MAYBE/NO) vào mỗi TC block + rule phân loại theo oracle ở đầu section" }
|
|
24
|
+
- { section: "Validation Test Cases", change: "ghi rõ mọi VR-derived TC = Autoable=YES (uniform, không thêm cột)" }
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
<!--
|
|
28
|
+
Canonical format cho feature/{F-XXX}-{slug}/test-design.md.
|
|
29
|
+
Sinh từ frd.md — mỗi AC / VR / Flow phải có ít nhất 1 test case cover.
|
|
30
|
+
Traceability Matrix ở cuối là source of truth để kiểm tra coverage trước khi đóng feature.
|
|
31
|
+
|
|
32
|
+
Test Design chỉ tồn tại ở FEATURE level — không tách test-design riêng cho component.
|
|
33
|
+
Component là internal building block; contract của component được verify gián tiếp qua TC ở đây
|
|
34
|
+
và qua unit test trong code (không phải spec artifact).
|
|
35
|
+
-->
|
|
36
|
+
|
|
37
|
+
# Test Design: {Feature Name}
|
|
38
|
+
|
|
39
|
+
## Overview
|
|
40
|
+
|
|
41
|
+
{Phạm vi test-design này — feature gì, các luồng / AC / VR chính cần verify, trong 2-3 câu.}
|
|
42
|
+
|
|
43
|
+
## Test Strategy
|
|
44
|
+
|
|
45
|
+
### Approach
|
|
46
|
+
|
|
47
|
+
- **Functional**: verify từng US / Story AC theo happy + edge.
|
|
48
|
+
- **Validation**: derive 1:1 từ Verification Rules.
|
|
49
|
+
- **Flow-based (E2E)**: chạy theo Mermaid flows trong frd.
|
|
50
|
+
- **Feature AC (end-to-end)**: cover `FAC-*` — journey liên story + cross-story consistency.
|
|
51
|
+
- **Non-functional**: cover `NFR-*` — performance / a11y / security (execution-mode riêng: load test, scanner...).
|
|
52
|
+
- **Data & migration** *(nếu có)*: cover `DM-*` — chạy migration trên dataset, verify data cũ không mất/hỏng.
|
|
53
|
+
|
|
54
|
+
> Yêu cầu env của mỗi test class ghi inline ở **Preconditions** từng TC (vd "env perf-test", "dataset prod-like đã load"). Gán env tier cụ thể + lịch chạy thuộc **execution layer** — không ở test-design.
|
|
55
|
+
|
|
56
|
+
## Test Scenarios
|
|
57
|
+
|
|
58
|
+
Mỗi scenario gắn với 1 flow trong `frd.md > User Flows`. Scenario mô tả end-to-end path; test case chi tiết liệt kê ở section bên dưới.
|
|
59
|
+
|
|
60
|
+
TS ID format: `TS-F{NNN}-{seq}` — đánh số tăng dần toàn feature. ID **stable** — đã assign rồi giữ nguyên kể cả khi xóa (không tái sử dụng seq, không renumber).
|
|
61
|
+
|
|
62
|
+
### TS-{F_ID}-001: {Tên — match Flow 1 trong frd}
|
|
63
|
+
|
|
64
|
+
- **Flow ref:** `frd.md > Flow 1: {tên}`
|
|
65
|
+
- **Preconditions:** {state trước khi chạy}
|
|
66
|
+
- **Postconditions:** {state sau khi pass}
|
|
67
|
+
- **Paths:**
|
|
68
|
+
- Happy: A → B → C(happy) → D → F
|
|
69
|
+
- Edge: A → B → C(edge) → E → G
|
|
70
|
+
- **Test cases:** `TC-{F_ID}-001`, `TC-{F_ID}-002`, ...
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
### TS-{F_ID}-002: {Tên — match Flow 2 nếu có}
|
|
75
|
+
|
|
76
|
+
...
|
|
77
|
+
|
|
78
|
+
## Functional Test Cases
|
|
79
|
+
|
|
80
|
+
Cover User Stories và Acceptance Criteria trong frd.
|
|
81
|
+
|
|
82
|
+
TC ID format: `TC-F{NNN}-{seq}` — đánh số tăng dần toàn feature. ID **stable** (không tái sử dụng seq khi xóa, không renumber). Nếu xóa TC → ID đó retire, seq mới tiếp tục tăng từ max.
|
|
83
|
+
|
|
84
|
+
**Autoable** — test-design là **source of truth** cho field này; cả `test-exec-func-auto` lẫn `test-exec-func-manual` **chỉ đọc**, không tự quyết. Route TC vào đâu: func-auto cover `YES/MAYBE`, func-manual cover **toàn bộ** + `NO`. Phân loại theo **oracle của Expected** (cái mà outcome được verify):
|
|
85
|
+
|
|
86
|
+
- `YES` — oracle **lập trình được**: giá trị / state / record / HTTP status / error-message text / route / computed result. *(Mọi Validation TC ⇒ YES theo định nghĩa.)*
|
|
87
|
+
- `MAYBE` — oracle lập trình được **nhưng** chỉ tới được qua setup nặng: multi-entity seed, cross-service integration, prior state phức tạp.
|
|
88
|
+
- `NO` — oracle **visual**: màu / spacing / layout / icon-asset render / animation / "trông đúng". Hiếm có `TC-F*` — assertion visual thuần thường không thành AC nên thành exploratory (không ID) ở manual, không phải TC này.
|
|
89
|
+
|
|
90
|
+
### TC-{F_ID}-001: {Title ngắn — verb-first}
|
|
91
|
+
|
|
92
|
+
| Field | Value |
|
|
93
|
+
| --- | --- |
|
|
94
|
+
| **Type** | Functional — positive / negative |
|
|
95
|
+
| **Autoable** | YES / MAYBE / NO — phân loại theo oracle (rule ở đầu section) |
|
|
96
|
+
| **Priority** | P0 / P1 / P2 |
|
|
97
|
+
| **Covers** | `US-{F_ID}-001`, `AC-{F_ID}-001` |
|
|
98
|
+
| **Scenario** | `TS-{F_ID}-001` |
|
|
99
|
+
| **Preconditions** | ... |
|
|
100
|
+
|
|
101
|
+
**Steps:**
|
|
102
|
+
|
|
103
|
+
1. {action}
|
|
104
|
+
2. {action}
|
|
105
|
+
3. {action}
|
|
106
|
+
|
|
107
|
+
**Expected:**
|
|
108
|
+
|
|
109
|
+
- {observable outcome 1}
|
|
110
|
+
- {observable outcome 2}
|
|
111
|
+
|
|
112
|
+
**Test data:** {ref Test Data Requirements hoặc inline literal}
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### TC-{F_ID}-002: ...
|
|
117
|
+
|
|
118
|
+
## Validation Test Cases
|
|
119
|
+
|
|
120
|
+
Derive 1:1 từ Verification Rules trong frd. **Mọi Validation TC ⇒ `Autoable=YES`** (oracle input→accept/reject, logic thuần — không phụ thuộc visual); uniform nên không thêm cột. Mỗi `VR-F{NNN}-{seq}` cần ít nhất:
|
|
121
|
+
- 1 positive (rule pass)
|
|
122
|
+
- 1+ negative — mỗi nhánh fail là 1 case riêng (vd VR "email format" → 1 case cho missing `@`, 1 case cho missing domain, ...)
|
|
123
|
+
|
|
124
|
+
Form bảng để dễ scan; case phức tạp có thể tách ra block riêng như Functional TC.
|
|
125
|
+
|
|
126
|
+
| TC ID | Covers VR | Field | Input | Expected | Polarity |
|
|
127
|
+
| --- | --- | --- | --- | --- | --- |
|
|
128
|
+
| `TC-{F_ID}-010` | `VR-{F_ID}-001` | `email` | `"user@example.com"` | accept | positive |
|
|
129
|
+
| `TC-{F_ID}-011` | `VR-{F_ID}-001` | `email` | `""` | reject — required | negative |
|
|
130
|
+
| `TC-{F_ID}-012` | `VR-{F_ID}-001` | `email` | `"abc"` | reject — invalid format | negative |
|
|
131
|
+
|
|
132
|
+
## E2E Test Cases
|
|
133
|
+
|
|
134
|
+
Cover Feature Acceptance Criteria (`FAC-*`) trong frd — **end-to-end** (journey + consistency + integrity). FAC ở frd đã ở format G/W/T → TC dịch 1:1: Given → Preconditions, When → Steps, Then → Expected. Phân biệt shape bằng field **Type**: `E2E — journey` = tuần tự liên story / `E2E — consistency` = so khớp đa màn / `E2E — integrity` = assert business invariant sau khi kết hợp nhiều story (không nhất thiết tuần tự) (không có TC riêng cho NFR / data ở đây — xem 2 section bên dưới).
|
|
135
|
+
|
|
136
|
+
### TC-{F_ID}-040: {Title — e2e journey liên story}
|
|
137
|
+
|
|
138
|
+
| Field | Value |
|
|
139
|
+
| --- | --- |
|
|
140
|
+
| **Type** | E2E — journey |
|
|
141
|
+
| **Priority** | P0 / P1 / P2 |
|
|
142
|
+
| **Covers** | `FAC-{F_ID}-001` |
|
|
143
|
+
| **Spans** | `US-{F_ID}-001`, `US-{F_ID}-002`, `US-{F_ID}-003` |
|
|
144
|
+
| **Preconditions** | account mới chưa onboard |
|
|
145
|
+
|
|
146
|
+
**Steps:**
|
|
147
|
+
|
|
148
|
+
1. Đăng ký account mới
|
|
149
|
+
2. Verify email qua link
|
|
150
|
+
3. Hoàn thành onboarding form
|
|
151
|
+
4. Thực hiện first transaction
|
|
152
|
+
|
|
153
|
+
**Expected:**
|
|
154
|
+
|
|
155
|
+
- Toàn bộ flow chạy trong 1 session, không cần support intervene
|
|
156
|
+
- State persist đúng giữa các step (refresh không mất tiến độ)
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
### TC-{F_ID}-041: {Title — consistency}
|
|
161
|
+
|
|
162
|
+
| Field | Value |
|
|
163
|
+
| --- | --- |
|
|
164
|
+
| **Type** | E2E — consistency |
|
|
165
|
+
| **Priority** | P1 |
|
|
166
|
+
| **Covers** | `FAC-{F_ID}-002` |
|
|
167
|
+
| **Preconditions** | feature đã deploy lên test env, 3 màn Register / Profile / Admin Create accessible |
|
|
168
|
+
|
|
169
|
+
**Steps:**
|
|
170
|
+
|
|
171
|
+
1. Trigger empty `email` validation ở Register
|
|
172
|
+
2. Trigger empty `email` validation ở Profile
|
|
173
|
+
3. Trigger empty `email` validation ở Admin Create
|
|
174
|
+
4. Trigger invalid format `"abc"` ở cả 3 màn
|
|
175
|
+
|
|
176
|
+
**Expected:**
|
|
177
|
+
|
|
178
|
+
- 3 message ở step 1-3 identical (cùng text, cùng style)
|
|
179
|
+
- 3 message ở step 4 identical
|
|
180
|
+
|
|
181
|
+
---
|
|
182
|
+
|
|
183
|
+
## Non-Functional Test Cases
|
|
184
|
+
|
|
185
|
+
<!-- Required-emptyable: GIỮ heading; để trống (không TC) nếu section Non-Functional Requirements ở frd rỗng. -->
|
|
186
|
+
|
|
187
|
+
Cover `NFR-*` trong frd. **Non-functional type** — execution-mode riêng (load test / scanner / a11y audit), không phải UI walk. Type = `performance` / `a11y` / `security` / ... TC giữ prefix `TC-F*` chung sequence.
|
|
188
|
+
|
|
189
|
+
### TC-{F_ID}-050: {Title — NFR perf}
|
|
190
|
+
|
|
191
|
+
| Field | Value |
|
|
192
|
+
| --- | --- |
|
|
193
|
+
| **Type** | Non-functional — performance |
|
|
194
|
+
| **Priority** | P0 |
|
|
195
|
+
| **Covers** | `NFR-{F_ID}-001` |
|
|
196
|
+
| **Preconditions** | env perf-test, dataset baseline đã load |
|
|
197
|
+
|
|
198
|
+
**Steps:**
|
|
199
|
+
|
|
200
|
+
1. Chạy load test (k6 / JMeter) profile 100 RPS sustained 5 phút lên `/login`
|
|
201
|
+
2. Đọc p95 latency từ summary report
|
|
202
|
+
|
|
203
|
+
**Expected:**
|
|
204
|
+
|
|
205
|
+
- p95 ≤ 500ms
|
|
206
|
+
- Error rate ≤ 0.1%
|
|
207
|
+
|
|
208
|
+
## Data & Migration Test Cases
|
|
209
|
+
|
|
210
|
+
<!-- Required-emptyable: GIỮ heading; để trống (không TC) nếu section Data & Migration ở frd rỗng. -->
|
|
211
|
+
|
|
212
|
+
Cover `DM-*` trong frd. Chạy migration trên dataset prod-like rồi assert data cũ nguyên vẹn. Type = `data migration`. TC giữ prefix `TC-F*` chung sequence.
|
|
213
|
+
|
|
214
|
+
### TC-{F_ID}-060: {Title — migrate data cũ}
|
|
215
|
+
|
|
216
|
+
| Field | Value |
|
|
217
|
+
| --- | --- |
|
|
218
|
+
| **Type** | Data migration |
|
|
219
|
+
| **Priority** | P0 |
|
|
220
|
+
| **Covers** | `DM-{F_ID}-001` |
|
|
221
|
+
| **Preconditions** | env có dataset cũ prod-like (vd: 10.000 bản ghi địa chỉ format cũ) đã load |
|
|
222
|
+
|
|
223
|
+
**Steps:**
|
|
224
|
+
|
|
225
|
+
1. Snapshot count + checksum dataset trước migration
|
|
226
|
+
2. Chạy migration script
|
|
227
|
+
3. Đọc lại toàn bộ bản ghi sau migration
|
|
228
|
+
|
|
229
|
+
**Expected:**
|
|
230
|
+
|
|
231
|
+
- Count sau = count trước (10.000/10.000), không bản ghi nào null
|
|
232
|
+
- Mọi địa chỉ cũ đọc được đúng format mới, 0 lỗi parse
|
|
233
|
+
|
|
234
|
+
## Test Data Requirements
|
|
235
|
+
|
|
236
|
+
Dữ liệu mỗi test **cần** (requirement — KHÔNG phải provisioning/refresh; cách lấy data + cadence thuộc execution layer).
|
|
237
|
+
|
|
238
|
+
| Data set | Mục đích | Yêu cầu data (shape / đặc điểm) |
|
|
239
|
+
| --- | --- | --- |
|
|
240
|
+
| `seed_users` | functional positive | user hợp lệ, đủ field bắt buộc |
|
|
241
|
+
| `boundary_inputs` | validation edges | giá trị biên cho mỗi VR (rỗng, sai format, quá dài...) |
|
|
242
|
+
|
|
243
|
+
## Traceability Matrix
|
|
244
|
+
|
|
245
|
+
**Source of truth** để verify coverage trước khi đóng feature. Mỗi item từ frd phải xuất hiện. Gap → đánh ❌ và mô tả rõ ở phần "Gaps" bên dưới.
|
|
246
|
+
|
|
247
|
+
| FRD Item | Type | Covered by | Status |
|
|
248
|
+
| --- | --- | --- | --- |
|
|
249
|
+
| Flow 1 | Flow | `TS-{F_ID}-001` | ✅ |
|
|
250
|
+
| `US-{F_ID}-001` | US | `TC-{F_ID}-001`, `TC-{F_ID}-002` | ✅ |
|
|
251
|
+
| `AC-{F_ID}-001` | Story AC | `TC-{F_ID}-001` | ✅ |
|
|
252
|
+
| `VR-{F_ID}-001` | VR | `TC-{F_ID}-010`, `TC-{F_ID}-011`, `TC-{F_ID}-012` | ✅ |
|
|
253
|
+
| `FAC-{F_ID}-001` | Feature AC (e2e) | `TC-{F_ID}-040` | ✅ |
|
|
254
|
+
| `FAC-{F_ID}-002` | Feature AC (consistency) | `TC-{F_ID}-041` | ✅ |
|
|
255
|
+
| `NFR-{F_ID}-001` | NFR | `TC-{F_ID}-050` | ✅ |
|
|
256
|
+
| `DM-{F_ID}-001` | Data & Migration | `TC-{F_ID}-060` | ✅ |
|
|
257
|
+
| `AC-{F_ID}-00X` | Story AC | — | ❌ chưa có TC |
|
|
258
|
+
|
|
259
|
+
### Gaps
|
|
260
|
+
|
|
261
|
+
{Liệt kê item ❌ kèm lý do tạm hoãn / blocker — empty nếu coverage đầy đủ.}
|
|
262
|
+
|
|
263
|
+
## Out of Scope
|
|
264
|
+
|
|
265
|
+
- {những gì test-design này KHÔNG cover — lý do (vd: thuộc layer khác như infra/security audit, đã verify ở môi trường khác, ...)}
|
|
266
|
+
|
|
267
|
+
## Dependencies
|
|
268
|
+
|
|
269
|
+
### FRD reference
|
|
270
|
+
|
|
271
|
+
- `frd.md` của feature này — mọi ID (`US-`, `AC-`, `VR-`, `FAC-`, `NFR-`, `DM-`, Flow) phải match.
|
|
272
|
+
|
|
273
|
+
### Components Used (input only)
|
|
274
|
+
|
|
275
|
+
Tham chiếu `frd.md > Components Used` để hiểu contract của các component được feature này dùng. Behavior của component được verify **gián tiếp** qua các TC ở đây — không tách test-design riêng cho component.
|
|
276
|
+
|
|
277
|
+
## Change History
|
|
278
|
+
|
|
279
|
+
Append-only log của các thay đổi cascade lên artifact này. Quy ước xem `conventions.md` §5.5.
|
|
280
|
+
|
|
281
|
+
<!-- Entry format:
|
|
282
|
+
### YYYY-MM-DD — [{id}-{slug}](../../../integrations/{id}-{slug}/test.md) — create|update|manual
|
|
283
|
+
|
|
284
|
+
- **{Section name}**:
|
|
285
|
+
- [NEW] {item} — {mô tả ngắn}
|
|
286
|
+
- [MODIFY {field}] {item} — {old → new}
|
|
287
|
+
- [REMOVE] {item} — {lý do}
|
|
288
|
+
-->
|
|
289
|
+
|
|
@@ -68,6 +68,8 @@ Chi tiết về vai trò và thiết kế nằm trong `.specs/main/component/{C-
|
|
|
68
68
|
|
|
69
69
|
## Non-Functional Requirements
|
|
70
70
|
|
|
71
|
+
NFR **product-wide** (bar chung cho cả sản phẩm). Feature refine/siết bar này cho ngữ cảnh của nó trong `frd.md > Non-Functional Requirements` bằng `NFR-F{NNN}-{seq}` *(tham chiếu `NFR-*` ở đây)*; NFR đặc thù-feature mà chưa có ở đây → nếu lặp lại ở nhiều feature thì **promote** lên bảng này.
|
|
72
|
+
|
|
71
73
|
| ID | Category | Requirement | Target | Priority |
|
|
72
74
|
| --- | --- | --- | --- | --- |
|
|
73
75
|
| NFR-P01 | Performance | {requirement} | {target đo được} | High/Medium/Low |
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: test-exec-dm-{F-XXX}-{NNN}-{slug}
|
|
3
|
+
type: test-exec-dm
|
|
4
|
+
status: draft
|
|
5
|
+
owner: "{SE / DBA}"
|
|
6
|
+
feature_id: "{F-XXX}"
|
|
7
|
+
test_design_ref: "main/feature/{F-XXX}-{slug}/test-design.md"
|
|
8
|
+
referenced_by:
|
|
9
|
+
- conventions.md > Test Execution Artifacts > test-exec-dm.md
|
|
10
|
+
- terms/003-test-exec-buckets.md
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
<!--
|
|
14
|
+
Canonical format cho .specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/test-exec-dm.md.
|
|
15
|
+
EXECUTION layer — ephemeral per test cycle, harness "migration script trên dataset prod-like", owner SE/DBA.
|
|
16
|
+
Cover Data & Migration (DM) — backfill, schema migration, data cũ không mất/hỏng. Xem terms/003.
|
|
17
|
+
|
|
18
|
+
KHÔNG versioned: không template_version / migrations, ngoài scope /artifact-audit + /artifact-migrate.
|
|
19
|
+
Derived từ test-design.md → test-design đổi thì REGENERATE.
|
|
20
|
+
|
|
21
|
+
CHỈ TẠO file này khi frd.md có `DM-F*` (test-design § Data & Migration Test Cases không rỗng).
|
|
22
|
+
Feature không đụng migration → KHÔNG tạo test-exec-dm.md.
|
|
23
|
+
|
|
24
|
+
Source of truth: test-design.md > Data & Migration Test Cases.
|
|
25
|
+
- ID = TC-F{NNN}-{seq} inherit từ test-design (Covers DM-F*). KHÔNG tạo ID mới.
|
|
26
|
+
- Coverage master = test-design.md > Traceability Matrix.
|
|
27
|
+
-->
|
|
28
|
+
|
|
29
|
+
# Data & Migration Test Execution: {Feature Name}
|
|
30
|
+
|
|
31
|
+
**Feature**: {F-XXX} | **Owner**: {owner} | **Status**: {status}
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 1. Context
|
|
36
|
+
|
|
37
|
+
| **Field** | **Detail** |
|
|
38
|
+
|---|---|
|
|
39
|
+
| **Feature Summary** | {1–2 câu — migration/backfill scope} |
|
|
40
|
+
| **DM covered** | {DM IDs — `DM-F{NNN}-001`, ...} |
|
|
41
|
+
| **Source** | [test-design.md](../../../main/feature/{F-XXX}-{slug}/test-design.md) — TC IDs (Data & Migration Test Cases) + Traceability Matrix |
|
|
42
|
+
| **Migration artifact** | {ref script/EF migration: `{migration-name}` hoặc path} |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 2. Dataset & Migration Setup
|
|
47
|
+
|
|
48
|
+
> Migration chạy trên dataset **prod-like** — không phải seed nhỏ. Phải snapshot trước để so khớp.
|
|
49
|
+
|
|
50
|
+
| **Field** | **Detail** |
|
|
51
|
+
|---|---|
|
|
52
|
+
| **Dataset** | {vd: 10.000 bản ghi địa chỉ format cũ — nguồn / cách load} |
|
|
53
|
+
| **Pre-condition chung** | Migration script đã review · dataset prod-like đã load vào env test |
|
|
54
|
+
| **Snapshot before** | count + checksum trước migration (baseline để assert) |
|
|
55
|
+
| **Rollback plan** | {cách revert nếu migration fail — backup/restore / down-migration} |
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 3. DM Execution
|
|
60
|
+
|
|
61
|
+
> **Input:** test-design.md § Data & Migration Test Cases (TC ID, expected — đếm/so khớp).
|
|
62
|
+
> **Test Result:** `—` (chưa chạy) | `✅ Pass` | `❌ Fail` | `⛔ Blocked` | `🔴 HOLD`
|
|
63
|
+
|
|
64
|
+
| **TC ID** | **Covers** | **Pre-condition** | **Migration Command** | **Expected** | **Test Result** | **Priority** |
|
|
65
|
+
|---|---|---|---|---|---|---|
|
|
66
|
+
| `TC-F{NNN}-060` | `DM-F{NNN}-001` | Dataset prod-like loaded ({N} bản ghi cũ) · snapshot baseline | `{migration-command}` | count sau = count trước ({N}/{N}) · 0 null · format mới parse đúng | — | 🔴 P0 |
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 4. Exit Criteria
|
|
71
|
+
|
|
72
|
+
- [ ] Mọi DM P0 TC pass — data cũ nguyên vẹn (count + checksum khớp)
|
|
73
|
+
- [ ] 0 bản ghi mất / null / lỗi parse sau migration
|
|
74
|
+
- [ ] Rollback đã verify chạy được (dry-run hoặc trên copy)
|
|
75
|
+
- [ ] Test Result column updated đầy đủ
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 5. Change Log
|
|
80
|
+
|
|
81
|
+
| **Date** | **Cycle** | **Changes** | **Author** |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| {YYYY-MM-DD} | {cycle/release} | Initial DM execution (derive từ test-design.md) | {Author} |
|