@miniidealab/openlogos 0.2.0 → 0.3.1
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/dist/commands/init.d.ts +9 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +219 -8
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +9 -41
- package/dist/commands/sync.js.map +1 -1
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +14 -0
- package/dist/i18n.js.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +5 -2
- package/skills/api-designer/SKILL.en.md +209 -0
- package/skills/api-designer/SKILL.md +209 -0
- package/skills/architecture-designer/SKILL.en.md +181 -0
- package/skills/architecture-designer/SKILL.md +181 -0
- package/skills/change-writer/SKILL.en.md +146 -0
- package/skills/change-writer/SKILL.md +146 -0
- package/skills/code-reviewer/SKILL.en.md +204 -0
- package/skills/code-reviewer/SKILL.md +204 -0
- package/skills/db-designer/SKILL.en.md +212 -0
- package/skills/db-designer/SKILL.md +212 -0
- package/skills/merge-executor/SKILL.en.md +84 -0
- package/skills/merge-executor/SKILL.md +84 -0
- package/skills/prd-writer/SKILL.en.md +171 -0
- package/skills/prd-writer/SKILL.md +171 -0
- package/skills/product-designer/SKILL.en.md +228 -0
- package/skills/product-designer/SKILL.md +228 -0
- package/skills/project-init/SKILL.en.md +163 -0
- package/skills/project-init/SKILL.md +163 -0
- package/skills/scenario-architect/SKILL.en.md +214 -0
- package/skills/scenario-architect/SKILL.md +214 -0
- package/skills/test-orchestrator/SKILL.en.md +142 -0
- package/skills/test-orchestrator/SKILL.md +142 -0
- package/skills/test-writer/SKILL.en.md +247 -0
- package/skills/test-writer/SKILL.md +247 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# Skill: Test Writer
|
|
2
|
+
|
|
3
|
+
> 基于时序图、API 规格和 DB 约束,为每个业务场景设计单元测试用例和场景测试用例。适用于所有项目类型(API 服务、CLI 工具、前端应用、库等),是代码生成前的必要前置步骤。
|
|
4
|
+
|
|
5
|
+
## 触发条件
|
|
6
|
+
|
|
7
|
+
- 用户要求设计测试用例或测试方案
|
|
8
|
+
- 用户提到 "Phase 3 Step 3"、"Step 3a"、"测试先行"、"测试设计"
|
|
9
|
+
- 已有场景时序图,需要在写代码前设计测试
|
|
10
|
+
- 用户指定某个场景编号(如 S01)需要设计测试
|
|
11
|
+
|
|
12
|
+
## 前置依赖
|
|
13
|
+
|
|
14
|
+
- `logos/resources/prd/3-technical-plan/2-scenario-implementation/` 中包含场景时序图(**必需**)
|
|
15
|
+
- `logos/resources/api/` 中包含 API 规格(有则读取,无则跳过——非 API 项目可能没有)
|
|
16
|
+
- `logos/resources/database/` 中包含 DB DDL(有则读取,无则跳过)
|
|
17
|
+
- `logos/resources/prd/1-product-requirements/` 中包含需求文档(用于追溯验收条件)
|
|
18
|
+
|
|
19
|
+
**不可跳过**:无论项目类型如何,Step 3a(本 Skill)都必须执行。
|
|
20
|
+
|
|
21
|
+
## 核心能力
|
|
22
|
+
|
|
23
|
+
1. 从 API 字段约束(类型、格式、长度、枚举)中提取单元测试用例
|
|
24
|
+
2. 从 DB 约束(UNIQUE、CHECK、NOT NULL、FK)中提取单元测试用例
|
|
25
|
+
3. 从业务规则和 EX 异常用例中的单点错误处理提取单元测试用例
|
|
26
|
+
4. 从时序图 Step 序列提取场景测试用例(主路径)
|
|
27
|
+
5. 从 EX 异常用例提取场景测试用例(异常路径)
|
|
28
|
+
6. 从 Phase 1/2 验收条件反向校验测试覆盖完整性
|
|
29
|
+
|
|
30
|
+
## 执行步骤
|
|
31
|
+
|
|
32
|
+
### Step 1: 加载场景上下文
|
|
33
|
+
|
|
34
|
+
读取以下文件建立完整上下文:
|
|
35
|
+
|
|
36
|
+
- 场景时序图(`logos/resources/prd/3-technical-plan/2-scenario-implementation/`)
|
|
37
|
+
- API YAML(`logos/resources/api/`)—— 如果存在
|
|
38
|
+
- DB DDL(`logos/resources/database/`)—— 如果存在
|
|
39
|
+
- Phase 1 需求文档(验收条件)
|
|
40
|
+
- Phase 2 产品设计文档(交互级验收条件)
|
|
41
|
+
|
|
42
|
+
确认当前场景的:
|
|
43
|
+
- **Step 数量**:时序图中有多少个 Step
|
|
44
|
+
- **EX 数量**:有多少个异常用例
|
|
45
|
+
- **API 端点**:涉及哪些端点及其字段约束
|
|
46
|
+
- **DB 表**:涉及哪些表及其约束
|
|
47
|
+
|
|
48
|
+
### Step 2: 设计单元测试用例
|
|
49
|
+
|
|
50
|
+
从三类来源提取单元测试用例:
|
|
51
|
+
|
|
52
|
+
#### 2a: API 字段约束
|
|
53
|
+
|
|
54
|
+
逐个检查 API 端点的 `requestBody` 和 `parameters`:
|
|
55
|
+
|
|
56
|
+
- `type` → 类型错误用例(传入错误类型)
|
|
57
|
+
- `format`(email、uuid、date-time)→ 格式校验用例
|
|
58
|
+
- `minLength` / `maxLength` → 边界值用例(刚好达到、超出 1 位)
|
|
59
|
+
- `required` → 必填缺失用例
|
|
60
|
+
- `enum` → 枚举值用例(合法值 + 非法值)
|
|
61
|
+
- `minimum` / `maximum` → 数值范围用例
|
|
62
|
+
|
|
63
|
+
#### 2b: DB 约束
|
|
64
|
+
|
|
65
|
+
逐个检查相关表的约束:
|
|
66
|
+
|
|
67
|
+
- `UNIQUE` → 重复插入用例
|
|
68
|
+
- `NOT NULL` → 空值插入用例
|
|
69
|
+
- `CHECK` → 违反检查条件的用例
|
|
70
|
+
- `FOREIGN KEY` → 引用不存在记录的用例
|
|
71
|
+
- `DEFAULT` → 不传值时默认值验证
|
|
72
|
+
|
|
73
|
+
#### 2c: 业务规则
|
|
74
|
+
|
|
75
|
+
从时序图 Step 说明和 EX 异常用例中提取单点业务逻辑:
|
|
76
|
+
|
|
77
|
+
- 权限检查(未登录、无权限)
|
|
78
|
+
- 状态机转换(只有特定状态才能执行操作)
|
|
79
|
+
- 限流 / 频控规则
|
|
80
|
+
- 数据计算逻辑(金额计算、折扣规则)
|
|
81
|
+
|
|
82
|
+
**每个单元测试用例格式**:
|
|
83
|
+
|
|
84
|
+
| 字段 | 说明 |
|
|
85
|
+
|------|------|
|
|
86
|
+
| ID | `UT-{场景编号}-{序号}`,如 `UT-S01-01` |
|
|
87
|
+
| 描述 | 测试什么行为 |
|
|
88
|
+
| 来源 | 约束出处(如 `auth.yaml → register → email: format:email`) |
|
|
89
|
+
| 前置条件 | 测试前需要的状态 |
|
|
90
|
+
| 输入 | 具体输入值 |
|
|
91
|
+
| 预期输出 | 期望的返回值或错误信息 |
|
|
92
|
+
|
|
93
|
+
### Step 3: 设计场景测试用例
|
|
94
|
+
|
|
95
|
+
从两类来源提取场景测试用例:
|
|
96
|
+
|
|
97
|
+
#### 3a: 主路径(时序图 Step 序列)
|
|
98
|
+
|
|
99
|
+
将时序图的完整 Step 1 → Step N 视为一次端到端代码调用链:
|
|
100
|
+
|
|
101
|
+
- 确定场景的入口和出口
|
|
102
|
+
- 标注每个 Step 之间的数据传递(前一步输出作为后一步输入)
|
|
103
|
+
- 验证最终状态(数据库记录、返回值)
|
|
104
|
+
|
|
105
|
+
#### 3b: 异常路径(EX 异常用例)
|
|
106
|
+
|
|
107
|
+
将每个 EX 异常用例展开为场景测试用例:
|
|
108
|
+
|
|
109
|
+
- 标注异常在哪个 Step 触发
|
|
110
|
+
- 验证异常触发后的处理逻辑(错误返回、补偿/回滚)
|
|
111
|
+
- 验证异常未影响其他数据的完整性
|
|
112
|
+
|
|
113
|
+
**每个场景测试用例格式**:
|
|
114
|
+
|
|
115
|
+
| 字段 | 说明 |
|
|
116
|
+
|------|------|
|
|
117
|
+
| ID | `ST-{场景编号}-{序号}`,如 `ST-S01-01` |
|
|
118
|
+
| 描述 | 测试什么场景流程 |
|
|
119
|
+
| 覆盖 Steps | 覆盖时序图的哪些 Step(如 `Step 1→6`)或哪个 EX(如 `EX-2.1`) |
|
|
120
|
+
| 前置条件 | 测试前需要的状态和数据 |
|
|
121
|
+
| 操作序列 | 按 Step 顺序的操作列表 |
|
|
122
|
+
| 预期结果 | 最终状态(返回值 + 数据库状态 + 副作用) |
|
|
123
|
+
|
|
124
|
+
### Step 4: 覆盖度校验
|
|
125
|
+
|
|
126
|
+
反向校验测试用例是否覆盖了所有关键约束:
|
|
127
|
+
|
|
128
|
+
- [ ] Phase 1 每个正常验收条件至少对应 1 个 ST 用例
|
|
129
|
+
- [ ] Phase 1 每个异常验收条件至少对应 1 个 ST 或 UT 用例
|
|
130
|
+
- [ ] 每个 EX 异常用例至少对应 1 个 ST 用例
|
|
131
|
+
- [ ] API 每个 `required` 字段至少 1 个 UT 用例
|
|
132
|
+
- [ ] DB 每个 `UNIQUE` / `CHECK` 约束至少 1 个 UT 用例
|
|
133
|
+
|
|
134
|
+
如有未覆盖项,补充用例或向用户说明理由。
|
|
135
|
+
|
|
136
|
+
### Step 5: 验收条件追溯
|
|
137
|
+
|
|
138
|
+
将 Phase 1 需求文档中的每个 GIVEN/WHEN/THEN 验收条件提取出来,为每条分配一个追溯 ID,并关联到覆盖该条件的测试用例 ID。
|
|
139
|
+
|
|
140
|
+
#### 验收条件 ID 规则
|
|
141
|
+
|
|
142
|
+
- 格式:`{场景编号}-AC-{两位序号}`,如 `S01-AC-01`、`S01-AC-02`
|
|
143
|
+
- 按需求文档中出现的顺序编号,正常和异常条件统一编号
|
|
144
|
+
- 同一场景的 AC ID 必须连续且唯一
|
|
145
|
+
|
|
146
|
+
#### 追溯表填写规则
|
|
147
|
+
|
|
148
|
+
1. 从需求文档读取当前场景的所有验收条件(正常 + 异常)
|
|
149
|
+
2. 为每条验收条件分配 AC ID
|
|
150
|
+
3. 找到覆盖该条件的测试用例 ID(可以是 UT 或 ST),填入「覆盖用例」列
|
|
151
|
+
4. 每个 AC 至少关联 1 个测试用例;如果无法覆盖,在「覆盖用例」列注明原因
|
|
152
|
+
|
|
153
|
+
`openlogos verify` 会解析此追溯表,将 AC → 用例 ID → 运行结果三层联动,生成完整的验收追溯报告。
|
|
154
|
+
|
|
155
|
+
### Step 6: 输出测试用例规格文档
|
|
156
|
+
|
|
157
|
+
按场景输出 Markdown 格式的测试用例规格文档。
|
|
158
|
+
|
|
159
|
+
### Step 7: 引导后续操作
|
|
160
|
+
|
|
161
|
+
根据项目类型引导用户进入下一步:
|
|
162
|
+
|
|
163
|
+
- **涉及 API** → 「继续进入 Step 3b 设计 API 编排测试?」
|
|
164
|
+
- **不涉及 API** → 「测试设计已完成,建议进入代码生成:对我说『按 S01 的规格帮我实现』」
|
|
165
|
+
|
|
166
|
+
## 输出规范
|
|
167
|
+
|
|
168
|
+
- **文件格式**:Markdown
|
|
169
|
+
- **存放位置**:`logos/resources/test/`
|
|
170
|
+
- **命名规则**:`{场景编号}-test-cases.md`(如 `S01-test-cases.md`)
|
|
171
|
+
- 每个文件包含:单元测试用例(按来源分组)+ 场景测试用例(主路径 + 异常路径)
|
|
172
|
+
- 用例 ID 全局唯一:`UT-{场景编号}-{序号}` / `ST-{场景编号}-{序号}`
|
|
173
|
+
|
|
174
|
+
### 文档结构模板
|
|
175
|
+
|
|
176
|
+
```markdown
|
|
177
|
+
# {场景编号}: {场景名称} — 测试用例
|
|
178
|
+
|
|
179
|
+
## 一、单元测试用例
|
|
180
|
+
|
|
181
|
+
### 1.1 {分组名称}(来源:{约束出处})
|
|
182
|
+
|
|
183
|
+
| ID | 描述 | 来源 | 前置条件 | 输入 | 预期输出 |
|
|
184
|
+
|----|------|------|---------|------|---------|
|
|
185
|
+
| UT-S01-01 | ... | ... | ... | ... | ... |
|
|
186
|
+
|
|
187
|
+
## 二、场景测试用例
|
|
188
|
+
|
|
189
|
+
### 2.1 主路径:{场景名称}
|
|
190
|
+
|
|
191
|
+
| ID | 描述 | 覆盖 Steps | 前置条件 | 操作序列 | 预期结果 |
|
|
192
|
+
|----|------|-----------|---------|---------|---------|
|
|
193
|
+
| ST-S01-01 | ... | Step 1→6 | ... | ... | ... |
|
|
194
|
+
|
|
195
|
+
### 2.2 异常路径
|
|
196
|
+
|
|
197
|
+
| ID | 描述 | 覆盖 EX | 前置条件 | 触发条件 | 预期结果 |
|
|
198
|
+
|----|------|--------|---------|---------|---------|
|
|
199
|
+
| ST-S01-02 | ... | EX-2.1 | ... | ... | ... |
|
|
200
|
+
|
|
201
|
+
## 三、覆盖度校验
|
|
202
|
+
|
|
203
|
+
- [x] Phase 1 正常验收条件:全部覆盖
|
|
204
|
+
- [x] Phase 1 异常验收条件:全部覆盖
|
|
205
|
+
- [x] EX 异常用例:全部覆盖
|
|
206
|
+
- [x] API required 字段:全部覆盖
|
|
207
|
+
- [x] DB UNIQUE/CHECK 约束:全部覆盖
|
|
208
|
+
|
|
209
|
+
## 四、验收条件追溯
|
|
210
|
+
|
|
211
|
+
| AC ID | 验收条件 | 覆盖用例 |
|
|
212
|
+
|-------|---------|---------|
|
|
213
|
+
| S01-AC-01 | 正常:全新项目初始化 — 创建完整目录结构 | ST-S01-01 |
|
|
214
|
+
| S01-AC-02 | 正常:显式项目名与配置文件不一致时确认 | ST-S01-02 |
|
|
215
|
+
| S01-AC-03 | 异常:项目已初始化 — 显示错误提示 | ST-S01-03, UT-S01-05 |
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## 用例 ID 合约
|
|
219
|
+
|
|
220
|
+
用例 ID(`UT-S01-01`、`ST-S01-01`)是设计文档与运行时的**绑定合约**:
|
|
221
|
+
|
|
222
|
+
- 在 test-cases.md 中定义的 ID,必须在生成的测试代码中被原样使用
|
|
223
|
+
- 测试代码的 reporter 会把每个用例的 ID 和运行结果写入 JSONL 文件
|
|
224
|
+
- `openlogos verify` 通过 ID 将运行结果映射回测试用例规格,自动判定验收
|
|
225
|
+
- 修改用例 ID 时必须同步修改测试代码中的 ID
|
|
226
|
+
|
|
227
|
+
详细的 JSONL 格式定义和各语言 reporter 代码模板见 `spec/test-results.md`。
|
|
228
|
+
|
|
229
|
+
## 实践经验
|
|
230
|
+
|
|
231
|
+
- **测试用例是设计文档,不是代码**:本 Skill 产出的是 Markdown 格式的测试用例规格,具体的测试代码在 Step 4 代码生成阶段由 AI 基于此规格实现
|
|
232
|
+
- **先单元后场景**:单元测试用例覆盖单个函数的正确性,场景测试覆盖跨模块串联——先确保积木正确,再验证积木拼接
|
|
233
|
+
- **不要遗漏 DB 约束**:很多 Bug 来自数据库层面的约束违反,DB 约束是单元测试用例的重要来源
|
|
234
|
+
- **场景测试关注数据传递**:Step 间的数据传递(前一步输出 → 后一步输入)是最容易出错的地方
|
|
235
|
+
- **EX 异常用例必须有对应的场景测试**:时序图中标注的每个 EX 都应该在场景测试中有体现
|
|
236
|
+
- **边界值优先**:单元测试用例优先覆盖边界值(刚好合法、刚好非法),而不是随机值
|
|
237
|
+
- **与 test-orchestrator 互补**:本 Skill 设计代码层面的测试(函数调用级),test-orchestrator 设计 API 层面的测试(HTTP 请求级)。二者共同覆盖"测试金字塔"的不同层级
|
|
238
|
+
- **用例 ID 是跨阶段合约**:ID 贯穿 test-cases.md → 测试代码 → test-results.jsonl → acceptance-report.md,任何一处不一致都会导致 `openlogos verify` 报告不完整
|
|
239
|
+
|
|
240
|
+
## 推荐提示词
|
|
241
|
+
|
|
242
|
+
以下提示词可以直接复制给 AI 使用:
|
|
243
|
+
|
|
244
|
+
- `帮我设计测试用例`
|
|
245
|
+
- `帮我设计 S01 的单元测试和场景测试`
|
|
246
|
+
- `帮我给所有 P0 场景设计测试用例`
|
|
247
|
+
- `帮我检查 S01 的测试覆盖度`
|