用途:在 Ruby 项目中运行 mutation testing(变异测试),借助 mutant 找出未被测试杀死的存活变异(alive mutation),并通过补测试或简化代码将其消除,逐步达到 100% 变异覆盖率。
主要能力:运行 mutant 并支持用 subject 表达式限定范围;识别输出中的 evil: 行,定位对象名、文件路径与行号,并阅读其后的 diff(- 为原始代码,+ 为变异代码);对每个存活变异给出明确动作:新增测试或简化代码;支持维护忽略列表与遗留项目的基线处理。
使用方式:运行 bundle exec mutant run --fail-fast,已知对象时可写 bundle exec mutant run --fail-fast 'Entities::CreateService#call'。命令成功即覆盖率 100%;失败则从输出中找到 evil: 行并阅读 diff。随后阅读源文件与对应 spec,判断变异代码对所有合法输入是否可接受,选择补测试或直接采用更受限的写法。修改后用 bundle exec rspec 确保整体测试通过,再重跑 mutant 直到 100%。同一提交不要同时改代码与测试;两者都需修改时先提交测试,再单独提交代码简化。
判断原则:测试缺失常见于布尔/标志只测了一个取值、集合只有一个元素、测试数据中两个对象返回值相同、带默认参数的方法总被显式传参等情况。当变异代码对所有合法输入都正确时,采用变异所建议的简化(体现最小权限原则),但需先确认该表达式已有测试覆盖,避免仅改语法让变异消失。等价变异不等于不可杀死:若变异形式使用了更受限的原语,应将其应用到源码。只有当既无法补测试又无法应用该变异时,才视为不可杀死,需加入 config/mutant.yml 忽略列表并附行内注释说明原因,不要为此提交代码或测试改动;忽略项必须都有注释。遗留项目首次接入时,可先运行一次 mutant 收集所有存活对象,写入忽略列表作为基线,再逐个移除并修复。
限制:技能面向 Ruby 与 mutant 生态,依赖 RSpec;需要提供存活变异输出或限定对象;未提供安装方式、平台支持、收费与价格等信息。