在进行 Mutation Testing 时,我们经常会遇到一些“幸存”的 Mutant,它们虽然没有被现有的测试用例杀死,但实际上违反了代码的类型约束,例如返回了错误的类型。这些 Mutant 会干扰我们对代码质量的判断,甚至误导我们编写不必要的测试用例。Roave Infection Static Analysis Plugin 通过集成静态分析工具,可以有效识别并排除这类 Mutant,从而提升 Mutation Testing 的准确性和效率。 composer在线学习地址:学习地址 Mutation Testing 是一种通过修改代码并运行测试用例来评估测试集有效性的方法。它通过引入各种小的代码变更(Mutant),然后运行测试用例,如果测试用例能够检测到这些变更,则认为 Mutant 被“杀死”。然而,在 php 这样的动态类型语言中,即使 Mutant 没有被测试用例杀死,也可能违反了代码的类型约束,例如返回了错误的类型。
roave infection static analysis plugin 的作用就是在 mutation testing 的过程中,利用静态分析工具(目前主要支持 psalm)来检查生成的 mutant 是否符合类型约束。如果 mutant 违反了类型约束,则会被标记为“杀死”,从而避免了我们编写不必要的测试用例。
如何使用 Roave Infection Static Analysis Plugin
-
安装
使用 Composer 安装 Roave Infection Static Analysis Plugin:
composer require --dev roave/infection-static-analysis-plugin
-
运行
立即学习“PHP免费学习笔记(深入)”;
使用 vendor/bin/roave-infection-static-analysis-plugin 命令来运行 Mutation Testing,而不是直接运行 vendor/bin/infection。
vendor/bin/roave-infection-static-analysis-plugin
-
配置 Psalm
通过 –psalm-config 参数指定 Psalm 的配置文件:
vendor/bin/roave-infection-static-analysis-plugin --psalm-config config/psalm.xml
优势
- 提高 Mutation Score:通过排除违反类型约束的 Mutant,可以更准确地评估测试集的有效性,从而提高 Mutation Score。
- 减少不必要的测试用例:避免了为违反类型约束的 Mutant 编写测试用例,节省了开发时间和成本。
- 更早发现类型错误:在 Mutation Testing 过程中,可以更早地发现代码中的类型错误。
实际应用效果
假设我们有以下代码:
/** * @param Array<int, string> $values * @return list<string> */ function makeAList(array $values): array { return array_values($values); }
如果 Mutation Testing 生成了以下 Mutant:
function makeAList(array $values): array { - return array_values($values); + return $values; }
这个 Mutant 虽然能通过一些简单的测试用例,但实际上违反了类型约束,因为 $values 是 array
总结
Roave Infection Static Analysis Plugin 是一个强大的工具,它可以帮助我们提高 Mutation Testing 的质量,减少不必要的测试用例,并更早地发现代码中的类型错误。虽然目前还存在一些稳定性问题,但随着 Infection 本身对插件支持的完善,相信它会变得更加易用和可靠。如果你正在使用 Mutation Testing,不妨尝试一下 Roave Infection Static Analysis Plugin,相信它会给你带来意想不到的收获。