用途:执行变异测试以评估测试套件的有效性。工具会系统性地向代码引入细小改动(变异体),并检查现有测试能否检出;变异体被杀表示测试捕获了改动,存活则表示测试存在缺口。
前提条件:已安装变异测试框架(Stryker、mutmut、PITest 或 go-mutesting);现有测试套件全部通过;源码包含可被变异的分支、算术或返回值逻辑;具备足够的 CI 资源(每个变异体都会跑一遍测试,CPU 开销大);具备指定目标文件与测试命令的配置文件。
主要步骤:先确认测试套件 100% 通过,否则变异测试无意义;配置工具(Stryker 用 stryker.config.mjs,mutmut 用 setup.cfg 或 pyproject.toml 的 [mutmut] 段,PITest 加 Maven/Gradle 插件);选择业务逻辑文件,排除生成代码、第三方包装和测试工具,先小范围验证;运行命令如 npx stryker run、mutmut run、mvn pitest:mutationCoverage;分析报告中的 killed(已杀死)、survived(存活)、timed out(超时,通常可接受)、no coverage(未被测试覆盖)四类结果;对存活变异体补充针对性测试,或判定为等价变异并标记忽略;可设置变异分数阈值(建议 80% 杀死率)作为 CI 质量门禁。
示例:Stryker 配置可指定 mutate 模式、testRunner、reporters、thresholds、concurrency、timeoutMS。Python 可用 mutmut run --paths-to-mutate=src/ --tests-dir=tests/、mutmut results、mutmut show 42 查看存活变异体。发现存活的条件边界变异后,可补充边界测试来杀死它。
限制与排错:运行可能耗时数小时,可缩小范围、用 --incremental、--concurrency 并行;若全部存活,说明断言太弱,应改用具体值断言;等价变异会误报,需标记忽略;内存不足时降低并发;Stryker 报 initial test run failed 说明基线测试未通过,需先修好测试。