使用μJava进行变异体测试
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用μJava进行变异体测试相关的知识,希望对你有一定的参考价值。
- 一、环境配置
mujava运行的是Java程序,Java的环境配置见Eclipse+JDK配置那点事。
将下载的mujava相关文件放到一个文件夹,文件夹放到C:\\muJava
- 添加mujava环境变量CLASSPATH:
C:\\mujava\\mujava.jar;C:\\mujava\\openjava.jar;C:\\mujava\\junit.jar
- 创建一个文件夹,如C:\\mujavaTest;将mujava.config 移至 该文件夹,并用记事本打开将MuJava_HOME设置为该文件夹,即
MuJava_HOME=C:\\mujavaTest
;最后在该文件夹下创建如下结构目录: - 在C:\\mujavaTest下创建两个Txt,另存为cmd后缀,方便运行mujava程序。txt分别内容为:
GenMutants.cmd:
RunTest.cmd:
*运行mujava的目录要包含mujava.config
- 二、生成变体
- 先对muJavaHome的文件夹进行解释:
-
我们把在eclipse下编译好的.java和.class文件分别放到src和classes里面,然后点击运行GenMutants.cmd
- 然后我们生成变异体
-
生成完毕后可在其余两个选项卡中查看生成的变体,变体.java与.class位于result文件夹
- 三、编写测试用例
- 关于Juint参考:http://www.cnblogs.com/mjm212/p/6534674.html
- 测试代码如下:
import static org.junit.Assert.*; import org.junit.After; import org.junit.Before; import org.junit.Test; public class CalculatorTest { private Calculator c; @Before public void setUp() throws Exception { // setUp()用于测试前的初始化 c = new Calculator(); } @After public void tearDown() throws Exception { // tearDown()用于测试后的善后 c = null; } @Test public void testAdd() { double []a = {1}; double []b={2}; assertEquals(3, c.add(a, b), 0.0000f); assertEquals(3, c.add(a, b), 0.0000f); } @Test public void testSub() { double []a = {3}; double []b={1}; assertEquals(2, c.sub(a, b), 0.0000f); assertEquals(2, c.sub(a, b), 0.0000f); } @Test public void testMulti() { double []a = {3}; double []b={2}; assertEquals(6, c.multi(a, b), 0.0000f); assertEquals(6, c.multi(a, b), 0.0000f); } @Test public void testDiv() { double []a = {2}; double []b={2}; assertEquals(1, c.div(a, b), 0.0000f); assertEquals(1, c.div(a, b), 0.0000f); } @Test public void test5() { assertTrue(!false); } }
- Calculator.java的JUnit测试类CalculatorTest.java和.class文件复制在testset文件夹。
- 四、运行变异测试
- 运行RunTest.cmd,见如下界面。设定相关参数后点击Run进行变异测试。测试完成后可以看到统计结果,测试结果的详细内容被输出到muJavaTest\\TestResult.txt中。
-
- 查看测试结果统计信息
- 查看更详细的测试输出:
- 五、分析测试结果
-
分析:在使用Junit进行测试的时候:
我们发现在使用测试变异体时仍有许多的变异体没有被kill,我们查看一下为什么没有被kill,发现有一种类似于a++,a—的错误没有被查看到,因为a++是在该语句被执行后才对a进行++,所以我们应该在Junit Test 里加入一些测试用例。
后来修改了Test发现结果分析不变,我们看了一下结果报告最终猜测他每一次可能只执行一次assertEqual,所以我们修改了一下测试代码: -
我们发现kill率明显上升了,成为100%。
- 六、结论
- 所以说在测试时我们发现生成的变异体,我们需要通过使用更多的测试用例去检测这些变异体,从而使我们的程序稳定。
以上是关于使用μJava进行变异体测试的主要内容,如果未能解决你的问题,请参考以下文章