kld-sdd 2.6.5 → 2.6.6
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/package.json +1 -1
- package/templates/skills/kld-sdd/opsx-apply/SKILL.md +3 -1
- package/templates/skills/kld-sdd/opsx-apply/checklist.md +16 -0
- package/templates/skills/kld-sdd/opsx-check/SKILL.md +4 -0
- package/templates/skills/kld-sdd/opsx-check/checklist.md +7 -0
- package/templates/skills/kld-sdd/opsx-task/SKILL.md +8 -1
- package/templates/skills/kld-sdd/opsx-task/checklist.md +3 -0
- package/templates/skills/kld-sdd/opsx-tdd-anti-patterns/SKILL.md +5 -2
- package/templates/skills/kld-sdd/opsx-tdd-anti-patterns/reference.md +29 -0
- package/templates/skills/kld-sdd/opsx-tdd-core/checklist.md +4 -0
- package/templates/skills/kld-sdd/opsx-tdd-rules/SKILL.md +1 -1
- package/templates/skills/kld-sdd/opsx-tdd-rules/rules/multi-validation-split.md +35 -1
package/package.json
CHANGED
|
@@ -211,6 +211,7 @@ g. **继续下一个层级** — 重新检查 DAG,找出依赖已满足的下
|
|
|
211
211
|
> 合理化预防表见 opsx-tdd-core/SKILL.md §7
|
|
212
212
|
> REFACTOR 检查点见 opsx-tdd-rules/rules/refactor-checklist.md
|
|
213
213
|
> 异常路径覆盖门禁见 opsx-tdd-rules/rules/exception-path-coverage.md
|
|
214
|
+
> TDD 节奏校验(执行后校验)见 `./checklist.md` §5e.1
|
|
214
215
|
|
|
215
216
|
**【S2.1 RED 测试质量标准】**(test-strategy=tdd 时强制):
|
|
216
217
|
|
|
@@ -282,6 +283,7 @@ g. **继续下一个层级** — 重新检查 DAG,找出依赖已满足的下
|
|
|
282
283
|
- **⛔ 编译检查门禁**:每完成一个任务后必须运行编译检查,编译失败禁止标记已完成。
|
|
283
284
|
- **⛔ 测试执行门禁**:根据 `test-strategy` 决定(tdd=强制, impl-first=强制补跑, none=跳过);须真实执行并留 telemetry。${HOOK_GATE_DESCRIPTION}
|
|
284
285
|
- **⛔ 必须实时更新任务状态**:每完成一个任务立即改 tasks.md,两种格式同步。
|
|
286
|
+
- **⛔ apply 结束前 checkbox 全量同步校验**:`stage_end` 前对比 telemetry `task_update` 记录数与 tasks.md `[x]` 数量,不一致则补齐(见 `./checklist.md` §5f.1)。
|
|
285
287
|
- **⛔ task_update 后必须验证 checkbox 已更新**:执行 `check-task` 确认 tasks.md 对应行已变更;未更新则手动修改。
|
|
286
288
|
- **⛔ TDD RED→GREEN 严格串行**:不适用同层并行派发;RED-N 确认失败后必须执行中断声明再进入 GREEN-N;GREEN 完成后必须通过 Scope 门禁再进入下一个 RED。
|
|
287
289
|
- **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目用 `vcs_mode=no-git` 继续执行。
|
|
@@ -298,7 +300,7 @@ g. **继续下一个层级** — 重新检查 DAG,找出依赖已满足的下
|
|
|
298
300
|
|
|
299
301
|
## 渐进披露
|
|
300
302
|
|
|
301
|
-
- Read `checklist.md` 仅在执行 apply 需要校验门禁/自检时 — 含 §1.2 Check 门禁检查点、§5d/§5e 编译/测试门禁自检、§6.0 单元测试真实执行自检、§6.1 worktree 收尾前置条件、Guardrails ⛔ 强制项勾选表。
|
|
303
|
+
- Read `checklist.md` 仅在执行 apply 需要校验门禁/自检时 — 含 §1.2 Check 门禁检查点、§5d/§5e 编译/测试门禁自检、§5e.1 TDD 节奏校验、§5f.1 checkbox 全量同步校验、§6.0 单元测试真实执行自检、§6.1 worktree 收尾前置条件、Guardrails ⛔ 强制项勾选表。
|
|
302
304
|
- Read `reference.md` 仅在需要参考详细模板时 — 含 📊 Telemetry 命令模板(start/end/task_update/ai_adoption_review/worktree_finish)、§1.5 worktree 全套策略(Step 0.1-3 + record-base + 多 cap 合并顺序)、§5c 子代理派发、§5.1 AI 产出快照、§6.0 单元测试、§6.1 worktree 收尾脚本。
|
|
303
305
|
- `implementer-prompt.md` 为子代理派发提示模板(§5c 派发时组合 tasks/design/overview 上下文使用)。
|
|
304
306
|
- `worktree-setup.md` 为 worktree 快速参考(§1.5 策略的精简版,与 reference.md §1.5 完整版并存:reference=完整策略,worktree-setup=快速参考)。
|
|
@@ -47,6 +47,11 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
|
|
|
47
47
|
> 不在此内联复制,以 opsx-tdd-core/checklist.md §A 为唯一真相源。
|
|
48
48
|
> 额外补充:REFACTOR 任务还需执行 `opsx-tdd-rules/rules/refactor-checklist.md`(7 项重构检查点)。
|
|
49
49
|
|
|
50
|
+
⛔ **TDD 节奏校验**(RED→GREEN 严格串行的执行后校验):
|
|
51
|
+
- [ ] 连续的 RED-N `task_update` 与 GREEN-N `task_update` 之间有可验证的执行间隔(建议 >60 秒),若时间戳差距过小视为批量执行信号
|
|
52
|
+
- [ ] 每对 RED→GREEN 之间已执行 🔴 中断声明(`🔴 RED-N 确认失败,原因:XXX。现在进入 GREEN-N`)
|
|
53
|
+
- [ ] 若同层有多个 RED→GREEN 对,确认是逐对完成而非一次性编写多个 RED 再一次性实现多个 GREEN
|
|
54
|
+
|
|
50
55
|
### §5e.2 RED 测试质量门禁(仅 test-strategy=tdd 时,RED 任务完成后强制检查)
|
|
51
56
|
|
|
52
57
|
⛔ 核心原则(引用 opsx-tdd-quality/SKILL.md §2):Mock 边界,不 Mock 行为
|
|
@@ -79,6 +84,15 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
|
|
|
79
84
|
- [ ] 记录任务级 Telemetry(`task_update`,`--task-id=<TASK-ID>` 必填,否则 E4 指标无法计算);TDD 测试骨架任务须在 `--details-json` 带 `"task_kind":"test-skeleton"`(P3,避免红灯误判拉低 E4)
|
|
80
85
|
- [ ] ⛔ **task_update 后必须验证 checkbox 已更新**:执行 `node skywalk-sdd/index.cjs check-task --project=. --change=<变更名称> --task-id=<TASK-ID>` 确认 tasks.md 中对应行已从 `- [ ]` 变为 `- [x]`;若未更新,手动修改 tasks.md 并报告
|
|
81
86
|
|
|
87
|
+
### §5f.1 apply 结束前 checkbox 全量同步校验
|
|
88
|
+
|
|
89
|
+
> ⛔ 在 `stage_end` telemetry 记录前必须执行此校验,防止任务状态滞后到 archive 阶段。
|
|
90
|
+
|
|
91
|
+
- [ ] 对比 telemetry `task_update` 记录的已完成任务数与 tasks.md 中 `[x]` 数量,不一致则补齐
|
|
92
|
+
- [ ] tasks.md 中所有 `- [ ]` / `- [x]` 与 `**状态**: [ ]` / `[x]` 两种格式已同步
|
|
93
|
+
- [ ] 手动验证清单(如有)已勾选
|
|
94
|
+
- [ ] 文档更新项(如有)已完成或显式标注推迟
|
|
95
|
+
|
|
82
96
|
---
|
|
83
97
|
|
|
84
98
|
## §6.0 单元测试真实执行自检(`test-strategy` 非 `none`)
|
|
@@ -114,8 +128,10 @@ description: opsx-apply 的阶段强制检查点与自检清单。仅在执行 a
|
|
|
114
128
|
- [ ] ⛔ **测试执行门禁**:根据 `test-strategy` 决定(tdd=强制, impl-first=强制补跑, none=跳过);须真实执行并留 telemetry,`sdd-apply-test-gate` 校验非占位数据
|
|
115
129
|
- [ ] ⛔ **RED 测试质量门禁**:见 §5e.2(引用 opsx-tdd-quality + opsx-tdd-anti-patterns,不在此内联复制)
|
|
116
130
|
- [ ] ⛔ **必须实时更新任务状态**:每完成一个任务立即改 tasks.md,两种格式(`- [ ]`→`- [x]` 与 `**状态**: [ ]`→`[x]`)同步
|
|
131
|
+
- [ ] ⛔ **apply 结束前 checkbox 全量同步校验**:见 §5f.1,`stage_end` 前对比 telemetry `task_update` 记录数与 tasks.md `[x]` 数量
|
|
117
132
|
- [ ] ⛔ **task_update 后必须验证 checkbox 已更新**:执行 `check-task` 确认 tasks.md 对应行已变更;未更新则手动修改
|
|
118
133
|
- [ ] ⛔ **TDD RED→GREEN 严格串行**:不适用同层并行派发;RED-N 确认失败后必须执行中断声明再进入 GREEN-N;GREEN 完成后必须通过 Scope 门禁再进入下一个 RED
|
|
134
|
+
- [ ] ⛔ **TDD 节奏校验**:见 §5e.1,连续 RED-N/GREEN-N 的 `task_update` 时间戳须有可验证间距
|
|
119
135
|
- [ ] **Git 只读策略**:禁止为了度量自动初始化 Git、创建分支或提交 commit;非 Git 项目用 `vcs_mode=no-git` 继续执行
|
|
120
136
|
- [ ] ⛔ **Step 0.1 隔离校验必做**:建 worktree / 建议分支名前必须完成 proposal + 跨 cap spec 依赖校验并输出报告;未通过不得按 full 并行策略拆 `kld-sdd/<change>/<cap>`
|
|
121
137
|
- [ ] **Worktree 为加速手段,非必选项**:校验通过且解耦方可多 worktree;有依赖或共享修改面则串行
|
|
@@ -97,6 +97,10 @@ openspec list
|
|
|
97
97
|
- [ ] spec.md 的需求项在 design.md 中 100% 被覆盖
|
|
98
98
|
- [ ] design.md 的设计点在 tasks.md 中 100% 被拆解
|
|
99
99
|
- [ ] 跨文档引用路径正确
|
|
100
|
+
- [ ] ⛔ **CON 覆盖一致性**:spec.md 中每个 CON 在 tasks.md 中有对应验证任务或显式声明间接覆盖;tasks.md 声明"100% 覆盖 CON"时必须可追溯
|
|
101
|
+
- [ ] ⛔ **安全/审计要求覆盖一致性**:spec.md §5.x 中的安全与审计要求在 tasks.md 中有对应任务或显式声明推迟
|
|
102
|
+
- [ ] ⛔ **AC 变体覆盖一致性**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准须列出所有变体的测试方法(规则见 `opsx-tdd-rules/rules/multi-validation-split.md` §AC 内"或"条件变体覆盖)
|
|
103
|
+
- [ ] ⛔ **tasks.md §4.x 验证方式表内部一致性**:§4.x 验证方式表中的测试注解/配置与任务实现步骤中的声明一致
|
|
100
104
|
|
|
101
105
|
#### 4.3 算法正确性检查
|
|
102
106
|
|
|
@@ -36,6 +36,13 @@ description: "opsx-check 阶段日志自检清单 — 仅在 check 自检时读
|
|
|
36
36
|
- [ ] 完整性、一致性、算法正确性、可执行性、TDD合规性(仅test-strategy=tdd时)五维均已输出
|
|
37
37
|
- [ ] 报告问题对应修复建议(spec/design/task)
|
|
38
38
|
|
|
39
|
+
## D2. 一致性补充检查(SKILL.md §4.2 扩展)
|
|
40
|
+
|
|
41
|
+
- [ ] **CON 覆盖**:spec.md 中每个 CON 在 tasks.md 中有对应验证任务或显式声明间接覆盖
|
|
42
|
+
- [ ] **安全/审计要求覆盖**:spec.md §5.x 中的安全与审计要求在 tasks.md 中有对应任务或显式声明推迟
|
|
43
|
+
- [ ] **AC 变体覆盖**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准列出所有变体的测试方法(引用 `opsx-tdd-rules/rules/multi-validation-split.md`)
|
|
44
|
+
- [ ] **§4.x 验证方式表内部一致性**:tasks.md §4.x 验证方式表中的测试注解/配置与任务实现步骤中的声明一致
|
|
45
|
+
|
|
39
46
|
## E. TDD 合规性检查(仅 test-strategy=tdd 时)
|
|
40
47
|
|
|
41
48
|
⛔ 执行 `opsx-tdd-core/checklist.md` §B(11 项)逐项检查。
|
|
@@ -189,7 +189,14 @@ Simple 模式或单文件能力域下,**不要拆成多个同文件任务**。
|
|
|
189
189
|
|
|
190
190
|
### 8. 质量红线自检
|
|
191
191
|
|
|
192
|
-
> 逐项确认,完整 7 项自检清单 + TDD 合规性自检(结构符合模板 / 拓扑图已绘制 / 依赖字段已填写 / 无循环依赖 / 颗粒度 ≤5 分钟 / 100% 覆盖 design / 每任务有验收标准)见 `./checklist.md`「§8 质量红线自检 + §8.1 TDD
|
|
192
|
+
> 逐项确认,完整 7 项自检清单 + TDD 合规性自检(结构符合模板 / 拓扑图已绘制 / 依赖字段已填写 / 无循环依赖 / 颗粒度 ≤5 分钟 / 100% 覆盖 design / 每任务有验收标准)见 `./checklist.md`「§8 质量红线自检 + §8.1 TDD 合规性自检」。
|
|
193
|
+
>
|
|
194
|
+
> 额外强制项(见 `./checklist.md` §8):
|
|
195
|
+
> - ⛔ **CON 覆盖**:spec.md 中每个 CON 必须有对应验证任务或显式声明间接覆盖
|
|
196
|
+
> - ⛔ **安全/审计要求覆盖**:spec.md §5.x 中的安全与审计要求必须有对应任务或显式声明推迟
|
|
197
|
+
> - ⛔ **§4.x 验证方式表内部一致性**:§4.x 验证方式表中的测试注解/配置必须与任务实现步骤中的声明一致
|
|
198
|
+
>
|
|
199
|
+
> 如有任意一项未满足,重新生成对应章节,直至全部通过。
|
|
193
200
|
|
|
194
201
|
### 9. 确认任务并输出
|
|
195
202
|
|
|
@@ -29,6 +29,9 @@ description: opsx-task 的阶段强制检查点与自检清单。仅在执行 ta
|
|
|
29
29
|
- [ ] 每个任务颗粒度 ≤ 5 分钟
|
|
30
30
|
- [ ] 100% 覆盖 design.md 定义
|
|
31
31
|
- [ ] 每个任务都有验收标准
|
|
32
|
+
- [ ] ⛔ **约束(CON)覆盖**:spec.md 中每个 CON 必须有对应验证任务,或在任务中显式声明"通过现有 AC 间接覆盖"并说明理由;tasks.md 质量红线声明"100% 覆盖 CON"时必须可追溯
|
|
33
|
+
- [ ] ⛔ **安全/审计要求覆盖**:spec.md §5.x 中的安全与审计要求(日志记录、脱敏、告警等)必须有对应任务,或显式声明推迟到后续迭代并在任务中标注
|
|
34
|
+
- [ ] ⛔ **§4.x 验证方式表内部一致性**:§4.x 验证方式表中的测试注解/配置必须与任务实现步骤中的声明一致,不得出现"§4.1 声明 @WebMvcTest 但实现步骤允许 @SpringBootTest"的矛盾
|
|
32
35
|
|
|
33
36
|
**如有任意一项未满足,重新生成对应章节,直至全部通过。**
|
|
34
37
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: opsx-tdd-anti-patterns
|
|
3
|
-
description: "测试反模式防护层 —
|
|
3
|
+
description: "测试反模式防护层 — 16 种反模式检测(RED 阶段 3 种 + GREEN 后 13 种),每种带门禁函数和修复方案。当编写或审查测试代码时引用本技能。"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# opsx-tdd-anti-patterns — 反模式防护层
|
|
@@ -32,7 +32,7 @@ description: "测试反模式防护层 — 15 种反模式检测(RED 阶段 3
|
|
|
32
32
|
| 2 | **Mock 预定结论而非准备条件** | `when(bookMapper.countByPublisher(1L)).thenReturn(3)` 后只测 `if (count > 0) throw` — trivial 逻辑 | "我的测试是在验证完整行为链路,还是只验证一个 if 分支?" | Mock 边界依赖(Mapper)是合理的,但测试断言应验证完整行为链路(如 verify 不会执行 delete) |
|
|
33
33
|
| 3 | **Given 不是真实输入** | mock 出"这个输入会导致什么结果",而非传入真实数据让被测代码自行处理 | "我的 Given 是真实数据还是 mock 出的预定结论?" | 传入真实数据(如 `"invalid"` 字符串、`null`、空对象),让被测代码自行决定结果 |
|
|
34
34
|
|
|
35
|
-
## §4 GREEN 后反模式(
|
|
35
|
+
## §4 GREEN 后反模式(13 种)
|
|
36
36
|
|
|
37
37
|
| # | 反模式 | 问题表现 | 修复方案 |
|
|
38
38
|
|---|--------|---------|---------|
|
|
@@ -48,6 +48,7 @@ description: "测试反模式防护层 — 15 种反模式检测(RED 阶段 3
|
|
|
48
48
|
| 13 | **魔法值** | 测试中使用未解释的字面值(如 `assertEquals(42, result)` 无注释说明 42 的含义) | 使用命名常量或注释解释字面值含义 |
|
|
49
49
|
| 14 | **断言不足** | 只断言了部分结果,遗漏了关键属性(如只 assertNotNull 但不 assertEquals 具体值) | 每个测试至少有一个具体值断言(assertEquals),而非仅 assertNotNull |
|
|
50
50
|
| 15 | **缺少负面测试** | 只测试正常路径,不测试错误条件 | 每个方法至少有一个异常路径测试(见 `opsx-tdd-rules/rules/exception-path-coverage.md`) |
|
|
51
|
+
| 16 | **AC 变体覆盖不足** | AC 场景描述含"或"条件(如"缺少 A 或 B 或为空"),但测试只覆盖部分变体 | AC 中每个"或"条件变体必须有对应测试方法(规则见 `opsx-tdd-rules/rules/multi-validation-split.md` §AC 内"或"条件变体覆盖) |
|
|
51
52
|
|
|
52
53
|
## §5 门禁函数
|
|
53
54
|
|
|
@@ -82,3 +83,5 @@ AFTER GREEN(GREEN 完成后、标记通过前):
|
|
|
82
83
|
- 测试中只有 `assertNotNull` 无具体值断言
|
|
83
84
|
- 测试中存在未解释的魔法数字/字符串
|
|
84
85
|
- 正常路径有测试但异常路径无测试
|
|
86
|
+
- AC 场景描述含"或"条件但测试只覆盖部分变体
|
|
87
|
+
- 连续 RED/GREEN 的 task_update 时间戳差距过小(批量执行信号,违反 TDD 严格串行)
|
|
@@ -195,6 +195,35 @@ assertEquals("user-001", result.getUserId());
|
|
|
195
195
|
|
|
196
196
|
**修复**:每个方法至少有一个异常路径测试。规则见 `opsx-tdd-rules/rules/exception-path-coverage.md`。
|
|
197
197
|
|
|
198
|
+
## 反模式 16:AC 变体覆盖不足
|
|
199
|
+
|
|
200
|
+
**问题**:AC 场景描述含"或"条件(如"缺少 A 或 B 或为空"),但测试只覆盖部分变体,其余变体无测试守护。
|
|
201
|
+
|
|
202
|
+
**反例**:
|
|
203
|
+
```java
|
|
204
|
+
// AC-004: 请求体缺少 username 或 password 字段,或字段值为空字符串
|
|
205
|
+
// 仅测试 1/6 变体
|
|
206
|
+
@Test
|
|
207
|
+
void login_withMissingParams_returns1001() {
|
|
208
|
+
mockMvc.perform(post("/login")
|
|
209
|
+
.content("{\"username\":\"\",\"password\":\"admin123\"}"))
|
|
210
|
+
.andExpect(jsonPath("$.code").value(1001));
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**正例**:
|
|
215
|
+
```java
|
|
216
|
+
// 每个变体都有测试方法(或参数化测试)
|
|
217
|
+
@Test void login_withEmptyUsername_returns1001() { ... }
|
|
218
|
+
@Test void login_withEmptyPassword_returns1001() { ... }
|
|
219
|
+
@Test void login_withMissingUsernameField_returns1001() { ... }
|
|
220
|
+
@Test void login_withMissingPasswordField_returns1001() { ... }
|
|
221
|
+
@Test void login_withBothEmpty_returns1001() { ... }
|
|
222
|
+
@Test void login_withBothMissing_returns1001() { ... }
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**修复**:AC 中每个"或"条件变体必须有对应测试方法。规则见 `opsx-tdd-rules/rules/multi-validation-split.md` §AC 内"或"条件变体覆盖。
|
|
226
|
+
|
|
198
227
|
## TDD 如何防止这些反模式
|
|
199
228
|
|
|
200
229
|
1. 先写测试 → 迫使你思考实际在测试什么
|
|
@@ -40,6 +40,9 @@ description: "opsx-tdd-core 自检清单 — TDD 执行合规自检、合规性
|
|
|
40
40
|
- [ ] 每个 RED 任务包含测试方法名(`{method}_{state}_{outcome}` 格式)
|
|
41
41
|
- [ ] 每个 GREEN 任务包含 YAGNI 围栏声明("不提前实现 [后续 RED 行为]")
|
|
42
42
|
- [ ] 每个 REFACTOR 任务列出至少 2 个具体重构点
|
|
43
|
+
- [ ] ⛔ **CON 覆盖**:spec.md 中每个 CON 在 tasks.md 中有对应验证任务或显式声明间接覆盖
|
|
44
|
+
- [ ] ⛔ **安全/审计要求覆盖**:spec.md §5.x 中的安全与审计要求在 tasks.md 中有对应任务或显式声明推迟
|
|
45
|
+
- [ ] ⛔ **AC 变体覆盖**:spec.md 中含"或"条件的 AC 场景,其 RED 任务验收标准列出所有变体的测试方法(引用 `opsx-tdd-rules/rules/multi-validation-split.md`)
|
|
43
46
|
|
|
44
47
|
## §C 完成验证清单(8 项)
|
|
45
48
|
|
|
@@ -53,5 +56,6 @@ description: "opsx-tdd-core 自检清单 — TDD 执行合规自检、合规性
|
|
|
53
56
|
- [ ] 输出纯净(无错误/警告)
|
|
54
57
|
- [ ] 测试使用真实代码(仅在不可避免时使用 mock)
|
|
55
58
|
- [ ] 边界情况和错误已覆盖
|
|
59
|
+
- [ ] ⛔ **AC "或"条件变体全覆盖**:AC 场景描述含"或"条件时,每个变体都有对应测试方法(引用 `opsx-tdd-rules/rules/multi-validation-split.md`)
|
|
56
60
|
|
|
57
61
|
> Can't check all boxes? You skipped TDD. Start over.
|
|
@@ -24,6 +24,6 @@ description: "TDD 规则库 — DAG 生成规则、Controller 策略、任务类
|
|
|
24
24
|
| `rules/green-yagni-fence.md` | GREEN 任务 YAGNI 围栏自动注入规则 | HIGH | opsx-task |
|
|
25
25
|
| `rules/green-scope-declaration.md` | GREEN 任务 Scope 声明步骤(断言清单→流程标记→仅实现属于的步骤) | HIGH | opsx-apply |
|
|
26
26
|
| `rules/des-step-annotation.md` | DES 元素步骤级标注规则(TDD 模式下标注 [GREEN-N] 归属) | MEDIUM | opsx-design |
|
|
27
|
-
| `rules/multi-validation-split.md` | 多校验条件拆分规则(每个校验条件须有独立 AC
|
|
27
|
+
| `rules/multi-validation-split.md` | 多校验条件拆分规则(每个校验条件须有独立 AC 场景;AC 内"或"条件变体须全覆盖) | MEDIUM | opsx-spec, opsx-task, opsx-check |
|
|
28
28
|
| `rules/exception-path-coverage.md` | 异常路径测试覆盖门禁(每个 orElseThrow/边界检查须有对应 RED 测试) | HIGH | opsx-task, opsx-apply, opsx-check |
|
|
29
29
|
| `rules/refactor-checklist.md` | REFACTOR 阶段检查点(public API 不变、行为保持、重构质量评估) | HIGH | opsx-apply, opsx-tdd-core |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 多校验拆分规则
|
|
2
2
|
|
|
3
3
|
> 影响等级:MEDIUM
|
|
4
|
-
> 引用方:opsx-spec(spec.md 生成)、opsx-spec/checklist.md
|
|
4
|
+
> 引用方:opsx-spec(spec.md 生成)、opsx-spec/checklist.md(自检)、opsx-task(RED 任务拆解)、opsx-check(一致性检查)
|
|
5
5
|
|
|
6
6
|
## 问题
|
|
7
7
|
|
|
@@ -34,3 +34,37 @@ AC-03: 可借数量不足(available_count = 0)
|
|
|
34
34
|
```
|
|
35
35
|
|
|
36
36
|
> 目的:每个校验条件有独立场景 → 独立 RED 测试 → 独立 GREEN 实现,避免 AI 在一个 GREEN 中实现所有校验。
|
|
37
|
+
|
|
38
|
+
## AC 内"或"条件变体覆盖
|
|
39
|
+
|
|
40
|
+
> 引用方:opsx-spec(spec.md 生成)、opsx-task(RED 任务拆解)、opsx-check(一致性检查)
|
|
41
|
+
|
|
42
|
+
### 问题
|
|
43
|
+
|
|
44
|
+
单个 AC 场景描述中包含"或"条件时(如"缺少 username **或** password 字段,或字段值为空字符串"),AI 在拆解 RED 任务时倾向于只取一个变体编写测试,导致其余变体无测试守护。
|
|
45
|
+
|
|
46
|
+
### 规则
|
|
47
|
+
|
|
48
|
+
当单个 AC 场景描述包含"或"条件时,必须检查:
|
|
49
|
+
|
|
50
|
+
1. 每个"或"条件变体是否有对应的测试方法
|
|
51
|
+
2. 若多个变体共享一个 RED 任务,RED 验收标准中必须列出所有变体的测试方法名
|
|
52
|
+
3. 变体可合并到一个 RED 任务的多个 `@Test` 方法中,但不得遗漏任何变体
|
|
53
|
+
|
|
54
|
+
### 反例(禁止)
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
AC-004: 请求体缺少 username 或 password 字段,或字段值为空字符串
|
|
58
|
+
RED-4: login_withMissingParams_returns1001
|
|
59
|
+
→ 仅测试 username="" 一种变体,password="" / 缺少字段 / 双空 / 双缺共 5 种变体未覆盖
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 正例(要求)
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
AC-004: 请求体缺少 username 或 password 字段,或字段值为空字符串
|
|
66
|
+
RED-4: login_withMissingParams_returns1001(含 6 个 @Test 方法或参数化测试)
|
|
67
|
+
→ username="" / password="" / 缺少 username / 缺少 password / 双空 / 双缺 均有测试
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
> 目的:spec 中"或"条件描述的每个变体都有测试守护,防止参数校验逻辑回归。
|