JUnit3 一次运行多个测试类和进行多次重复测试:使用测试套件和RepeatedTest

测试套件

  如果测试类写到很多,每次要进行测试,难道要重新点击每一个测试类来运行?如果有200个测试类要测试呢?

  为了解决这个问题,引入了测试套件(TestSuite)

  通过将多个测试放入套件中,一并执行多个测试。

 

实例:一次运行多个测试类

  比如,有两个测试类,叫CalculatorTest和CalculatorTest2。

  在测试类所在的包中新建一个类,叫做TestAll,如下:

package com.mengdd.junit;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestAll extends TestCase
{

    public static Test suite()
    {
        // 创建一个测试套件
        TestSuite suite = new TestSuite();

        // 增加测试类的class对象
        suite.addTestSuite(CalculatorTest.class);
        suite.addTestSuite(CalculatorTest2.class);

        return suite;

    }
}

  运行时,右键这个类,Run As ->JUnit Test:

 

  就相当于运行了CalculatorTest和CalculatorTest2。

 

实例:进行方法的重复测试

  如果要对某个方法进行多次测试,可以使用RepeatedTest

  使用时注意,测试类需要一个带参数(String)的构造函数,将String参数传给基类TestCase,调用基类的带参数的构造函数。

  于是修改之前的代码如下:

被测试类不变:

Calculator
package com.mengdd.junit;

public class Calculator
{
    public int add(int a, int b)
    {
        return a + b;
    }
    
    public int subtract(int a, int b)
    {
        return a - b;
    }
    
    public int multiply(int a, int b)
    {
        return a * b;
    }

    public int divide(int a, int b) throws Exception
    {
        if(0 == b)
        {
            throw new Exception("除数不能为0");            
        }
        return a / b;
    }
}

 

测试类:

CalculatorTest
package com.mengdd.junit;

import junit.framework.Assert;
import junit.framework.TestCase;

public class CalculatorTest extends TestCase
{

    private Calculator calculator = null;
    
    
    
    public CalculatorTest()
    {
        super();
    }
    public CalculatorTest(String name)
    {
        super(name);
    }



    @Override
    public void setUp() throws Exception
    {
        System.out.println("set up");
        // 生成成员变量的实例
        calculator = new Calculator();
        System.out.println(calculator);
    }

    @Override
    public void tearDown() throws Exception
    {
        System.out.println("tear down");
    }

    public void testAdd()
    {
        int result = calculator.add(1, 2);
        // 判断方法的返回结果
        Assert.assertEquals(3, result);// 第一个参数是期望值,第二个参数是要验证的值
    }

    public void testSubtract()
    {
        int result = calculator.subtract(1, 2);
        // 判断方法的返回结果
        Assert.assertEquals(-1, result);// 第一个参数是期望值,第二个参数是要验证的值

    }

    public void testMultiply()
    {
        int result = calculator.multiply(2, 3);
        // 判断方法的返回结果
        Assert.assertEquals(6, result);// 第一个参数是期望值,第二个参数是要验证的值

    }

    public void testDivide()
    {
        int result = 0;
        try
        {
            result = calculator.divide(12, 3);
        }
        catch (Exception e)
        {
            e.printStackTrace();

            // 如果抛出异常,证明测试失败,没有通过,没通过的测试计数在Failures中
            Assert.fail();
            // 如果不加这一行,如果程序进入到catch,无法判断其失败
        }
        // 判断方法的返回结果
        Assert.assertEquals(4, result);// 第一个参数是期望值,第二个参数是要验证的值

    }

    public void testDivideByZero()
    {
        Throwable tx = null;

        int result = 0;
        try
        {
            result = calculator.divide(12, 0);

            Assert.fail("没有抛出异常,测试失败");// 如果执行到这行代码,则证明没有抛出异常,说明我们的验证失败
        }
        catch (Exception e)
        {
            e.printStackTrace();
            tx = e;

        }

        Assert.assertEquals(Exception.class, tx.getClass());// 抛出的异常类型是否和期望一致
        Assert.assertEquals("除数不能为0", tx.getMessage());// 抛出的异常信息是否和期望一致
        
        //如果上面两个都通过,则测试通过

    }

}

 

测试套件类:

package com.mengdd.junit;

import junit.extensions.RepeatedTest;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

public class TestAll extends TestCase
{

    public static Test suite()
    {
        // 创建一个测试套件
        TestSuite suite = new TestSuite();

        // 增加测试类的class对象
        suite.addTestSuite(CalculatorTest.class);
        suite.addTestSuite(CalculatorTest2.class);

        // 测试某个方法多次,注意测试类需要提供带参数的构造方法
        suite.addTest(new RepeatedTest(new CalculatorTest("testSubtract"), 20));

        return suite;

    }
}

 

运行结果:

 

 

 

参考资料

  圣思园张龙老师视频教程

posted @ 2013-04-07 21:43  圣骑士wind  阅读(6683)  评论(0编辑  收藏  举报