PIT 是目前最高水平的变异测试系统 Github、Google小组
1. 变异测试是什么?
代码中自动生成错误(变异),然后运行测试。如果测试失败了,那么变异被杀死;如果测试通过,变异幸存。测试用例的质量可以通过变异被杀死的百分比数量进行衡量。
换句话说,PIT 在程序代码的自动修改版本上运行单元测试。当程序代码被更改后,就会产生不同的结果,并导致先前的单元测试失败。如果单元测试没有失败,则测试套件可能存在问题。
支持 Maven、命令行、Ant 和 Gradle。
2. 命令行
# 来源:http://pitest.org/quickstart/commandline/
java -cp <your classpath including pit jar and dependencies> \
org.pitest.mutationtest.commandline.MutationCoverageReport \
--reportDir <outputdir> \
--targetClasses com.your.package.tobemutated* \
--targetTests com.your.package.*
--sourceDirs <pathtosource>
# 示例1
java -cp <your classpath> \
org.pitest.mutationtest.commandline.MutationCoverageReport \
--reportDir c:\\mutationReports \
--targetClasses example.foo.* \
--sourceDirs c:\\myProject\\src \
--targetTests example.foo*
--threads 2
--excludedMethods hashCode,equals
# 示例2
java -cp <your classpath> \
org.pitest.mutationtest.commandline.MutationCoverageReport \
--reportDir c:\\mutationReports \
--targetClasses example.foo.Specfic, example.foo.Other \
--targetTests example.ReflectionSuite
--sourceDirs c:\\myProject\\src \
java 示例代码可参考 Mkyong.com
执行命令行:(verbose 是开启详细日志,更多内容见 链接)
java
-cp # 1.PIT
/home/ubuntu/lib/pitest-1.6.6.jar:
/home/ubuntu/lib/pitest-command-line-1.6.6.jar:
/home/ubuntu/lib/pitest-entry-1.6.6.jar:
# 2.Juint
/home/ubuntu/lib/junit-4.12.jar:
/home/ubuntu/lib/hamcrest-core-1.3.jar:
# 3.Project classes
/home/ubuntu/PITexample/target/classes:
/home/ubuntu/PITexample/target/test-classes \
org.pitest.mutationtest.commandline.MutationCoverageReport \
--reportDir /home/ubuntu/PITexample/mutationReports \
--targetClasses com.pit.* \
--targetTests com.pit.* \
--sourceDirs /home/ubuntu/PITexample/src/main/java \
--verbose true
最终生成的报告包含如下信息:
- 包中的 java 文件的数量和名称,行覆盖率和变异覆盖率
- java 文件代码产生的变异体(是否被杀死)、使用的变异算子和执行的测试用例(包括执行时间)
3. Maven
B站参考视频:av626459960
在 pom.xml 文件的 build/plugins 中加入
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>LATEST</version>
</plugin>
pitest 默认变异所有代码,使用 targetClasses 和 targetTests 来指定变异的部分和要运行的测试。
<plugin>
...
<configuration>
<targetClasses>
<param>com.your.package.root.want.to.mutate*</param>
</targetClasses>
<targetTests>
<param>com.your.package.root*</param>
</targetTests>
</configuration>
</plugin>
我的 pom.xml 文件
<build>
<plugins>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.6.6</version>
<executions>
<!-- 将goal绑定到test阶段,执行mutationCoverage -->
<execution>
<id>pit-report</id>
<phase>test</phase>
<goals>
<goal>mutationCoverage</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 待变异类 -->
<targetClasses>
<param>com.pit.*</param>
</targetClasses>
<!-- 所需测试 -->
<targetTests>
<param>com.pit.*</param>
</targetTests>
</configuration>
</plugin>
</plugins>
</build>
终端执行 mvn clean test
对于 JUnit 5 项目,需要补充
<build>
<plugins>
<plugin>
...
<dependencies>
<dependency>
<groupId>org.pitest</groupId>
<artifactId>pitest-junit5-plugin</artifactId>
<version>0.14</version>
</dependency>
</dependencies>
...
</plugin>
</plugins>
</build>
如果不想绑定到 test 阶段,需要先mvn install
,然后执行mvn org.pitest:pitest-maven:mutationCoverage
IntelliJ IDEA 在 Settings - Plugins 搜索 PIT mutation 插件,配置使用更方便。