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包:
所需jar包

官网提供了一个ant的demo,但是我们也可以拿它来演示command line的使用
demo的下载链接 ant-example

创建一个目录,例如mylib,把所需的jar包拷贝进来,其中hamcrest和junit可以从demo的lib得到,三个pitest-*.jar是从各个子项目中得到的。

然后便可使用command line对项目进行变异测试。

这里给出一个shell模版

-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,有空来填坑。

Mark,有空来填坑。

Defects4J中使用PITest

以defects4j1.0的lang-1-f为例,在pom.xml中添加配置
pom.xml配置
第二个plugin中的targetClasses和targetTests指定了需要变异的类与需要执行的测试用例。

在命令行输入:

mvn test-compile org.pitest:pitest-maven:mutationCoverage

在target/目录下会生成pit-reprots文件夹,打开index.html页面,既可以看到生成页面

点击NumberUtils.java就可以看到这个类的详细变异与执行情况。
浅绿色代表覆盖但无变异体,深绿色代表生成变异体并全部杀死,红色代表此处有存活变异体。

关于生成的的变异体:

使用到的变异算子

执行的测试用例

使用Maven插件的PIT示例( ) 生成报告: mvn clean verify org.pitest:pitest-maven:mutationCoverage 幻灯片: : 升级到ASM 5.0.2 修复#114-设置-parameters标志时无法为Java 8运行 #99在Maven插件中支持AdditionalClasspathElements属性(感谢artspb) #98请勿使用资源更改Java 7尝试(感谢@artspb) #109扩展删除条件变量(感谢@vrthra) 移至Github 升级ASM以支持Java 8字节码(感谢“ iirekm”) 对JUnit类别的部分支持(感谢“ chrisr”) 新的删除增量变量器(感谢Rahul Gopinath) 较小的日志记录改进(感谢Kyle Rogers又名Stephan Penndorf) 修复#92-损坏的Maven 对于性能测试,能够改变一些参数以确定被测试系统的行为是至关重要的。 对于pitest,一些最重要的参数是代码库大小、测试覆盖率和变异数。 要获得稳定且可自定义的源集,可以使用 LargeClassGenerator 类。 其用法如下: -c N : Number of classes to generate -m N : Number of methods to generate per class -p VAL : Package name -r VAL : Root folder -s : Run in simulated mode, i.e. do not actu 变异测试是一种比代码覆盖率(即测试覆盖率)更有意义的指标。 它显示了如果在相应的被测单元中发生,则现有的单元测试是否会真正捕获到错误。 该文件夹包含一个Maven和一个的Gradle示例。 有关如何在管道中将Pitest用作代码的示例,请参见。 JavaScript 该文件夹包含一个的示例。 此文件夹包含一个示例 此文件夹包含示例 Swift 此文件夹包含的示例 PIT 是代表最高水平的变异测试系统,为 Java 和 JVM 提供 gold standard 测试覆盖。快速!可扩展性好!并且与测试和构建工具进行了集成。Github、Google小组 变异测试是什么? 代码种自动生成错误(变异),然后运行测试。如果测试失败了,那么变异被杀死,如果测试通过,变异幸存。测试用例的质量可以通过变异被杀死的百分比数量进行衡量。 换句话说,PIT 在程序代码的自动修改版本上运行单元测试。当程序代码被更改后,就会产生不同的结果,并导致先前的单元测试失败。如果单元测试没有失败,则测 变异测试工具Pitestmaven配置) No mutations found 错误提示: 看一下pom.xml文件的插件这里的包名com.xxx.mypitest有没有写错 成功使用变异测试工具Pitest pytest到目前为止还没有翻译的比较好全面的使用文档,很多英文不太好的小伙伴,在学习时看英文文档还是很吃力。本来去年就计划写pytest详细的使用文档的,由于时间关系一直搁置,直到今天才开始写。本文是第一篇,主要介绍pytest的入门使用,后续会分篇针对pytest中的各个功能出详细的使用教程。 一、准备:环境安装 pytest 是 python 中的第三方库,使用之前需要先安装,在命令行中运行以下安装命令 : 什么是变异测试变异测试,英文Mutation Testing,是使用变异器 (切换数学运算符,更改返回类型,删除调用等)将代码修改为不同的变异(基于变异器创建新代码),并检查单元测试是否失败。好的单元测试应该使所有突变都失败(杀死)。 所以,变异测试的有效性可以衡量杀死了多少个突变。 变异测试是覆盖率的一个很好的补充。相比覆盖率,它能够使单元测试更加健壮。 执行变异测试 在执行变异测试前需要先执行单元测试,不然变异测试有可能找不到单元测试类。 找到对应模块下的pitest插件: 如果是要执行指 变异测试是一种技术,它可以发现测试未涵盖代码的哪些部分。 它类似于代码覆盖范围 ,但变异测试不限于在测试期间执行给定行的事实。 这个想法是修改生产代码(引入突变),这应该改变其行为(产生不同的结果)并导致单元测试失败。 缺少故障可能表明给定零件没有被测试充分覆盖。 突变检测的想法是很老 ,但它是相当不受欢迎。 尽管我在测试方面有相当的经验,但我最近发现它是在审查有关测试的新书的beta版中发... 首先配置好maven环境 这里面有一些坑,可以看我的另一篇博客,踩过的坑希望大家不要在踩了。 https://blog.csdn.net/ibo123/article/details/108034402 无法加载主类的问题在于你的maven环境没有进行全局配置,请务必配置好全局maven。要不然IDEA会自动加载默认的maven。 1 构建一个简单的maven项目 file -> project ->