mcpField
C
codeprobe-testing

codeprobe-testing

github.com/machineroom-dev其他5110 次安装6 天前更新
代码仓库

关于 codeprobe-testing

用于审查测试质量与覆盖情况的代码审计技能,面向需要评估项目测试的开发者。它检查覆盖缺失、测试设计问题、Mock 滥用和脆弱的测试数据。

主要功能

  1. 01发现缺失测试与覆盖空白
  2. 02检查断言和测试结构
  3. 03检测 Mock 滥用
  4. 04标记脆弱的测试数据与依赖

适用场景

  1. 01发布前审查测试
  2. 02查找未覆盖的错误与授权路径
  3. 03减少脆弱或耦合实现的测试

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/machineroom-dev/codeprobe --skill codeprobe-testing

安装后在 Claude Code 中输入/codeprobe-testing确认已加载。

详细介绍

独立模式

如果直接调用(而非通过编排器调用),必须先执行以下操作:

  1. 阅读 ../codeprobe/shared-preamble.md(相对于此 SKILL.md 的位置解析路径,即同级的 codeprobe 技能目录,而不是用户的项目),了解输出约定、执行模式和限制。
  2. 根据项目的技术栈,从 ../codeprobe/references/(以相同方式解析路径)加载适用的参考文件。
  3. 除非用户另有指定,否则默认使用 full 模式。

测试质量与覆盖率审计器

领域范围

此子技能会检测以下六类测试质量和覆盖率问题:

  1. 缺少测试 — 公共方法没有对应的测试,关键业务逻辑未经测试。
  2. 测试异味 — 测试没有断言、测试实现细节或测试脆弱。
  3. 测试结构 — 缺少 Arrange-Act-Assert 分离、命名不佳、一次测试过多内容。
  4. 滥用 Mock — 对被测系统使用 Mock、Mock 返回 Mock、过度使用 Mock。
  5. 覆盖率缺口 — 错误路径、授权逻辑或边界情况没有测试。
  6. 测试数据 — 硬编码 ID、脆弱的测试夹具、依赖环境的测试。

不会标记的内容

  • 琐碎的 getter/setter 或纯 DTO 缺少测试 — 这些只会增加测试开销,却无法带来有意义的覆盖率。
  • 框架生成的测试存根,即使内容为空,但显然是脚手架生成的(例如,Laravel 的 ExampleTest.php、Create React App 的 App.test.js)——这些是起点,不是被弃用的测试。
  • 有意不遵循单元测试惯例的集成/E2E 测试套件 — 不同测试级别有不同的设计限制。
  • 测试执行速度 — 此子技能评估测试设计质量,而非运行时性能。
  • vendor/、node_modules/ 或其他依赖目录中的测试。

检测说明

严重级别上限

此子技能中的任何发现都不得被归类为严重级别。 缺少测试,即使涉及关键业务逻辑,也属于可维护性和风险问题(Major),而非已确认的生产缺陷。此子技能可分配的最高严重级别为 Major。严格遵循每个检测表中的严重级别列,不得上调。

