Files
junhong_cmp_fiber/.claude/commands/opsx/gen-tests.md
huang 8ab5ebc3af
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m2s
feat: 在 IoT 卡和设备列表响应中添加套餐系列名称字段
主要变更:
- 在 StandaloneIotCardResponse 和 DeviceResponse 中添加 series_name 字段
- 在 iot_card 和 device service 中添加 loadSeriesNames 方法批量加载系列名称
- 更新相关方法以支持 series_name 的填充

其他变更:
- 新增 OpenSpec 测试生成和共识锁定 skill
- 新增 MCP 配置文件
- 更新 CLAUDE.md 项目规范文档

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 15:28:41 +08:00

134 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
description: 从 Spec 的 Scenarios 和 Business Flows 自动生成验收测试和流程测试
---
从 Spec 文档自动生成两类测试:
1. **验收测试**Acceptance Tests从 Scenarios 生成,验证单 API 契约
2. **流程测试**Flow Tests从 Business Flows 生成,验证多 API 业务场景
**Input**: 可选指定 change 名称(如 `/opsx:gen-tests add-auth`)。如果省略,从上下文推断或提示选择。
**Steps**
1. **选择 change**
如果提供了名称,使用它。否则:
- 从对话上下文推断
- 如果只有一个活跃 change自动选择
- 如果模糊,运行 `openspec list --json` 让用户选择
2. **检查 change 状态**
```bash
openspec status --change "<name>" --json
```
确认 specs artifact 已完成(`status: "done"`
3. **读取 spec 文件**
读取 `openspec/changes/<change-name>/specs/*/spec.md` 下的所有 spec 文件。
4. **解析 Scenarios**
从每个 spec 文件中提取 `#### Scenario:` 块:
```markdown
#### Scenario: 成功创建套餐
- **GIVEN** 用户已登录且有创建权限
- **WHEN** POST /api/admin/packages with valid data
- **THEN** 返回 200 和套餐详情
```
5. **解析 Business Flows**(如果存在)
从 spec 文件中提取 `### Flow:` 块,包含多步骤业务场景。
6. **生成验收测试**
输出路径:`tests/acceptance/<capability>_acceptance_test.go`
模板结构:
```go
func Test{Capability}_Acceptance(t *testing.T) {
env := testutils.NewIntegrationTestEnv(t)
t.Run("Scenario_{name}", func(t *testing.T) {
// GIVEN: ...
// WHEN: ...
// THEN: ...
// 破坏点:...
})
}
```
7. **生成流程测试**
输出路径:`tests/flows/<capability>_<flow>_flow_test.go`
模板结构:
```go
func TestFlow_{FlowName}(t *testing.T) {
env := testutils.NewIntegrationTestEnv(t)
var (
// 流程级共享状态
)
t.Run("Step1_{name}", func(t *testing.T) {
// 依赖:...
// 破坏点:...
})
}
```
8. **运行测试验证**
```bash
source .env.local && go test -v ./tests/acceptance/... ./tests/flows/... 2>&1 | head -50
```
**预期**:全部 FAIL功能未实现证明测试有效
**如果测试 PASS**:说明测试写得太弱,需要加强
**Output**
```
## 测试生成完成
**Change:** <change-name>
**来源:** specs/<capability>/spec.md
### 生成的测试文件
**验收测试** (tests/acceptance/):
- <capability>_acceptance_test.go
- Scenario_xxx
- Scenario_yyy
**流程测试** (tests/flows/):
- <capability>_<flow>_flow_test.go
- Step1_xxx
- Step2_yyy
### 验证结果
$ source .env.local && go test -v ./tests/acceptance/... ./tests/flows/...
--- FAIL: TestXxx_Acceptance (0.00s)
--- FAIL: TestXxx_Acceptance/Scenario_xxx (0.00s)
xxx_acceptance_test.go:45: 404 != 200
✓ 所有测试预期 FAIL功能未实现
✓ 测试生成完成
下一步: 开始实现 tasks每完成一个功能单元运行相关测试验证
```
**Guardrails**
- 每个 Scenario 必须生成一个测试用例(不要跳过)
- 每个测试必须包含"破坏点"注释
- 流程测试的 step 必须声明依赖
- 使用 IntegrationTestEnv不要 mock 依赖
- 测试必须在功能缺失时 FAIL不要写永远 PASS 的测试)
- 详细模板参考:`.opencode/skills/openspec-generate-acceptance-tests/SKILL.md`