使用μJava进行变异体测试

  • 一、环境配置

mujava运行的是Java程序,Java的环境配置见Eclipse+JDK配置那点事

将下载的mujava相关文件放到一个文件夹,文件夹放到C:muJava

  1. 添加mujava环境变量CLASSPATH: 
    C:mujavamujava.jar;C:mujavaopenjava.jar;C:mujavajunit.jar
  2. 创建一个文件夹,如C:mujavaTest;将mujava.config 移至 该文件夹,并用记事本打开将MuJava_HOME设置为该文件夹,即MuJava_HOME=C:mujavaTest;最后在该文件夹下创建如下结构目录: 
  3. 在C:mujavaTest下创建两个Txt,另存为cmd后缀,方便运行mujava程序。txt分别内容为: 
    GenMutants.cmd: 
    RunTest.cmd: 
    *运行mujava的目录要包含mujava.config
  • 二、生成变体
  1. 先对muJavaHome的文件夹进行解释:
  2. 我们把在eclipse下编译好的.java和.class文件分别放到src和classes里面,然后点击运行GenMutants.cmd

  3. 然后我们生成变异体
  4. 生成完毕后可在其余两个选项卡中查看生成的变体,变体.java与.class位于result文件夹

  • 三、编写测试用例
  1. 关于Juint参考:http://www.cnblogs.com/mjm212/p/6534674.html
  2. 测试代码如下:
    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);
        }
    
    }
  3. Calculator.java的JUnit测试类CalculatorTest.java和.class文件复制在testset文件夹。 

  • 四、运行变异测试
  1. 运行RunTest.cmd,见如下界面。设定相关参数后点击Run进行变异测试。测试完成后可以看到统计结果,测试结果的详细内容被输出到muJavaTestTestResult.txt中。
  2. 查看测试结果统计信息
  3. 查看更详细的测试输出:
  • 五、分析测试结果
  1. 分析:在使用Junit进行测试的时候:

    我们发现在使用测试变异体时仍有许多的变异体没有被kill,我们查看一下为什么没有被kill,发现有一种类似于a++,a—的错误没有被查看到,因为a++是在该语句被执行后才对a进行++,所以我们应该在Junit Test 里加入一些测试用例。

    后来修改了Test发现结果分析不变,我们看了一下结果报告最终猜测他每一次可能只执行一次assertEqual,所以我们修改了一下测试代码:
  2. 我们发现kill率明显上升了,成为100%。

  • 六、结论
  1. 所以说在测试时我们发现生成的变异体,我们需要通过使用更多的测试用例去检测这些变异体,从而使我们的程序稳定。
原文地址:https://www.cnblogs.com/mjm212/p/6708200.html