test-generator · diff
git:20260418.e63f046 to git:20260715.81812dc
65 added, 87 removed. Audit A to A.
---
name: test-generator
- description: 自动生成单元测试:识别函数逻辑、覆盖边界条件、生成可运行测试代码
+ description: 依据真实代码契约生成并验证单元测试或集成测试。用于用户要求为函数、类、接口或缺陷补测试、提高覆盖率、生成回归用例或完善测试策略时;先读取现有测试与调用方,不猜测空值、异常或超时行为,不自动安装框架或访问生产依赖。
---
# 测试生成器
- ## 触发条件
- 当用户要求"生成测试"、"写单元测试"、"为 XX 函数写测试"、"增加测试覆盖率"时激活此技能。
-
## 工作流程
- ### 1. 分析目标代码
- - 读取目标文件,识别函数/类的输入输出
- - 分析参数类型、返回值、副作用
- - 识别依赖关系(数据库、API、文件系统等)
+ ### 1. 读取真实契约
- ### 2. 确定测试策略
- - **纯函数**:参数化测试,覆盖正常/边界/异常输入
- - **类方法**:测试初始化、正常调用、状态变化
- - **异步函数**:测试成功路径、超时、网络错误
- - **含副作用的函数**:使用 mock/stub 隔离依赖
+ 检查目标代码及其:
- ### 3. 生成测试用例
- 每个函数至少覆盖:
- - ✅ 正常输入(happy path)
- - ⚠️ 边界条件(空值、零值、极大值、空字符串/数组)
- - ❌ 异常输入(类型错误、格式错误)
- - 🔗 依赖失败(网络超时、数据库异常)
+ - 类型定义、公开文档、调用方和错误处理路径。
+ - 现有测试、fixture、测试配置、依赖清单和项目测试命令。
+ - 输入输出、副作用、状态变化、并发语义和系统边界。
+ - 适用的仓库规则、Git 状态及本轮允许修改的范围。
- ### 4. 输出格式
- 根据项目语言和测试框架生成对应代码:
+ 区分“代码当前行为”和“产品期望行为”。两者冲突或契约不明确且会改变断言时,先列出证据与待确认假设;不要用测试固化猜测。
- #### Python (pytest)
- ```python
- import pytest
- from mymodule import my_function
+ ### 2. 选择测试层级
- class TestMyFunction:
- def test_normal_input(self):
- assert my_function("hello") == "HELLO"
-
- def test_empty_string(self):
- assert my_function("") == ""
-
- def test_none_input(self):
- with pytest.raises(TypeError):
- my_function(None)
-
- def test_special_characters(self):
- assert my_function("你好!@#") == "你好!@#"
- ```
+ - 纯逻辑优先使用快速、确定的单元测试。
+ - 在系统边界隔离时间、随机数、文件系统、网络或第三方服务,避免 mock 被测模块的内部实现。
+ - 需要验证真实组件协作时使用集成测试,可采用临时目录、测试数据库或受控服务,并确保资源隔离和清理。
+ - 修复缺陷时先写能复现真实问题的最小回归用例,再验证修复。
- #### JavaScript (Jest)
- ```javascript
- const { myFunction } = require('./mymodule');
+ 只覆盖契约或可达路径中真实存在的正常、边界与失败场景。空值、类型错误、超时和数据库异常不是每个函数的固定要求。
- describe('myFunction', () => {
- test('正常输入', () => {
- expect(myFunction('hello')).toBe('HELLO');
- });
-
- test('空字符串', () => {
- expect(myFunction('')).toBe('');
- });
-
- test('null 输入', () => {
- expect(() => myFunction(null)).toThrow(TypeError);
- });
- });
- ```
+ ### 3. 设计用例
- #### Go (testing)
- ```go
- package mypackage
+ 每个用例应说明:
- import "testing"
+ - 对应的契约、缺陷或分支。
+ - 输入与环境安排。
+ - 可观察结果,而非内部实现细节。
+ - 必要的清理和跨用例隔离。
- func TestMyFunction(t *testing.T) {
- tests := []struct {
- name string
- input string
- want string
- }{
- {"正常输入", "hello", "HELLO"},
- {"空字符串", "", ""},
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- if got := MyFunction(tt.input); got != tt.want {
- t.Errorf("MyFunction(%q) = %q, want %q", tt.input, got, tt.want)
- }
- })
- }
- }
- ```
+ 优先参数化重复场景,并沿用仓库现有的测试命名、目录、fixture 和断言风格。不要因项目面向中文用户而强制使用中文函数名。
- ## 测试命名规范
- - 中文项目:`test_函数名_场景描述` 或 `函数名_正常输入/边界条件/异常输入`
- - 英文项目:遵循项目现有命名风格
+ ### 4. 实现最小测试
- ## 最佳实践
- 1. **先读再写**:理解代码逻辑后再生成测试,不要盲目覆盖
- 2. **独立性**:每个测试独立运行,不依赖执行顺序
- 3. **可读性**:测试名即文档,一看就知道测什么
- 4. **适度 mock**:外部依赖必须 mock,内部逻辑尽量不 mock
- 5. **渐进式**:先覆盖核心路径,再补充边界条件
+ - 只修改目标测试文件和确有必要的 fixture。
+ - 不为了让测试通过而随意修改生产代码;若发现产品缺陷,单独报告或按用户要求修复。
+ - 不复制未经核实的示例期望值,也不把实现细节写成永久契约。
+ - Windows 与 Linux 使用路径 API、系统临时目录和显式编码,不硬编码分隔符、`/tmp`、换行、大小写、时区或 locale 行为。
+
+ ### 5. 运行与复验
+
+ 1. 先运行新增或目标测试,确认失败信息与预期一致。
+ 2. 先检查项目脚本是否会下载依赖、访问外部服务或改变共享状态,再按改动风险运行相关测试;必要时运行完整测试、类型检查或覆盖率命令,潜在外部副作用需先获授权。
+ 3. 检查 Git diff,确认没有快照、缓存、覆盖率产物或无关文件。
+ 4. 将基线已有失败与本轮新增失败分开记录。
+
+ 没有实际运行时,只能说明“已生成、未验证”,不能声称测试通过。
+
+ ## 安全与授权边界
+
+ - 未经明确授权,不安装或升级测试框架,不修改 lockfile、全局测试配置、CI 或生产代码。
+ - 未经明确授权,不访问真实网络、生产数据库、云服务或含真实凭据的环境。
+ - 测试数据不得包含真实个人信息、Token、Cookie、密码或客户数据。
+ - 测试必须可重复,不依赖执行顺序,并清理创建的临时资源。
+ - 目标文件已有用户修改时,先检查是否重叠,避免覆盖。
+
+ ## 输出
+
+ ```markdown
+ ## 测试补充结果
+
+ - 目标与契约依据:
+ - 测试层级与框架:
+ - 新增或修改文件:
+
+ ## 用例
+
+ | 场景 | 契约依据 | 预期结果 |
+ |------|----------|----------|
+
+ ## 验证
+
+ - 实际命令与退出状态:
+ - 相关测试 / 完整测试:
+ - 基线已有失败:
+ - 未验证假设与限制:
+ ```