使用 Pitest 进行变异测试

使用 Pitest 进行变异测试

变异测试 (Mutation Testing)

变异测试是软件测试方法中的一个重要测试方法。变异测试旨在找出有效的测试用例。简单来说,就是对代码做一些简单的修改(变异),然后用同样的测试用例进行输入,看输出是否会发生改变。如果输出发生变化,即该变异 (mutation) 被 kill 掉,该 test case 就是有效的 test case;若所有测试用例扔进去跑一遍,该 mutation 还没有被 kill 掉,则说明这时候 test case 的有效覆盖还不够完善。

变异分为 strong mutation 和 weak mutation。具体详细定义和二者之间的好处见该 pdf 的 16-19。

变异测试的主要流程:

后面的那个自动化测试的步骤,就可以由 pitest 来完成。

具体的变异手段有以下:

具体每一个啥意思,也很容易明白,看一眼例子就行了。见 pdf 第 22-32 页。

Pitest 的使用

然后就可以开始进行变异测试了。Pitest 是一个基于 Junit4 的工具包。

在基于 maven 的使用 pitest 的方式下,首先在 pom.xml 中添加如下字段:

1
2
3
4
5
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>LATEST</version>
</plugin>

在写好待测试类和基于 Junit4 的测试用例后,就可以通过指令mvn org.pitest:pitest-maven:mutationCoverage,就会生成对应测试报告,里面提供的信息包括了它自动做了哪些变异以及测试用例的覆盖情况,会给出一个打分。

进行的 mutation 具体操作详情和 mutation 是否被 kill 掉的情况,从而可以判断出 test case 的覆盖情况。

它默认的会测试你整个工程代码。当然你也可以在配置文件中指定想要测试的类和测试用例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>LATEST</version>
<configuration>
<targetClasses>
<param>com.your.package.root.want.to.mutate*</param>
</targetClasses>
<targetTests>
<param>com.your.package.root*</param>
</targetTests>
</configuration>
</plugin>

这些都只是简单的初步使用,具体更多的配置可见 官方文档