test-suite-maintainer
测试用例集维护
这个skill帮助你维护一份项目全量测试用例与自动化测试脚本,确保迭代过程中测试始终与代码同步。
核心概念
测试清单(test-manifest.yaml) 是整个skill的核心。它记录:
- 所有功能模块及其测试用例
- 每个用例的状态(active/skip/pending)
- 用例与代码路径的关联关系
- 用例优先级和分类
通过这份清单,你可以:
- 快速了解项目测试覆盖全貌
- 检测代码变更后确定哪些测试需要更新
- 上线前执行全量测试并验证覆盖
测试计划文档(test-plan.md) 是脚本生成的评审中间产物。在新增或更新测试时,先生成此文档描述即将创建/修改的脚本及其执行流程,经用户评审确认后再生成实际脚本。这样做是因为:
- 测试脚本的逻辑正确性很难通过直接阅读代码快速评审
- 先用自然语言描述测试意图和流程,评审者能更高效地发现逻辑遗漏
- 文档与脚本形成双层约束,文档确认后脚本只需忠实实现文档内容
推荐技术栈
| 项目类型 | 测试框架 | 说明 |
|---|---|---|
| Python | pytest | fixture机制强大,插件生态丰富,按模块组织测试 |
| NextJS | Vitest | 与Vite原生集成,速度快,支持项目分隔 |
目录结构
测试用例集维护在 workplace/test/ 目录下:
workplace/test/
├── test-manifest.yaml # 全量用例清单(核心文件)
├── test-plan.md # 测试计划文档(评审中间产物)
├── python/ # Python项目测试
│ ├── conftest.py # 共享fixtures和配置
│ ├── pytest.ini # pytest配置(可选)
│ ├── auth/ # 功能模块:认证
│ │ ├── test_login.py # 登录测试
│ │ └── test_register.py # 注册测试
│ ├── payment/ # 功能模块:支付
│ │ ├── test_checkout.py
│ │ └── test_refund.py
│ └── ...
├── nextjs/ # NextJS项目测试
│ ├── vitest.config.ts # Vitest配置
│ ├── setup.ts # 测试setup文件
│ ├── auth/
│ │ ├── login.test.ts
│ │ ├── register.test.ts
│ ├── payment/
│ │ ├── checkout.test.ts
│ │ └── refund.test.ts
│ └── ...
test-manifest.yaml 格式
version: "1.0"
project:
name: "项目名称"
python_root: "src/" # Python代码根目录(相对项目根)
nextjs_root: "app/" # NextJS代码根目录
modules:
auth: # 功能模块名
description: "用户认证模块"
code_paths: # 关联的代码路径(用于变更检测)
- "src/auth/"
- "app/api/auth/"
priority: high # 模块优先级: high/medium/low
cases:
- name: "用户登录"
id: "auth-login-001"
status: active # active/skip/pending
type: unit # unit/integration/e2e
script: "python/auth/test_login.py::test_login_success"
coverage:
- "src/auth/login.py"
- "app/api/auth/login/route.ts"
last_run: "2026-04-15"
notes: "验证正常登录流程"
- name: "登录失败处理"
id: "auth-login-002"
status: active
type: unit
script: "python/auth/test_login.py::test_login_failure"
coverage: ["src/auth/login.py"]
last_run: "2026-04-15"
notes: "验证错误密码、账户锁定等场景"
payment:
description: "支付处理模块"
code_paths: ["src/payment/", "app/api/payment/"]
priority: high
cases:
- name: "支付流程"
id: "payment-checkout-001"
status: active
type: integration
script: "nextjs/payment/checkout.test.ts"
coverage: ["src/payment/checkout.py", "app/api/payment/route.ts"]
last_run: "2026-04-10"
notes: "完整支付流程测试,需mock支付网关"
test-plan.md 格式
测试计划文档是新增/更新测试时的评审入口,必须经用户确认后才能生成或修改脚本。
# 测试计划
**操作类型**: 新增 / 更新
**关联模块**: auth, payment
**日期**: 2026-04-20
## 变更概要
- 新增用户注册模块测试(3个用例)
- 更新支付退款测试以适配新退款策略(2个用例)
---
## 脚本清单
### 1. python/auth/test_register.py [新增]
测试用户注册功能,覆盖正常注册、重复注册、参数校验三个场景。
**用例列表:**
| 用例ID | 函数名 | 测试目标 | 前置条件 | 预期结果 |
|--------|--------|---------|---------|---------|
| auth-reg-001 | test_register_success | 正常注册流程 | 数据库无该用户 | 返回201,用户创建成功 |
| auth-reg-002 | test_register_duplicate | 重复用户名注册 | 数据库已存在该用户 | 返回409,提示用户已存在 |
| auth-reg-003 | test_register_invalid_input | 参数校验 | 无 | 非法邮箱/短密码返回422 |
**执行流程(test_register_success):**
1. 构造合法注册请求体(username, email, password)
2. 调用 POST /api/auth/register
3. 断言响应状态码 201
4. 断言响应体包含 user_id 字段
5. 查询数据库确认用户记录已创建
6. 清理测试数据
**执行流程(test_register_duplicate):**
1. 先注册一个用户(复用 fixture)
2. 用相同用户名再次调用注册接口
3. 断言响应状态码 409
4. 断言错误信息包含"已存在"
**执行流程(test_register_invalid_input):**
1. 分别传入空用户名、非法邮箱、短密码
2. 每种情况断言返回 422
3. 断言错误信息指出具体字段问题
**依赖:** conftest.py 中的 db_session fixture
---
### 2. python/payment/test_refund.py [更新]
适配新退款策略(部分退款 + 退款原因必填)。
**变更内容:**
| 用例ID | 变更类型 | 说明 |
|--------|---------|------|
| payment-refund-001 | 修改 | test_full_refund:新增退款原因参数 |
| payment-refund-002 | 新增 | test_partial_refund:测试部分退款场景 |
**执行流程(test_full_refund 变更):**
1. 构造退款请求,新增 `reason` 字段(必填)
2. 调用 POST /api/payment/refund
3. 断言响应状态码 200
4. 断言退款金额等于订单金额
5. 断言退款记录包含 reason 字段
**执行流程(test_partial_refund 新增):**
1. 构造部分退款请求(amount < 订单总额 + reason)
2. 调用 POST /api/payment/refund
3. 断言响应状态码 200
4. 断言退款金额等于请求金额
5. 断言订单状态变为"部分退款"
test-plan.md 的关键规则
- 每个脚本一个章节,用
### 脚本路径 [新增/更新]作为标题 - 用例列表用表格,列出函数名、测试目标、前置条件、预期结果
- 每个用例必须有执行流程,按步骤描述:准备数据 → 调用接口/函数 → 断言结果 → 清理
- 更新操作要标注变更类型:修改/新增/删除,并说明原用例的变化
- 文档只描述行为,不写代码 — 评审者关注的是测试逻辑是否完整,不是语法
工作流程
场景一:迭代上线前执行测试
- 读取清单 - 从
workplace/test/test-manifest.yaml加载全量用例 - 筛选执行 - 只执行
status: active的用例 - 优先级排序 - high > medium > low
- 运行测试 - 使用对应框架执行
- 生成报告 - 记录执行结果,更新
last_run字段
执行命令:
# Python测试
pytest workplace/test/python/ -v --tb=short
# NextJS测试
vitest run --config workplace/test/nextjs/vitest.config.ts
# 指定模块
pytest workplace/test/python/auth/ -v
vitest run --config workplace/test/nextjs/vitest.config.ts auth/
场景二:代码变更后更新测试
- 检测变更 - 使用
git diff获取变更文件 - 关联分析 - 遍历manifest,匹配
code_paths和coverage - 识别影响 - 列出所有受影响的测试用例
- 生成计划文档 - 将需要更新的脚本及其新执行流程写入
test-plan.md - 用户评审 - 展示计划文档,用户确认测试逻辑正确后再继续
- 更新脚本 - 根据确认后的计划文档更新对应测试脚本
- 同步清单 - 更新manifest中的用例描述、状态等
变更检测命令:
git diff HEAD~5 --name-only # 最近5次提交
git diff main...feature-branch --name-only # 分支差异
git diff --cached --name-only # 暂存区变更
场景三:新增功能添加测试
- 确认模块 - 判断新功能属于哪个模块
- 设计用例 - 分析功能点,设计测试用例列表
- 生成计划文档 - 将待创建的脚本及其执行流程写入
test-plan.md - 用户评审 - 展示计划文档,用户确认测试逻辑正确后再继续
- 编写脚本 - 根据确认后的计划文档创建测试文件,忠实实现文档中的执行流程
- 注册清单 - 在manifest中添加用例记录
Skill 执行步骤
Step 1: 理解用户意图
确认用户要做什么:
- 执行测试 - "上线前跑测试"、"执行全量用例"
- 更新测试 - "代码变了,更新相关测试"
- 添加测试 - "新功能完成,添加测试用例"
- 查看覆盖 - "看看测试覆盖情况"
意图不明确时询问澄清。
Step 2: 读取测试清单
读取 workplace/test/test-manifest.yaml:
- 不存在 → 初始化测试集(Step 5)
- 存在 → 解析内容继续
Step 3: 执行对应操作
执行测试:
- 筛选active用例
- 按优先级执行
- 收集结果更新last_run
- 生成报告
更新测试:
- git diff或用户指定变更范围
- 匹配manifest关联
- 列出受影响用例
- 生成 test-plan.md,描述每个需更新脚本的变更内容和新的执行流程
- 用户评审确认后,按计划文档更新脚本和manifest
添加测试:
- 分析功能测试点
- 生成 test-plan.md,描述每个待创建脚本的用例列表和执行流程
- 用户评审确认后,按计划文档创建测试文件
- manifest注册用例
查看覆盖:
- 统计manifest信息
- 展示模块覆盖
- 指出缺失/pending用例
Step 4: 更新测试清单
任何操作后更新 test-manifest.yaml:last_run、状态、新用例、notes
Step 5: 初始化测试集(如需要)
清单不存在时:
- 分析项目结构,识别功能模块
- 设计目录结构
- 生成 test-plan.md,描述每个模块的测试脚本计划和执行流程
- 用户评审确认计划文档
- 创建manifest骨架
- 扫描现有测试文件
- 按确认后的计划文档迁移或创建测试
测试脚本编写指南
Python (pytest)
# workplace/test/python/auth/test_login.py
import pytest
def test_login_success():
"""测试正常登录"""
# 实现测试
def test_login_failure_wrong_password():
"""测试密码错误"""
# 实现测试
@pytest.fixture
def mock_user():
return {"username": "testuser", "password": "testpass"}
NextJS (Vitest)
// workplace/test/nextjs/auth/login.test.ts
import { describe, it, expect, beforeEach } from 'vitest'
describe('Login', () => {
it('should login successfully', async () => {
// 实现测试
})
it('should handle wrong password', async () => {
// 实现测试
})
})
报告格式
执行完成后生成:
# 测试执行报告
**执行时间**: 2026-04-20 14:30
**项目**: 项目名称
## 执行统计
| 指标 | 数值 |
|-----|-----|
| 总用例数 | 45 |
| 执行用例 | 42 |
| 通过 | 40 |
| 失败 | 2 |
| 耗时 | 5m32s |
## 模块覆盖
| 模块 | 用例数 | 通过 | 失败 | 覆盖率 |
|-----|-------|-----|-----|-------|
| auth | 12 | 12 | 0 | 100% |
| payment | 8 | 6 | 2 | 75% |
## 失败详情
1. **payment-checkout-001**: 支付流程
- 错误: Mock支付网关超时
- 路径: nextjs/payment/checkout.test.ts
## 建议
- 修复payment模块失败用例后可上线
最佳实践
- 保持同步 - 代码变更时检查manifest
- 优先级管理 - 核心模块标记high
- 状态管理 - 过时用例标记skip而非删除
- 关联准确 - code_paths和coverage要准确
- 定期清理 - 清理skip无用用例
- 计划先行 - 新增或更新测试时,必须先输出 test-plan.md 并经用户确认,再生成脚本。脚本实现必须忠实于计划文档中描述的执行流程
- 计划与脚本一致 - 如果用户在评审中修改了计划文档,脚本按修改后的版本生成;如果后续需要调整脚本逻辑,应先更新计划文档再更新脚本
More from anian0/pick-skills
requirements-workshop
|
12tech-design
|
11plan-execution
|
10workspace-setup
|
8novel-setup
小说项目冷启动与长篇结构管理助手。用于从0创建小说项目、规划整体走向、维护故事大纲、追踪伏笔、维护主角档案与故事状态快照、维护"当前冲突"短期核心文档、构建并维护"创作风格知识库"(场景化描写规则+量化自检清单)、产出每章"开写简报"、接手待定设定中的世界规则/伏笔/大纲类条目晋升。触发场景:用户要求新建小说项目、开坑、规划大纲、设计世界观、创建主角、调整故事走向、追踪伏笔、检查故事进度、查看当前故事状态、设置/更新当前冲突、分卷分幕规划、时间线整理、晋升待定设定中的世界规则、调整写作注意事项、配置/扩展创作风格知识库、生成开写简报、配合设定体检或阶段回顾整改宏观设定、从参考小说提取创作风格等。与novel-lite(写章节)、novel-review(审章节)、novel-style-extract(风格提取)配套使用,负责"宏观层"。
5novel-lite
简洁小说章节创作助手,4阶段流程驱动。阶段0:读取novel-setup产出的开写简报;阶段1:基于简报提出3个创作方向并确认;阶段2:收集资料形成必看文档(含可执行自测逻辑);阶段3:基于必看文档创作正文并自测。负责单章的写、改、定稿、设定提取与待定设定管理,并在每5章定稿后触发阶段回顾建议。触发场景:用户要求写第X章、改章节、生成正文、从摘要扩写、提取实体、探索不同版本风格、定稿归档、更新角色/物品/技能设定、登记待定设定、晋升或废弃待定设定、讨论好坏示例、第5/10/15...章定稿后触发阶段回顾等。与novel-setup(宏观)、novel-review(审查)、novel-style-extract(风格提取)配套使用。
5