PITest使用教程
PITest是变异测试研究中经常使用到的变异工具,在字节码级别对程序进行变异(作为对比,Major是对源文件进行变异)
PITest官网与仓库
PITest官网
PITest Github
PITest支持多种使用方式,官网给了使用相关的文档(吐槽写得并不新手友好
- command line
- ant
- maven
下面介绍各种使用PITest的方式。
Command Line
首先在PITest Github下载PITest源码,可以在PIT Tag选择对应PITest的版本。
在项目根目录输入:
mvn install
运行:
即可在各子项目的/target目录下的到command line所需的jar包:
官网提供了一个ant的demo,但是我们也可以拿它来演示command line的使用
demo的下载链接 ant-example
创建一个目录,例如mylib,把所需的jar包拷贝进来,其中hamcrest和junit可以从demo的lib得到,三个pitest-*.jar是从各个子项目中得到的。
然后便可使用command line对项目进行变异测试。
这里给出一个shell模版
java -cp # 1.PIT的jar包 XXX/pitest-X.jar: XXX/pitest-command-line-X.jar: XXX/pitest-entry-X.jar: # 2.Juint的jar包 XXX/junit-X.jar: XXX/hamcrest-core-X.jar: # 3.编译项目后的classes文件目录 XXX/target/classes: XXX/target/test-classes \ org.pitest.mutationtest.commandline.MutationCoverageReport \ # 生成报告 --reportDir XXX/mutationReports \ # 要变异的类,多个类可以通过 XXX.A, XXX.B的形式枚举 --targetClasses com.pit.* \ # 要执行的测试类,多个类可以通过 XXX.A, XXX.B的形式枚举 --targetTests com.pit.* \ # 源代码存放的目录 --sourceDirs XXX/src \ # 使用的变异算子, 如果想使用部分的话,也可以用, 隔开 # 详见 http://pitest.org/quickstart/mutators/ --mutators ALL --verbose true
执行结果
执行后在reprot目录下打开index.html即可查看变异详情
一个常见的报错
XXX/build.xml:14: java.lang.UnsupportedClassVersionError: org/pitest/ant/PitestTask: Unsupported major.minor version 52.0
原因是PITest版本与本地的jdk版本不一致。PITest版本过低的时候应选择jdk7,PITest版本较高的时候应选择jdk8。
Maven
Mark,有空来填坑。
Ant
Mark,有空来填坑。
Defects4J中使用PITest
以defects4j1.0的lang-1-f为例,在pom.xml中添加配置
第二个plugin中的targetClasses和targetTests指定了需要变异的类与需要执行的测试用例。
在命令行输入:
mvn test-compile org.pitest:pitest-maven:mutationCoverage
在target/目录下会生成pit-reprots文件夹,打开index.html页面,既可以看到生成页面
点击NumberUtils.java就可以看到这个类的详细变异与执行情况。
浅绿色代表覆盖但无变异体,深绿色代表生成变异体并全部杀死,红色代表此处有存活变异体。
关于生成的的变异体:
使用到的变异算子
执行的测试用例