mutant for muJava 变异测试

https://blog.csdn.net/wkw1125/article/details/51967630

这个博客写的太完整了,只需要添加classpath ,注意自己的文件夹地址就行。

补充:

1. .class 文件是eclipse运行编译生成的,一般情况下在对应项目的bin之中(如果没有main函数,可以通过运行junit test生成。

2. 如果需要测试的项目是在package中,那么放入src和class文件夹的,不只是.java或者.class文件,而是包括package文件夹在内的,否则,在运行 generate mutants.cmd 时,会出现fail。

 

【变异测试原理的理解】

https://wenku.baidu.com/view/6c0487684b73f242336c5fbc.html

 

变异测试的原理:是基于缺陷的软件测试技术,软件测试中,测试用例的设计是非常核心的,一般通过控制流或者数据流分析来判断用例是否充分,而变异测试从另一个角度——根据被测程序的特征设计变异算子(mutation operator),然后应用变异算子生成大量变异体mutant (具有变异缺陷),识别出等价变异体,若已有的测试用例不能杀除所有非等价的变异体,则需要额外的测试用例。

 

变异测试的目的——杀除所有的变异体!——完善所有的测试用例!

好的测试用例应该是杀除变异体的越多越好!

好的变异体,应该是被越不容易杀死越好,这样越稀有,可以更好的模拟实际缺陷。

 

Q:

变异算子是什么?——是一种转换规则,一般在符合语法前提的条件下对被测程序作出微小的改动的规则,

如何改变被测程序(生成变异体):执行变异算子即可

 

 

杀除是什么意思?——执行测试用例,检测出了:这是变异体(存在测试用例在变异体和源程序上的执行结果不同),就是可杀除变异体

 

目的:模拟被测软件所有可能的缺陷(不可能实现“所有”),因此:生成与原程序差异极小的变异体来尽可能模拟所有缺陷——基于两个假设:1.熟练程序员:该程序员所编写出来的代码与正确的十分接近,因此小幅度变异即可;2.复杂变异体和简单变异体的耦合效应:(关注软件缺陷)若该测试用例集可以检测所有简单变体(一阶变异体,针对简单缺陷(单一语法修改形成的缺陷),执行单一变异算子并形成的变异体,),那么就可以检测大部分的复杂变异体(高阶变异体,依次执行多次变异算子形成的变异体 ),因此只考虑简单变异体就可以。

 

【实验过程】

0. 将待测文件和junit 测试文件,以及编译生成的.class文件分贝放入src文件夹和class文件夹之中,注意是否有package,处理方法见下。

 

1. 生成变体:

运行 GenMutants.cmd

 

 

file是需要进行变异的待测java文件,因此我选择Monkey.java

右侧Java mutation operator 就是可选的变异算子,一般都是全选。

 

结果点击generate 生成后,通过另外两个选项卡中查看,竟然还是Calcator的变异体们,事情似乎有点儿不对,结果我在命令行的黑框中发现:

 

 原来是文件路径识别出错——因为示例的Calculator是没有package的,所以直接放入即可,但是我通过eclipse新建的项目,有命名pakage hyx,且.class文件无法打开修改,所以解决办法就是——新建一个hyx文件夹放入即可。

 

 

运行成功↓

 

 通过另外两个选项卡查看生成的变体:

AOIS_2 变异算子的结果对比:将 a+b 变异成了 -a+b

 

 

变异体存放的位置: muJavaHome - > result -> hyx.Monkey ->  traditional_mutants -> double_add(double,double) 和 double_sub(double,double) 是我的源代码中的两个函数,

 

 

 

2. 变异测试

 

 将Junit测试生成的测试MonkeyTest.java文件和编译生成的MonkeyTest.class文件都放入Tests文件夹中,运行RunTest.cmd 

 

 

选择你想要变异测试的class和testcase ,点击RUN ,可以看见result那栏的变化:一共36个变异体,杀除了26个,还剩10个活着,说明测试用例不够充分。

 

 

测试的详细结果在ResultTest.txt文件之中,

 

 

解析:

 

 

1.hyx.MonkeyTest(测试用例集合类名,该类的每个方法都是一个测试用例——testAdd、testSub)

2.待测类的源程序也就是Monkey的Junit测试结果,应该是全部Pass才对。

 

 

 第一个 Executing Mutants 是类级别变体的测试结果;每一个 Executing Mutants 的格式都是一样的:

 test report : 列出每个用例(方法)可以杀死的所有变体

Mutant report: 每个变体可以被哪些用例杀死

若没有该级别的变体,最后一行会出现[Notice] There are no mutants to apply

 

第二个 Executing mutants 是方法级别变体的测试结果,

 

 

第一行的:AOIS_1, test_sub用例 Pass,但是 test_add用例结果不相同,被杀除了,所以:变异体AOIS_1可以被 test_add用例杀除,但是不能被 test_sub用例杀除;

test report : testSub 用例一个也没杀除……

 

posted @ 2018-04-24 21:51  黄译萱  阅读(639)  评论(0编辑  收藏  举报