Pitest 变异测试工具【1】

PIT 是目前最高水平的变异测试系统 GithubGoogle小组

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 插件,配置使用更方便。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值