关于 generate-tests
generate-tests 是分析目标代码并生成单元测试的技能,重点覆盖 Java 项目。它要求先检查依赖和已有测试、梳理代码分支,再编译并运行生成的测试。
主要功能
- 01读取项目规则与源码依赖
- 02检查已有测试及项目惯例
- 03规划覆盖代码分支的用例
- 04为不同 Java 代码类型生成测试
- 05编译并执行生成的测试
适用场景
- 01为 Java 类或方法补充测试
- 02扩展现有测试类
- 03依据项目构建结果验证生成的测试
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mavka-ai/ unit-tests-skills --skill generate-tests安装后在 Claude Code 中输入/generate-tests确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
rules/tests/general/cleanly-create-test-data.mdcode-context-analysis.mdexisting-test-awareness.mdgeneral-principles.mdkeep-cause-effect-clear.mdkeep-tests-focused.mdnaming-conventions.mdno-logic-in-tests.mdprefer-public-apis.mdtechnology-stack-detection.mdtest-behaviors-not-methods.mdtest-case-generation-strategy.mdverify-relevant-arguments-only.mdwhat-makes-good-test.mdrules/tests/java/unit/argument-matching.mdcontroller-test-rules.mddomain-service-rules.mdjava-test-template.mdjson-serialization.mdlogging-rules.mdrules/tests/post-generation/compilation-verification.mdtest-execution-verification.md详细介绍
生成测试技能
你将分析代码,并为指定目标生成高质量的单元测试。
测试目标: $ARGUMENTS
质量标准
- 生成测试用例前,请花时间彻底分析代码。
- 质量比速度更重要——仔细阅读所有相关源文件和规则。
- 请勿跳过以下工作流中的任何步骤。每个步骤都有其理由。
- 请勿在测试数据上走捷径——请阅读实际的类,以使用正确的构造函数和字段。
说明
步骤 1:阅读规则并分析上下文
- 根据代码类型,从
./rules/tests/中阅读相关规则(参见下方的规则参考) - 阅读目标源文件/类/方法
- 阅读依赖项:根据目标中的导入,阅读 DTO、实体、枚举、自定义异常和目标引用的其他类型(按
code-context-analysis规则的要求) - 检查现有测试:在测试目录中搜索
{ClassName}Test或{ClassName}Tests(按existing-test-awareness规则的要求)- 如果找到,请完整阅读——在其中补充缺少的测试,而不是新建文件
- 如果未找到,请查看 2-3 个相邻的测试类,了解项目约定
步骤 2:确定测试用例列表
如果该目标已有测试用例列表——无论用户还是 Agent 是否调用了 generate-test-cases,该列表就是计划。请据此生成测试。不要从头重新分析目标;如果你阅读代码后的理解与列表不符,请说明新增或删除了哪些用例以及原因,以便清楚地看到计划的变更。
如果没有此类列表,请在编写任何测试代码前,在此处生成一份:
- 分析所有代码分支,包括:
- 成功路径
- 错误/异常路径
- 验证逻辑
- 目标调用的私有/受保护方法
- 安全注解(如有)
- 严格遵循包含/排除规则
- 按以下格式输出列表
无论哪种情况,都请直接继续步骤 3。输出此列表是为了让用户之后能够核对计划与生成的测试;整个运行过程将从头到尾自动执行。
测试用例输出格式
## Test Cases for {ClassName}.{methodName}
### 1. {testMethodName}
- **Given:** {preconditions/input state}
- **When:** {action being tested}
- **Then:** {expected outcome}
- **Code branch:** {which code path this covers}
### 2. {testMethodName}
...
命名约定
测试方法名称格式:{testedMethod}_{givenState}_{expectedOutcome}
示例:
calculateTotal_validProducts_returnsSumcalculateTotal_emptyList_throwsIllegalArgumentExceptiongetUser_unauthorized_returns401
步骤 3:生成测试代码
- 确定代码类型并应用相应规则:
- Controller → 应用
controller-test-rules.md(使用@WebMvcTest、MockMvc 模式) - 服务/领域逻辑 → 应用
domain-service-rules.md(使用@ExtendWith(MockitoExtension.class)、Mockito 模式) - Repository/消息传递/其他类型 → 将
domain-service-rules.md用作基础规则;告知用户目前尚无特定于该类型的规则 - 所有 Java 代码 → 无论代码类型为何,始终应用
java-test-template.md、argument-matching.md、json-serialization.md
- Controller → 应用
- 如果在步骤 1 中找到现有测试类,请向其中添加新的测试方法(不要创建重复文件)
- 按照所有规则和步骤 2 中的测试用例生成测试
- 使用 Write 工具创建或更新测试文件
步骤 4:验证编译和执行
- 运行编译并修复所有问题(最多尝试 5 次——参见
compilation-verification.md) - 运行生成的测试类,验证所有测试均通过(参见
test-execution-verification.md) - 修改测试以修复任何失败的测试——保持生产代码不变
- 如果测试经过 3 次尝试仍无法修复,请保留该测试,并使用
@Disabled标记,注明原因并报告(参见test-execution-verification.md)
故障排除
找不到目标文件
如果指定的目标不存在,请告知用户你搜索的准确路径,并请求澄清。
不支持的语言
如果目标代码使用的语言没有专门规则(非 Java),则仅应用通用规则,并告知用户可能需要手动检查语言特定的约定。
编译持续失败
如果尝试 5 次后编译仍然失败:
- 停止并向用户展示剩余错误
- 建议可能的原因(缺少依赖项、版本不兼容)
- 请用户先解决构建问题,再继续
测试因生产代码行为而失败
如果测试因生产代码的行为与预期不同而失败:
- 不要修改生产代码
- 修改测试,使其符合实际行为
- 如果该行为似乎是个 bug,请添加注释:
// NOTE: current behavior may be a bug — {description}
示例
User says: "/generate-tests src/main/java/com/example/service/OrderService.java"
Step 1: Agent reads rules, reads OrderService.java, reads OrderRequest.java,
Order.java, OrderRepository.java (dependencies), checks for
existing OrderServiceTest.java
Step 2: Agent outputs 7 test cases covering:
- createOrder success path
- createOrder with invalid request (validation)
- processPayment success
- processPayment failure
- calculateTotal with products
- calculateTotal with empty list
- cancelOrder for non-existent order
Step 3: Agent generates OrderServiceTest.java with @ExtendWith(MockitoExtension.class),
mocked repository and payment service, 7 test methods.
Step 4: Agent runs `mvn test -Dtest=OrderServiceTest -q`, all tests pass.
Result: Complete test file delivered with 7 passing tests.
规则参考
重要:必须阅读并应用 ./rules/tests/ 目录中的所有相关规则。
维护说明:
./rules/tests/general/中的通用规则与generate-test-cases技能共享(该技能在rules/general/中有副本)。更新规则时,请确保两个位置保持同步。
通用规则(始终应用)
general/test-case-generation-strategy.md- 包含/排除标准general/naming-conventions.md- 测试命名格式general/general-principles.md- 核心测试原则(Given-When-Then、实际值/预期值)general/technology-stack-detection.md- 检测语言和框架general/what-makes-good-test.md- 清晰性、完整性、简洁性、稳健性general/cleanly-create-test-data.md- 使用辅助工具和构建器创建测试数据general/keep-cause-effect-clear.md- 效果应紧接原因出现general/no-logic-in-tests.md- KISS > DRY,避免在断言中编写逻辑general/keep-tests-focused.md- 每个测试只覆盖一种场景general/test-behaviors-not-methods.md- 针对不同的行为编写独立测试general/verify-relevant-arguments-only.md- 仅验证相关的模拟参数general/prefer-public-apis.md- 测试公开 API,而非私有方法general/existing-test-awareness.md- 检查现有测试,并遵循项目约定general/code-context-analysis.md- 编写测试前先阅读依赖项
Java 单元测试
java/unit/java-test-template.md- 基本模板、禁止使用的注解java/unit/json-serialization.md- 使用显式 JSON 字面量java/unit/argument-matching.md- 使用 ArgumentCaptor,而非 any()java/unit/logging-rules.md- 使用 OutputCaptureExtension 捕获日志java/unit/domain-service-rules.md- 服务的 Mockito 模式java/unit/controller-test-rules.md- 控制器的 @WebMvcTest 和 MockMvc 模式
生成后
post-generation/compilation-verification.md- 验证编译post-generation/test-execution-verification.md- 验证测试通过
评论
支持 Markdown