首页 > 代码库 > mujava
mujava
一、介绍
1、变异测试
在源代码的基础上进行细节性的改变,进行变异,从而改进程序源代码的一种fault-based的软件测试方法。
所谓变异,是基于良好定义的变异操作(模拟典型应用错误,例如,错误的操作符或者变量名字;或是强制产生有效的测试,例如,使每个表达式都等于0)。
变异测试的目的在于帮助测试者发现有效的测试,评价测试数据集的完备性,定位测试数据的弱点,并对其改善。在产生的变异体代码中选择等价和非等价变异体,根据非等价变异体和源代码的区别,补充测试用例,从而找出源代码中的错误。然而现在在区分等价变异体的过程中大多还是采用人工区分的方法。
变异测试在高性能、高安全要求的软件开发中有很重要的作用。
2、
根据官方网站https://cs.gmu.edu/~offutt/mujava/ 介绍,是一种用来对Java程序产生变体,进行变异测试的一个工具。根据变异算子产生程序的变异体,同时在源程序和变异程序上执行测试用例(利用Junit生成的测试用例),区分出可存活和不可存活的变异体。
二、配置过程
1、 配置Java,并添加环境变量
2、 官网下载的相关jar包和Junit的jar包,
存放至新建文件夹mujava中,并将jar路径添加到添加到环境变量classpath中。
3、 新建mujavaHome目录,将mujava.config放至该目录下,并手动创建如下目录结构:
四个文件夹的用处为:
Classes |
待测试源代码编译后的.class文件 |
Result |
待测试源代码变异后产生的代码 |
Src |
待测试的.java源文件 |
Testset |
Junit测试类.java源文件和编译后的.class文件 |
新建GenMutants.cmd和RunTest.cmd用于运行变体产生和运行测试的命令。
最终mujavaHome的目录结构如下:
三、实验结果
进行两个Java程序的变异测试
1、 产生程序的变体,以Calculator.java为例,有加减乘除4个方法,其中人为设置其中add方法出错:
CalculatorTest.java代码如下:
将Calculator.java放在src目录下,javac编译后的
Calculator.class放在classes目录下,CalculatorTest.java和CalculatorTest.class放在testset目录下。
双击运行GenMutants.cmd
产生结果:
产生后的变体代码存放目录:
双击运行RunTest.cmd,在源代码和变体代码上执行测试用例
运行结果:
在mujavaHome目录下的TestResult.txt有更详细的输出结果
同理,第二个java代码Triangle.java也按照相同的步骤进行。
TriangleTest.java代码如下:
运行结果如下:
四、实验结论
实验中进行了对Calculator.java和Triangle.java两个java程序进行变异测试。执行结果汇报如下:
源程序 |
产生变异程序 |
可存活变异体 |
不可存活变异体 |
Kill 百分比 |
Calculator .java |
共79,AORB—20,AOIU—4,AOIS—32,SDL—4,VDL—8,CDL—1,ODL—10 |
26 |
53 |
67.0% |
Triangle .java |
共337,AORB—24,AOIU—18,AOIS—132,AODU—1,ROR—63,COR—6,COI—12,LOI—33,SDL—23,VDL—6,ODL—19 |
105 |
232 |
68.0% |
每次执行测试后,在mujavaHome目录下会自动生成TestResrult.txt结果,详细记录了源代码和每个变体的测试用例执行结果。
对变异算子的类型总结如下:
变异算子 |
描述 |
AORB |
改变二元运算符 |
AOIU |
改变变量正负号(加负号) |
AOIS |
插入一元运算符 |
SDL |
语句删除 |
VDL |
删除某个变量 |
CDL |
删除某个运算常数 |
ODL |
删除某个变量或者运算常数 |
AODU |
改变返回值 |
ROR |
改变关系运算符 |
COR |
改变逻辑运算符 |
COI |
改变真值运算符(加非号) |
LOI |
改变位运算符 |
结论: 是进行变异测试的工具,根据不同变异算子模拟不同的程序典型错误,对源代码进行相应改变,执行测试用例后,找出可存活变异体和不可存活变异体。
mujava