缺少测试
ID 前缀检测内容检测方法严重级别
TEST公共方法没有对应的测试扫描源代码目录中的公共类方法。逐一检查是否存在对应的测试文件/方法。使用测试文件命名惯例:test_、_test.、.test.、Test[A-Z]、spec_、_spec.、.spec.(与 file_stats.py 模式匹配)。Major
TEST关键业务逻辑未经测试找出处理支付、身份验证、授权、订单处理或数据变更的类/方法。检查这些类/方法是否有专门的测试覆盖。Major
TEST未处理边界情况如果某个方法有测试,请检查测试是否涵盖:null/空输入、边界值(0、-1、最大值)、错误情况和正常路径。仅有正常路径测试时应标记。Minor
测试异味
ID 前缀检测内容检测方法严重程度
TEST没有断言的测试在测试方法中搜索断言调用(assert、expect、should、verify)。标记那些执行了代码却从未断言结果的测试方法——它们只验证“没有抛出异常”。重大
TEST测试实现细节的测试模拟所有依赖,且只验证调用顺序或次数而非结果的测试。内部实现改变但行为不变时会失败的测试。检查过多的 ->expects()->method()->with() 链,或未检查返回值就使用 toHaveBeenCalledWith 的情况。次要
TEST与外部状态耦合的脆弱测试依赖测试中未设置的数据库状态、文件系统路径、网络调用或未模拟的系统时间的测试。检查测试中的原始 SQL、file_exists() 检查,以及未模拟的 HTTP 调用。次要
TEST依赖执行顺序的测试单独运行时通过、一起运行时失败(或反之)的测试。检查测试方法之间共享的可变状态:在测试中修改的类级属性、未清理的数据库记录。重大
测试结构
ID 前缀检测内容检测方法严重程度
TEST缺少准备-执行-断言(Arrange-Act-Assert)分离设置、执行和断言交错进行,而非清晰分隔的测试方法。一个测试中包含多个执行与断言周期。次要
TEST测试名称未描述测试场景测试方法命名为 test1、testFunction、it_works,或使用未描述输入条件和预期结果的通用名称。良好示例:test_empty_cart_returns_zero_total。不佳示例:testCalculate。次要
TEST单个测试检验过多内容对无关结果进行 5 次或更多断言,或按顺序测试多个场景的测试方法。应拆分为目标明确的测试。次要
滥用模拟对象
ID 前缀检测内容检测方法严重程度
TEST模拟被测系统测试创建了被测类的模拟对象或部分模拟对象。这种测试测的是模拟对象,而非实际代码。检查 $this->createPartialMock(ClassName::class),或 jest.spyOn(sut, 'method')(其中 sut 是被测类)。重大
TEST模拟对象返回其他模拟对象将模拟对象配置为返回其他模拟对象,形成深层模拟链。$mock->method('getUser')->willReturn($userMock),其中 $userMock->method('getProfile')->willReturn($profileMock)。重大
TEST过度模拟导致测试无论如何都会通过所有依赖都被模拟,且模拟对象返回的值恰好符合代码预期,使测试变成同义反复。若更改实现逻辑,测试仍会通过,因为结果由模拟对象决定。次要
覆盖缺口
ID 前缀检测内容检测方法严重程度
TEST未测试错误或异常路径含有 try/catch 块或错误处理的方法,其测试只覆盖成功路径。没有测试触发 catch 或错误分支。次要
TEST未测试授权逻辑权限检查、策略方法、门定义、中间件授权等控制访问但没有专门测试的代码。重大
TEST未测试边界情况处理数组或集合的函数没有空输入测试。数值函数没有零、负数或边界值测试。字符串函数没有空字符串、Unicode 或超长输入测试。次要
测试数据
ID 前缀检测内容检测方式严重程度
TEST可能发生冲突的硬编码 ID使用硬编码数字 ID($userId = 42、id: 1)而非工厂生成值的测试。这些 ID 会在并行测试运行或与种子数据冲突时造成问题。轻微
TEST脆弱的工厂/测试夹具设置测试中包含复杂的内联数据设置,并在多个测试中重复,而未使用工厂/测试夹具/构建器。轻微
TEST依赖特定数据库状态的测试测试假定数据库中存在某些记录,却未在测试设置中创建这些记录。此类测试依赖数据填充器或先前的测试执行。轻微

ID 前缀和修复提示词示例

所有发现项均使用 TEST- 前缀,并按顺序编号:TEST-001、TEST-002 等。

修复提示词示例
  • “为 OrderService@calculateTotal 编写测试,覆盖:购物车为空(预期为 0)、单件商品、多件商品以及带折扣的商品。使用 OrderFactory 创建测试数据。将测试放在 tests/Unit/Services/OrderServiceTest.php 中。”
  • “tests/Feature/AuthTest.php:25 中的测试 test_user_can_login 没有断言——它只调用了登录端点。添加 assertStatus(200)、assertAuthenticated() 和 assertJsonStructure(['token']) 断言。”
  • “在 tests/Unit/PaymentServiceTest.php:40 中,模拟链的模拟层级过深。创建一个实现网关接口的具体 FakePaymentGateway,使其返回可预测的响应,而不是使用嵌套的模拟返回值。”
  • “将 tests/Feature/OrderTest.php:15 中硬编码的用户 ID 42 替换为 User::factory()->create()->id,以避免并行测试运行时发生测试冲突。”

评论

支持 Markdown