spec-lite 1.6.0 → 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 +6 -0
- package/package.json +1 -1
- package/skills/archive/SKILL.md +63 -52
- package/skills/spec-test-exec/SKILL.md +251 -0
- package/skills-overview.md +20 -7
- package/templates/main/feature/test-design-template.md +14 -2
- 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/README.md
CHANGED
|
@@ -128,6 +128,9 @@ Tạo `.specs/integrations/{slug}/tech.md` sau khi `spec.md` được approve. C
|
|
|
128
128
|
#### `/spec-test [number]`
|
|
129
129
|
Tạo `.specs/integrations/{slug}/test.md` sau khi `spec.md` được approve. Chạy bởi **QC**, **song song / độc lập** với `/spec-tech` — cả hai chỉ phụ thuộc `spec.md`. Mechanical derive Test Scenarios + Test Cases từ frd.md (Flow → TS, US/AC → Functional TC, VR → positive + negative, FAC → E2E TC, NFR → Non-functional TC, DM → Data & Migration TC), priority deterministic. Cascade lên `feature/{F-XXX}/test-design.md` qua Changes blocks. Gate: integration phải có `features:` non-empty (component-thuần không áp dụng).
|
|
130
130
|
|
|
131
|
+
#### `/spec-test-exec [F-XXX]`
|
|
132
|
+
Sinh **bundle test-executions** (bản thực thi) cho một feature từ `test-design.md`. Layer EXECUTION — `test-design.md` là **source of truth**, skill đọc-xuống một chiều (không cascade, không sửa test-design), inherit `TC-F*` nguyên văn. Output: cycle bundle `.specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` (plane 2 tầng, ephemeral per chu kỳ test). Sinh tới 6 doc theo scope×harness — `func-manual`/`func-auto`, `e2e-manual`/`e2e-auto`, `nfr`, `dm` (nfr/dm bỏ nếu rỗng); team chọn harness theo kỹ năng. KHÔNG versioned. Feature-level, chạy sau khi có test-design (không thuộc per-integration pipeline).
|
|
133
|
+
|
|
131
134
|
#### `/plan`
|
|
132
135
|
Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`.
|
|
133
136
|
|
|
@@ -177,9 +180,12 @@ Migrate **main artifact** lỗi thời lên structure mới (mọi main type). T
|
|
|
177
180
|
| `/spec-new` | `.specs/integrations/{slug}/spec.md` |
|
|
178
181
|
| `/spec-tech` | `.specs/integrations/{slug}/tech.md` |
|
|
179
182
|
| `/spec-test` | `.specs/integrations/{slug}/test.md`, cascade: `feature/{F-XXX}/test-design.md` |
|
|
183
|
+
| `/spec-test-exec` | `.specs/test-executions/{F-XXX}-*/{NNN}-*/test-exec-*.md` (derived từ test-design) |
|
|
180
184
|
| `/plan` | `.specs/integrations/{slug}/plan.md`, `todo.md` |
|
|
181
185
|
| `/build` | *(implements tasks từ `plan.md`/`todo.md`)* |
|
|
182
186
|
| `/review-integration` | *(findings report — không tạo file)* |
|
|
183
187
|
| `/review-everything` | `.specs/integrations/{NNN}-{slug}/review-findings.md` *(qua /spec-new)* |
|
|
184
188
|
|
|
185
189
|
Feature artifacts (`frd.md`) ở greenfield có thể author trước bằng `/spec-frd`, hoặc mọc dần qua **cascade proposals** từ integrations (`/spec-new` fallback). Component artifacts (`crd.md`/`cdd.md`) ở greenfield chỉ mọc qua cascade — không có skill author trực tiếp (`/spec-frd` chỉ reference component, không tạo crd/cdd).
|
|
190
|
+
|
|
191
|
+
Ngoài `main/` và `integrations/`, còn plane thứ ba **`.specs/test-executions/`** (execution layer): bundle thực thi *derived* từ `test-design.md` qua `/spec-test-exec`, đánh số per-feature 2 tầng (`{F-XXX}-{slug}/{NNN}-{cycle-slug}/`), ephemeral per chu kỳ test, không versioned. Xem `conventions.md` §8.
|
package/package.json
CHANGED
package/skills/archive/SKILL.md
CHANGED
|
@@ -1,116 +1,125 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: archive
|
|
3
|
-
description: Archive một integration
|
|
3
|
+
description: Archive một integration hoặc một test-execution (cycle bundle / feature group) sang .specs/archive/ — namespaced theo loại (.specs/archive/integrations/ và .specs/archive/test-executions/). Dùng khi integration đã hoàn thành hoặc một chu kỳ test đã xong và cần dọn ra khỏi thư mục làm việc chính.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# archive
|
|
7
7
|
|
|
8
8
|
## Overview
|
|
9
9
|
|
|
10
|
-
Di chuyển một
|
|
10
|
+
Di chuyển một artifact bundle ra khỏi thư mục làm việc sang `.specs/archive/`, giữ nguyên nội dung. Hỗ trợ **hai plane**:
|
|
11
|
+
|
|
12
|
+
- **Integration**: `.specs/integrations/{id}-{slug}/` → `.specs/archive/integrations/{id}-{slug}/`
|
|
13
|
+
- **Test execution**: `.specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` → `.specs/archive/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/`
|
|
14
|
+
- Đơn vị archive = **cycle bundle** (một chu kỳ test xong) hoặc **cả feature group** (`{F-XXX}-{slug}/`) khi feature retire.
|
|
15
|
+
|
|
16
|
+
`.specs/archive/` được **namespace theo loại** (`integrations/` + `test-executions/`) để không trộn lẫn hai plane. Cấu trúc nguồn được giữ nguyên dưới subfolder loại (test-exec giữ 2 tầng feature-group → cycle-bundle).
|
|
11
17
|
|
|
12
18
|
## When to Use
|
|
13
19
|
|
|
14
|
-
- Integration đã hoàn thành (Done)
|
|
15
|
-
-
|
|
16
|
-
-
|
|
20
|
+
- Integration đã hoàn thành (Done) / cancel / deferred vô thời hạn.
|
|
21
|
+
- Một **chu kỳ test** (cycle bundle test-exec) đã chạy xong, muốn lưu kết quả ra khỏi working set.
|
|
22
|
+
- Feature retire → archive cả feature group test-executions của nó.
|
|
23
|
+
- Dọn dẹp `.specs/integrations/` hoặc `.specs/test-executions/` khỏi bundle cũ.
|
|
17
24
|
|
|
18
25
|
## When NOT to Use
|
|
19
26
|
|
|
20
|
-
- Integration đang In Progress → chưa nên archive
|
|
21
|
-
-
|
|
27
|
+
- Integration đang In Progress → chưa nên archive.
|
|
28
|
+
- Cycle test đang chạy dở (Test Result chưa xong) → chưa archive.
|
|
29
|
+
- Muốn xóa hoàn toàn → đừng archive, thao tác thủ công sau khi confirm với team.
|
|
22
30
|
|
|
23
31
|
---
|
|
24
32
|
|
|
25
33
|
## Process
|
|
26
34
|
|
|
27
|
-
### Bước 1:
|
|
35
|
+
### Bước 1: Chuẩn bị thư mục archive
|
|
28
36
|
|
|
29
|
-
|
|
37
|
+
`.specs/archive/` chứa subfolder theo loại. **Tạo lazy** — chỉ tạo subfolder loại nào khi thực sự archive item thuộc loại đó:
|
|
30
38
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
**Nếu đã tồn tại** → tiếp tục.
|
|
39
|
+
- Archive integration → đảm bảo `.specs/archive/integrations/` tồn tại (tạo nếu chưa).
|
|
40
|
+
- Archive test-execution → đảm bảo `.specs/archive/test-executions/` tồn tại (tạo nếu chưa).
|
|
34
41
|
|
|
35
42
|
---
|
|
36
43
|
|
|
37
|
-
### Bước 2: Liệt kê
|
|
38
|
-
|
|
39
|
-
Quét `.specs/integrations/` để tìm tất cả các integration (mỗi integration là một thư mục con).
|
|
44
|
+
### Bước 2: Liệt kê archivable từ cả hai plane
|
|
40
45
|
|
|
41
|
-
**
|
|
46
|
+
Quét `.specs/integrations/` và `.specs/test-executions/`. Hiển thị danh sách **chia section theo plane, đánh số liên tục**:
|
|
42
47
|
|
|
43
48
|
```
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
Dừng lại.
|
|
48
|
-
|
|
49
|
-
**Nếu có integrations**, hiển thị danh sách dạng numbered list, kèm trạng thái nếu đọc được từ `spec.md` (frontmatter `status` hoặc heading):
|
|
50
|
-
|
|
51
|
-
```
|
|
52
|
-
Integrations trong .specs/integrations/:
|
|
49
|
+
Archivable:
|
|
53
50
|
|
|
51
|
+
Integrations (.specs/integrations/):
|
|
54
52
|
[1] 001-user-authentication (approved)
|
|
55
|
-
[2]
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
[2] 003-notification-service (done)
|
|
54
|
+
|
|
55
|
+
Test executions (.specs/test-executions/):
|
|
56
|
+
[3] F-012-bulk-import / 001-regression
|
|
57
|
+
[4] F-012-bulk-import / 002-release-2.0
|
|
58
|
+
[5] F-012-bulk-import (cả feature group — gồm 001, 002)
|
|
59
|
+
[6] F-031-checkout / 001-smoke
|
|
58
60
|
|
|
59
|
-
Chọn số
|
|
61
|
+
Chọn số để archive (nhiều số cách nhau bởi dấu cách, ví dụ: 1 3):
|
|
60
62
|
```
|
|
61
63
|
|
|
62
|
-
|
|
64
|
+
- **Integration**: mỗi `{id}-{slug}/` là 1 dòng. Cố đọc `spec.md` frontmatter `status` để hiển thị (bỏ qua nếu không đọc được).
|
|
65
|
+
- **Test execution**: mỗi **cycle bundle** `{F-XXX}-{slug}/{NNN}-{cycle-slug}/` là 1 dòng (qualified tên feature group). **Thêm 1 dòng cho cả feature group** `{F-XXX}-{slug}/` để archive trọn gói.
|
|
66
|
+
- Cả hai plane rỗng → `Không có gì để archive trong .specs/integrations/ và .specs/test-executions/.` → dừng.
|
|
63
67
|
|
|
64
68
|
---
|
|
65
69
|
|
|
66
70
|
### Bước 3: Xác nhận
|
|
67
71
|
|
|
68
|
-
|
|
72
|
+
Hiển thị source → **namespaced dest** trước khi di chuyển:
|
|
69
73
|
|
|
70
74
|
```
|
|
71
|
-
Sẽ archive
|
|
75
|
+
Sẽ archive:
|
|
72
76
|
|
|
73
|
-
.specs/integrations/001-user-authentication/
|
|
74
|
-
|
|
77
|
+
.specs/integrations/001-user-authentication/
|
|
78
|
+
→ .specs/archive/integrations/001-user-authentication/
|
|
79
|
+
|
|
80
|
+
.specs/test-executions/F-012-bulk-import/001-regression/
|
|
81
|
+
→ .specs/archive/test-executions/F-012-bulk-import/001-regression/
|
|
75
82
|
|
|
76
83
|
Xác nhận? (yes/no)
|
|
77
84
|
```
|
|
78
85
|
|
|
79
|
-
Nếu user
|
|
86
|
+
- Nếu user chọn **cả feature group** lẫn một cycle con của nó → cảnh báo trùng, chỉ giữ feature group (archive group bao trọn cycle).
|
|
87
|
+
- Không confirm → hủy, không làm gì.
|
|
80
88
|
|
|
81
89
|
---
|
|
82
90
|
|
|
83
91
|
### Bước 4: Di chuyển
|
|
84
92
|
|
|
85
|
-
Với mỗi
|
|
93
|
+
Với mỗi item đã confirm, di chuyển **giữ nguyên cấu trúc nguồn** dưới subfolder loại:
|
|
94
|
+
|
|
95
|
+
- Integration: `.specs/integrations/{id}-{slug}/` → `.specs/archive/integrations/{id}-{slug}/`
|
|
96
|
+
- Cycle bundle: `.specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` → `.specs/archive/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` (tạo feature group dưới archive nếu chưa có).
|
|
97
|
+
- Feature group: `.specs/test-executions/{F-XXX}-{slug}/` → `.specs/archive/test-executions/{F-XXX}-{slug}/`.
|
|
86
98
|
|
|
87
|
-
|
|
88
|
-
- Giữ nguyên toàn bộ cấu trúc thư mục và file bên trong
|
|
99
|
+
Sau khi di chuyển cycle bundle, nếu feature group nguồn **rỗng** (không còn cycle nào) → xóa thư mục feature group rỗng ở `.specs/test-executions/` cho gọn.
|
|
89
100
|
|
|
90
|
-
|
|
101
|
+
**No-overwrite guard:** nếu dest đã tồn tại → cảnh báo và **bỏ qua** item đó (không ghi đè frozen record):
|
|
91
102
|
|
|
92
103
|
```
|
|
93
|
-
⚠ .specs/archive/
|
|
104
|
+
⚠ .specs/archive/test-executions/F-012-bulk-import/001-regression/ đã tồn tại. Bỏ qua để tránh ghi đè.
|
|
94
105
|
```
|
|
95
106
|
|
|
96
|
-
|
|
107
|
+
Tiếp tục với các item còn lại.
|
|
97
108
|
|
|
98
109
|
---
|
|
99
110
|
|
|
100
111
|
### Bước 5: Kết quả
|
|
101
112
|
|
|
102
|
-
Thông báo kết quả:
|
|
103
|
-
|
|
104
113
|
```
|
|
105
114
|
✓ Đã archive:
|
|
106
|
-
.specs/archive/001-user-authentication/
|
|
107
|
-
.specs/archive/
|
|
115
|
+
.specs/archive/integrations/001-user-authentication/
|
|
116
|
+
.specs/archive/test-executions/F-012-bulk-import/001-regression/
|
|
108
117
|
|
|
109
|
-
{nếu có
|
|
118
|
+
{nếu có}
|
|
110
119
|
⚠ Bỏ qua (đã tồn tại):
|
|
111
|
-
.specs/archive/
|
|
120
|
+
.specs/archive/test-executions/F-031-checkout/001-smoke/
|
|
112
121
|
|
|
113
|
-
|
|
122
|
+
Còn lại: {N} integration(s), {M} test-execution cycle(s).
|
|
114
123
|
```
|
|
115
124
|
|
|
116
125
|
---
|
|
@@ -119,7 +128,9 @@ Thông báo kết quả:
|
|
|
119
128
|
|
|
120
129
|
Trước khi di chuyển:
|
|
121
130
|
|
|
122
|
-
- [ ] `.specs/archive/` đã tồn tại (tạo nếu chưa
|
|
123
|
-
- [ ] User đã chọn ít nhất 1
|
|
124
|
-
- [ ] User đã confirm
|
|
125
|
-
- [ ]
|
|
131
|
+
- [ ] Subfolder loại tương ứng (`.specs/archive/integrations/` hoặc `.specs/archive/test-executions/`) đã tồn tại (tạo lazy nếu chưa).
|
|
132
|
+
- [ ] User đã chọn ít nhất 1 item.
|
|
133
|
+
- [ ] User đã confirm; trùng feature-group ⨯ cycle-con đã dedupe.
|
|
134
|
+
- [ ] Cấu trúc nguồn giữ nguyên dưới subfolder loại (test-exec giữ 2 tầng).
|
|
135
|
+
- [ ] Không ghi đè nếu dest đã tồn tại.
|
|
136
|
+
- [ ] Feature group nguồn rỗng sau khi archive cycle → dọn thư mục rỗng.
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spec-test-exec
|
|
3
|
+
description: Sinh bundle test-executions cho MỘT feature — render Test Cases trong test-design.md thành các doc thực thi theo harness (func-manual/auto, e2e-manual/auto, nfr, dm). Đọc-xuống từ test-design (source of truth), inherit TC-F* nguyên văn, KHÔNG đẻ ID mới. Mỗi lần chạy = bundle đánh số mới, ephemeral per test cycle.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# spec-test-exec
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Sinh một **cycle bundle test-executions** cho một feature vào `.specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` — render các Test Case đã thiết kế ở `test-design.md` thành **doc thực thi** theo từng **harness** (manual GUI walk / automation / tool đặc thù / migration script). Plane 2 tầng: feature group (`{F-XXX}-{slug}/`) → cycle bundle (`{NNN}-{cycle-slug}/`); `{NNN}` reset per-feature (xem `conventions.md` §8.1).
|
|
11
|
+
|
|
12
|
+
**Vị trí trong 3 layer** (xem `conventions.md` §8):
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
frd.md ──(/spec-test | /spec-test-design)──▶ test-design.md ──(/spec-test-exec)──▶ test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/
|
|
16
|
+
[DESIGN — TC là gì] [SOURCE OF TRUTH] [EXECUTION — chạy bằng harness gì]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
**Cốt lõi — đọc xuống, KHÔNG sáng tạo:**
|
|
20
|
+
- test-design.md là **source of truth** của bộ Test Case. Skill này **chỉ đọc** test-design → route TC vào doc theo section nguồn + harness.
|
|
21
|
+
- **Inherit `TC-F*` nguyên văn** — KHÔNG đẻ ID mới, KHÔNG renumber. (`{PREFIX}_E2E_*` nếu dùng chỉ là title `test.describe` trong code, không phải ID artifact.)
|
|
22
|
+
- Mỗi lần chạy = **bundle đánh số mới** (snapshot độc lập từ test-design hiện tại). **KHÔNG** carry-over result, **KHÔNG** link chuỗi với bundle cũ.
|
|
23
|
+
|
|
24
|
+
**KHÔNG versioned:** doc test-exec không mang `template_version`/`migrations` — derived, ngoài scope `/artifact-audit` + `/artifact-migrate` (xem `conventions.md` §7 + §8.1).
|
|
25
|
+
|
|
26
|
+
## When to Use
|
|
27
|
+
|
|
28
|
+
- Một feature đã có `test-design.md` và cần sinh doc thực thi để bắt đầu một **chu kỳ test** (regression release, sprint test, UAT...).
|
|
29
|
+
- test-design.md vừa cập nhật (qua `/spec-test`) → cần một bundle thực thi mới phản ánh TC hiện tại.
|
|
30
|
+
|
|
31
|
+
## When NOT to Use
|
|
32
|
+
|
|
33
|
+
- Feature **chưa có** `test-design.md` → chạy `/spec-test` (qua integration) hoặc `/spec-test-design` (bootstrap) trước.
|
|
34
|
+
- Muốn **thêm/đổi TC** → KHÔNG sửa ở đây (test-exec chỉ đọc). Sửa test-design qua `/spec-test`, rồi sinh lại bundle.
|
|
35
|
+
- Chỉ muốn cập nhật **kết quả thực thi** (Test Result) → edit doc trong bundle trực tiếp (đó là việc của owner khi chạy test), không chạy lại skill.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Process
|
|
40
|
+
|
|
41
|
+
### Bước 1: Xác định feature
|
|
42
|
+
|
|
43
|
+
`/spec-test-exec` thao tác trên **đúng một feature**.
|
|
44
|
+
|
|
45
|
+
**Nếu có ARGUMENT:**
|
|
46
|
+
- Parse: feature ID (`F-012`, `012`) hoặc slug (`F-012-bulk-import`, `bulk-import`).
|
|
47
|
+
- Quét `.specs/main/feature/*/test-design.md`, tìm feature khớp.
|
|
48
|
+
- Không khớp → báo lỗi:
|
|
49
|
+
> Không tìm thấy feature có test-design.md khớp với "{argument}". Kiểm tra `.specs/main/feature/`.
|
|
50
|
+
|
|
51
|
+
**Nếu không có ARGUMENT:**
|
|
52
|
+
|
|
53
|
+
Quét `.specs/main/feature/`. Liệt kê features **có `test-design.md`**, kèm các cycle bundle hiện có trong feature group:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Features có test-design.md:
|
|
57
|
+
|
|
58
|
+
[1] F-012 — bulk-import test-design: approved cycles: 001-regression, 002-release-2.0
|
|
59
|
+
[2] F-031 — checkout test-design: draft cycles: —
|
|
60
|
+
|
|
61
|
+
Chọn số feature:
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Không feature nào có test-design.md → dừng:
|
|
65
|
+
> Chưa có feature nào có test-design.md. Chạy `/spec-test` hoặc `/spec-test-design` trước.
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### Bước 2: Gate check + phát hiện section điều kiện
|
|
70
|
+
|
|
71
|
+
Đọc `.specs/main/feature/{F-XXX}-{slug}/test-design.md`.
|
|
72
|
+
|
|
73
|
+
**Check 1 — test-design.md tồn tại:** nếu không → dừng (đã xử lý ở Bước 1).
|
|
74
|
+
|
|
75
|
+
**Check 2 — status (cảnh báo, KHÔNG block):**
|
|
76
|
+
|
|
77
|
+
Nếu `status` **không phải** `approved`:
|
|
78
|
+
> ⚠ `test-design.md` của **{F-XXX}** đang ở `status: {status}` (chưa approved — có thể còn placeholder TBD ở Test Data / Strategy / Out of Scope).
|
|
79
|
+
>
|
|
80
|
+
> Bundle sinh ra sẽ kế thừa các placeholder đó. Tiếp tục? (yes / no — default yes)
|
|
81
|
+
|
|
82
|
+
`no` → dừng, gợi ý approve test-design trước.
|
|
83
|
+
|
|
84
|
+
**Check 3 — phát hiện section required-emptyable rỗng (quyết định nfr/dm):**
|
|
85
|
+
|
|
86
|
+
Đọc 2 section của test-design:
|
|
87
|
+
- `## Non-Functional Test Cases` — có TC block (`### TC-F...`) không?
|
|
88
|
+
- `## Data & Migration Test Cases` — có TC block không?
|
|
89
|
+
|
|
90
|
+
Quy tắc (xem `conventions.md` §8.2):
|
|
91
|
+
- Section có ≥1 TC → **sẽ sinh** doc tương ứng (`test-exec-nfr.md` / `test-exec-dm.md`).
|
|
92
|
+
- Section rỗng (chỉ heading, không TC) → **BỎ QUA** doc đó.
|
|
93
|
+
|
|
94
|
+
Báo lại cho user:
|
|
95
|
+
```
|
|
96
|
+
test-design F-012:
|
|
97
|
+
Functional TC: 8 Validation TC: 12 E2E TC: 3 NFR TC: 2 DM TC: 0
|
|
98
|
+
→ Sẽ sinh: func-manual, func-auto, e2e-manual, e2e-auto, nfr (BỎ dm — section rỗng)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
### Bước 3: Cấp feature group + cycle bundle
|
|
104
|
+
|
|
105
|
+
**Feature group** `{F-XXX}-{slug}/` — mirror tên thư mục `main/feature/{F-XXX}-{slug}/`. Chưa tồn tại → tạo mới; đã có → dùng lại (gom cycle).
|
|
106
|
+
|
|
107
|
+
**Cycle number `{NNN}`** — đánh số **per-feature** (reset trong mỗi feature group):
|
|
108
|
+
- Quét max `{NNN}` của các cycle bundle **trong feature group đó**:
|
|
109
|
+
- `.specs/test-executions/{F-XXX}-{slug}/*/` (active)
|
|
110
|
+
- `.specs/archive/**/` thuộc cùng feature (cycle đã archive)
|
|
111
|
+
- `{NNN}` mới = max + 1, zero-padded 3 chữ số. Feature group rỗng → `001`.
|
|
112
|
+
|
|
113
|
+
**Cycle slug** — kebab-case mô tả **chu kỳ test** (vd `regression`, `release-2.0`, `smoke`). KHÔNG nhúng `{F-XXX}` (đã ở tầng feature group). Hỏi user (mặc định gợi ý theo ngữ cảnh):
|
|
114
|
+
|
|
115
|
+
> Cycle mới: `F-012-bulk-import/003-regression`. Đổi cycle-slug? (Enter để giữ)
|
|
116
|
+
|
|
117
|
+
**Cảnh báo clobber:** nếu tên cycle trùng một bundle đã có trong feature group → cảnh báo, KHÔNG ghi đè (đề nghị số mới hoặc archive cycle cũ trước).
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### Bước 4: Route TC → bucket + completeness check
|
|
122
|
+
|
|
123
|
+
**Đọc toàn bộ TC từ test-design**, gom theo section nguồn:
|
|
124
|
+
|
|
125
|
+
| Section test-design | Bucket scope | TC fields đọc được |
|
|
126
|
+
| --- | --- | --- |
|
|
127
|
+
| `## Functional Test Cases` | func | Type, **Autoable**, Priority, Covers, Scenario, Preconditions, Steps, Expected, Test data |
|
|
128
|
+
| `## Validation Test Cases` | func | TC ID, Covers VR, Field, Input, Expected, Polarity (**Autoable=YES** uniform) |
|
|
129
|
+
| `## E2E Test Cases` | e2e | Type (journey/consistency/integrity), Priority, Covers FAC, Spans, Preconditions, Steps, Expected |
|
|
130
|
+
| `## Non-Functional Test Cases` | nfr | Type, Priority, Covers NFR, Preconditions, Steps, Expected |
|
|
131
|
+
| `## Data & Migration Test Cases` | dm | Type, Priority, Covers DM, Preconditions, Steps, Expected |
|
|
132
|
+
|
|
133
|
+
**Route vào doc:**
|
|
134
|
+
|
|
135
|
+
| Doc | Lấy TC nào |
|
|
136
|
+
| --- | --- |
|
|
137
|
+
| `test-exec-func-manual` | **TOÀN BỘ** Functional + Validation TC (bất kể Autoable) |
|
|
138
|
+
| `test-exec-func-auto` | Functional + Validation TC có **`Autoable ∈ {YES, MAYBE}`** (Validation đều YES) |
|
|
139
|
+
| `test-exec-e2e-manual` | **TOÀN BỘ** E2E TC |
|
|
140
|
+
| `test-exec-e2e-auto` | **TOÀN BỘ** E2E TC (cùng tập với e2e-manual — hai harness thay thế) |
|
|
141
|
+
| `test-exec-nfr` | Non-Functional TC *(bỏ doc nếu rỗng)* |
|
|
142
|
+
| `test-exec-dm` | Data & Migration TC *(bỏ doc nếu rỗng)* |
|
|
143
|
+
|
|
144
|
+
**Completeness check (BẮT BUỘC trước khi ghi):**
|
|
145
|
+
- Tập `TC-F*` ở 4 **scope bucket** (func ∪ e2e ∪ nfr ∪ dm) phải **bằng** tập TC trong `test-design > Traceability Matrix`.
|
|
146
|
+
- Mỗi `TC-F*` rơi **đúng 1 scope bucket** (func/e2e/nfr/dm) — không lọt, không trùng scope. *(Cùng 1 TC xuất hiện ở cả func-manual lẫn func-auto là ĐÚNG — đó là hai harness của cùng scope func, không tính trùng.)*
|
|
147
|
+
- func-auto là **tập con** của func-manual (chỉ Autoable=YES/MAYBE) — phần `Autoable=NO` chỉ ở manual.
|
|
148
|
+
- Lỗi (TC không route được / TC thừa không có trong Matrix / section nguồn không parse được) → **dừng, báo cụ thể**, KHÔNG ghi bundle nửa vời.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
### Bước 5: Sinh doc từ template
|
|
153
|
+
|
|
154
|
+
Với mỗi doc cần sinh, copy từ `templates/test-executions/test-exec-{...}-template.md` rồi điền:
|
|
155
|
+
|
|
156
|
+
**Frontmatter (`conventions.md` §8.5):**
|
|
157
|
+
- `id: test-exec-{kind}-{F-XXX}-{NNN}-{cycle-slug}` · `type: test-exec-{kind}` · `feature_id: {F-XXX}` · `status: draft`
|
|
158
|
+
- `test_design_ref: main/feature/{F-XXX}-{slug}/test-design.md` (từ `.specs/` root — không phụ thuộc độ sâu bundle)
|
|
159
|
+
- func/e2e: `alt_harness_{auto|manual}: ./test-exec-{...}.md` (relative, cùng bundle)
|
|
160
|
+
- Markdown link tới test-design trong body: bundle sâu 2 tầng → `../../../main/feature/{F-XXX}-{slug}/test-design.md`.
|
|
161
|
+
- **KHÔNG** `template_version`/`migrations`.
|
|
162
|
+
|
|
163
|
+
**Inherit (đọc xuống — KHÔNG suy diễn lại):**
|
|
164
|
+
- `TC-F*` ID, `Covers`, `Type`, `Priority`, `Preconditions`, `Steps`, `Expected` → copy **nguyên văn** từ test-design vào bảng Coverage + Test Cases của doc.
|
|
165
|
+
- `Autoable` (func) → copy y nguyên; func-auto chỉ chứa YES/MAYBE.
|
|
166
|
+
|
|
167
|
+
**Placeholder cho owner điền khi chạy** (KHÔNG tự bịa):
|
|
168
|
+
- **Test Result / Status (CI)** → `—` (chưa chạy).
|
|
169
|
+
- **Execution Locators / Test File / POM** → `_Pending — {owner}_`.
|
|
170
|
+
- **Tool / Command / Layer** (nfr/auto) → gợi ý theo Type nếu suy được (vd NFR performance → `k6`), còn lại để placeholder.
|
|
171
|
+
- Account/Role matrix, Env tiers, Seed, Fixtures → giữ skeleton template để owner điền theo môi trường.
|
|
172
|
+
|
|
173
|
+
**Coverage tables:** điền từ Traceability Matrix (AC/VR/FAC/NFR/DM → TC IDs) — KHÔNG dựng matrix cạnh tranh; coverage master vẫn ở test-design.
|
|
174
|
+
|
|
175
|
+
Hiển thị **tóm tắt bundle** (không dump toàn bộ) cho user xem trước khi ghi:
|
|
176
|
+
```
|
|
177
|
+
Cycle F-012-bulk-import/003-regression — sẽ ghi 5 doc:
|
|
178
|
+
func-manual : 20 TC (8 func + 12 val) [toàn bộ]
|
|
179
|
+
func-auto : 18 TC (Autoable YES/MAYBE) [2 TC Autoable=NO chỉ ở manual]
|
|
180
|
+
e2e-manual : 3 TC
|
|
181
|
+
e2e-auto : 3 TC
|
|
182
|
+
nfr : 2 TC
|
|
183
|
+
(dm: bỏ — rỗng)
|
|
184
|
+
Completeness: 25/25 TC ở Traceability Matrix đều routed ✓
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
### Bước 6: Ghi bundle + báo cáo
|
|
190
|
+
|
|
191
|
+
**[6.1]** Tạo `.specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` (tạo feature group nếu chưa có), ghi từng doc (status `draft`).
|
|
192
|
+
|
|
193
|
+
**[6.2]** KHÔNG cascade, KHÔNG đụng test-design (đọc-xuống one-way). KHÔNG ghi Change History vào test-design (test-exec không phải nguồn cascade).
|
|
194
|
+
|
|
195
|
+
**[6.3] Báo cáo:**
|
|
196
|
+
```
|
|
197
|
+
✓ .specs/test-executions/F-012-bulk-import/003-regression/ (từ test-design.md)
|
|
198
|
+
✓ test-exec-func-manual.md — 20 TC
|
|
199
|
+
✓ test-exec-func-auto.md — 18 TC (Autoable YES/MAYBE)
|
|
200
|
+
✓ test-exec-e2e-manual.md — 3 TC
|
|
201
|
+
✓ test-exec-e2e-auto.md — 3 TC
|
|
202
|
+
✓ test-exec-nfr.md — 2 TC
|
|
203
|
+
(dm bỏ qua — test-design Data & Migration rỗng)
|
|
204
|
+
|
|
205
|
+
Bước tiếp theo (team chọn harness theo kỹ năng — xem terms/003/004):
|
|
206
|
+
- func: chạy func-manual (QC) HOẶC func-auto (DEV/SE). Lưu ý auto-only LỌT exploratory + Autoable=NO.
|
|
207
|
+
- e2e: chọn 1 trong e2e-manual (QC) / e2e-auto (SE) — thay thế hoàn toàn.
|
|
208
|
+
- nfr: SDET/specialist chạy bằng tool tương ứng.
|
|
209
|
+
- Xóa doc harness không dùng (sinh hết để team chọn).
|
|
210
|
+
- Điền Test Result / Status khi chạy.
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Common Rationalizations
|
|
216
|
+
|
|
217
|
+
| Rationalization | Reality |
|
|
218
|
+
| --- | --- |
|
|
219
|
+
| "Thêm TC ngay trong bundle cho nhanh" | test-exec chỉ đọc xuống. TC mới phải vào test-design trước (qua `/spec-test`) rồi sinh lại — nếu không sẽ vỡ traceability + ID authority. |
|
|
220
|
+
| "Đổi TC ID cho gọn lại" | ID `TC-F*` do test-design làm chủ, stable. Renumber ở đây phá liên kết với test code + Traceability Matrix. |
|
|
221
|
+
| "Auto chạy pass hết là xong" | func-auto LỌT exploratory + `Autoable=NO` (visual). Manual-only mới đầy đủ scope func (terms/004). |
|
|
222
|
+
| "Sinh thiếu vài doc cho nhanh" | Sinh hết (6 hoặc 4) để team chọn harness. Thiếu = ép harness sai với kỹ năng team. |
|
|
223
|
+
| "Regenerate đè bundle cũ" | Mỗi cycle = bundle số mới. Đè bundle đã có Test Result = mất lịch sử thực thi. |
|
|
224
|
+
|
|
225
|
+
## Red Flags
|
|
226
|
+
|
|
227
|
+
- Có `TC-F*` ở test-design Traceability Matrix nhưng không xuất hiện ở doc nào → completeness fail (lọt).
|
|
228
|
+
- Một `TC-F*` rơi vào >1 scope bucket (vd vừa func vừa e2e) → routing bug.
|
|
229
|
+
- func-auto chứa TC `Autoable=NO` → sai filter.
|
|
230
|
+
- Doc test-exec mang `template_version` → sai (test-exec không versioned).
|
|
231
|
+
- Ghi đè bundle cũ đang có Test Result mà không cảnh báo.
|
|
232
|
+
- Bịa Test Result / Locators / Tool thay vì để placeholder.
|
|
233
|
+
- Sửa test-design trong lúc chạy skill (skill này read-only với test-design).
|
|
234
|
+
|
|
235
|
+
## Verification
|
|
236
|
+
|
|
237
|
+
Trước khi ghi bundle:
|
|
238
|
+
|
|
239
|
+
- [ ] Đúng một feature; test-design.md tồn tại (cảnh báo nếu draft, không block).
|
|
240
|
+
- [ ] nfr/dm: chỉ sinh khi section nguồn có TC; rỗng → bỏ doc.
|
|
241
|
+
- [ ] Feature group `{F-XXX}-{slug}/` (mirror main/feature); `{NNN}` = max cycle **trong feature group đó** (active + archived) + 1 (reset per-feature); cycle-slug mô tả chu kỳ.
|
|
242
|
+
- [ ] Route đúng: func ← Functional+Validation (manual=toàn bộ, auto=Autoable YES/MAYBE); e2e ← E2E (cả 2 harness cùng tập); nfr ← Non-Functional; dm ← Data & Migration.
|
|
243
|
+
- [ ] **Completeness**: mọi `TC-F*` ở Traceability Matrix routed đúng 1 scope bucket — không lọt/trùng.
|
|
244
|
+
- [ ] Inherit `TC-F*` + fields nguyên văn; KHÔNG ID mới, KHÔNG renumber.
|
|
245
|
+
- [ ] Frontmatter: `id/type/feature_id/test_design_ref/alt_harness_*` đúng; KHÔNG `template_version`.
|
|
246
|
+
- [ ] Test Result/Status/Locators = placeholder, không bịa.
|
|
247
|
+
|
|
248
|
+
Sau khi ghi:
|
|
249
|
+
|
|
250
|
+
- [ ] Bundle tại `.specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` với 6 (hoặc 4) doc, status `draft`.
|
|
251
|
+
- [ ] KHÔNG đụng test-design (one-way đọc xuống, không cascade, không Change History).
|
package/skills-overview.md
CHANGED
|
@@ -261,10 +261,11 @@ Sau khi main artifacts đã sẵn sàng (từ greenfield hoặc brownfield), m
|
|
|
261
261
|
| `/spec-new [requirement]` | `prd.md`, `domain.md`, frd(s), crd(s) | `.specs/integrations/{slug}/spec.md` |
|
|
262
262
|
| `/spec-tech [number]` | `sad.md`, `domain.md`, cdd(s), fdd(s), `spec.md` | `.specs/integrations/{slug}/tech.md` |
|
|
263
263
|
| `/spec-test [number]` | `spec.md`, frd(s), test-design(s), `tech.md` *(optional)* | `.specs/integrations/{slug}/test.md`, `feature/{F-XXX}/test-design.md` |
|
|
264
|
+
| `/spec-test-exec [F-XXX]` *(feature-level, sau khi có test-design)* | `feature/{F-XXX}/test-design.md` | `.specs/test-executions/{F-XXX}-*/{NNN}-*/test-exec-*.md` |
|
|
264
265
|
| `/plan` | `spec.md`, `tech.md`, `domain.md` | `plan.md`, `todo.md` |
|
|
265
266
|
| `/build` | `plan.md`, `todo.md` | *(source code)* |
|
|
266
267
|
| `/review-integration` | `spec.md`, `tech.md`, `plan.md`, `todo.md`, *(source code)* | *(findings report)* |
|
|
267
|
-
| `/archive` | `.specs/integrations/` | `.specs/archive/` |
|
|
268
|
+
| `/archive` | `.specs/integrations/`, `.specs/test-executions/` | `.specs/archive/{integrations,test-executions}/` |
|
|
268
269
|
|
|
269
270
|
### `/spec-new [requirement]`
|
|
270
271
|
|
|
@@ -327,6 +328,18 @@ QC review: override priority defaults, fill placeholders (env / data / OOS / str
|
|
|
327
328
|
|
|
328
329
|
---
|
|
329
330
|
|
|
331
|
+
### `/spec-test-exec [F-XXX]`
|
|
332
|
+
|
|
333
|
+
Sinh **bundle test-executions** (bản thực thi) cho **một feature** từ `test-design.md`. Layer EXECUTION — `test-design.md` là **source of truth**, skill **đọc-xuống một chiều** (KHÔNG cascade, KHÔNG sửa test-design). Feature-level, chạy *sau* khi feature đã có test-design (không thuộc per-integration pipeline).
|
|
334
|
+
|
|
335
|
+
**Cách chạy:** `/spec-test-exec` (list feature có test-design) hoặc `/spec-test-exec F-012`.
|
|
336
|
+
|
|
337
|
+
**Output:** cycle bundle `.specs/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/` (plane 2 tầng — feature group → cycle bundle, `{NNN}` reset per-feature, ephemeral per chu kỳ test). Mỗi lần chạy = cycle mới.
|
|
338
|
+
|
|
339
|
+
Route TC theo **section nguồn + Autoable**, sinh **tới 6 doc** (4 nếu feature không NFR/DM): `func-manual` (toàn bộ Functional+Validation), `func-auto` (Autoable=YES/MAYBE), `e2e-manual` + `e2e-auto` (toàn bộ E2E), `nfr`, `dm` *(nfr/dm bỏ nếu section rỗng)*. **Sinh hết để team chọn harness** theo kỹ năng (e2e: manual⇄auto thay thế hoàn toàn; func: auto-only lọt exploratory/visual). **Inherit `TC-F*` nguyên văn** (không đẻ ID) + completeness check mọi TC ở Traceability Matrix rơi đúng 1 scope bucket. KHÔNG versioned. Chi tiết: `conventions.md` §8, `terms/003`+`004`.
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
330
343
|
### `/plan`
|
|
331
344
|
|
|
332
345
|
Tạo `plan.md` và `todo.md` từ `spec.md` + `tech.md`. Là SDD wrapper quanh `planning-and-task-breakdown`.
|
|
@@ -385,17 +398,17 @@ Review implementation sau `/build` theo năm trục: correctness, readability, a
|
|
|
385
398
|
|
|
386
399
|
### `/archive`
|
|
387
400
|
|
|
388
|
-
Di chuyển
|
|
401
|
+
Di chuyển artifact đã hoàn thành / không còn active sang `.specs/archive/` — hỗ trợ **cả 2 plane** và **namespace theo loại**.
|
|
389
402
|
|
|
390
|
-
**Bước 1 —
|
|
403
|
+
**Bước 1 — Chuẩn bị:** Tạo lazy subfolder theo loại — `.specs/archive/integrations/` và/hoặc `.specs/archive/test-executions/`.
|
|
391
404
|
|
|
392
|
-
**Bước 2 — Liệt kê:** Quét `.specs/integrations
|
|
405
|
+
**Bước 2 — Liệt kê:** Quét `.specs/integrations/` (mỗi `{id}-{slug}/`) và `.specs/test-executions/` (mỗi cycle bundle `{F-XXX}-{slug}/{NNN}-{cycle-slug}/`, + tùy chọn cả feature group). Hiển thị 2 section đánh số liên tục. Cả hai rỗng → dừng.
|
|
393
406
|
|
|
394
|
-
**Bước 3 — Xác nhận:**
|
|
407
|
+
**Bước 3 — Xác nhận:** Preview source → namespaced dest (`integrations/{slug}/ → archive/integrations/{slug}/`; cycle bundle → `archive/test-executions/{F-XXX}-{slug}/{NNN}-{cycle-slug}/`). Dedupe nếu chọn cả feature group lẫn cycle con.
|
|
395
408
|
|
|
396
|
-
**Bước 4 — Di chuyển:** Move
|
|
409
|
+
**Bước 4 — Di chuyển:** Move giữ nguyên cấu trúc nguồn dưới subfolder loại (test-exec giữ 2 tầng). Dest đã tồn tại → bỏ qua + cảnh báo (no-overwrite). Feature group nguồn rỗng sau khi archive cycle → dọn thư mục rỗng.
|
|
397
410
|
|
|
398
|
-
**Bước 5 — Kết quả:** Liệt kê
|
|
411
|
+
**Bước 5 — Kết quả:** Liệt kê đã archive, bị bỏ qua (nếu có), và số còn lại mỗi plane.
|
|
399
412
|
|
|
400
413
|
---
|
|
401
414
|
|
|
@@ -5,7 +5,7 @@ status: draft
|
|
|
5
5
|
owner: "{QC}"
|
|
6
6
|
feature_id: "{Feature ID — match frd.md}"
|
|
7
7
|
frd_ref: "feature/{F-XXX}-{slug}/frd.md"
|
|
8
|
-
template_version:
|
|
8
|
+
template_version: 3
|
|
9
9
|
migrations:
|
|
10
10
|
- to: 1
|
|
11
11
|
note: "baseline"
|
|
@@ -17,6 +17,11 @@ migrations:
|
|
|
17
17
|
- { section: "Test Strategy > Environments", reason: "env assignment/scheduling là execution concern — design chỉ cần env requirement ở per-TC Preconditions" }
|
|
18
18
|
update:
|
|
19
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)" }
|
|
20
25
|
---
|
|
21
26
|
|
|
22
27
|
<!--
|
|
@@ -76,11 +81,18 @@ Cover User Stories và Acceptance Criteria trong frd.
|
|
|
76
81
|
|
|
77
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.
|
|
78
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
|
+
|
|
79
90
|
### TC-{F_ID}-001: {Title ngắn — verb-first}
|
|
80
91
|
|
|
81
92
|
| Field | Value |
|
|
82
93
|
| --- | --- |
|
|
83
94
|
| **Type** | Functional — positive / negative |
|
|
95
|
+
| **Autoable** | YES / MAYBE / NO — phân loại theo oracle (rule ở đầu section) |
|
|
84
96
|
| **Priority** | P0 / P1 / P2 |
|
|
85
97
|
| **Covers** | `US-{F_ID}-001`, `AC-{F_ID}-001` |
|
|
86
98
|
| **Scenario** | `TS-{F_ID}-001` |
|
|
@@ -105,7 +117,7 @@ TC ID format: `TC-F{NNN}-{seq}` — đánh số tăng dần toàn feature. ID **
|
|
|
105
117
|
|
|
106
118
|
## Validation Test Cases
|
|
107
119
|
|
|
108
|
-
Derive 1:1 từ Verification Rules trong frd. Mỗi `VR-F{NNN}-{seq}` cần ít nhất:
|
|
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:
|
|
109
121
|
- 1 positive (rule pass)
|
|
110
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, ...)
|
|
111
123
|
|