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

摘要:
为了解决这个问题,引入了测试套件。通过将多个测试放入套件中,一并执行多个测试。实例:一次运行多个测试类比如,有两个测试类,叫CalculatorTest和CalculatorTest2。在测试类所在的包中新建一个类,叫做TestAll,如下:packagecom.mengdd.junit;importjunit.framework.Test;importjunit.framework.TestCase;importjunit.framework.TestSuite;publicclassTestAllextendsTestCase{publicstaticTestsuite(){//创建一个测试套件TestSuitesuite=newTestSuite();//增加测试类的class对象suite.addTestSuite;suite.addTestSuite;returnsuite;}}运行时,右键这个类,RunAs-˃JUnitTest:就相当于运行了CalculatorTest和CalculatorTest2。
测试套件

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

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

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

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

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

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

packagecom.mengdd.junit;

importjunit.framework.Test;
importjunit.framework.TestCase;
importjunit.framework.TestSuite;

public class TestAll extendsTestCase
{

    public staticTest suite()
    {
        //创建一个测试套件
        TestSuite suite = newTestSuite();

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

        returnsuite;

    }
}

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

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

就相当于运行了CalculatorTest和CalculatorTest2。

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

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

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

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

被测试类不变:

Calculator
packagecom.mengdd.junit;

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

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

测试类:

CalculatorTest
packagecom.mengdd.junit;

importjunit.framework.Assert;
importjunit.framework.TestCase;

public class CalculatorTest extendsTestCase
{

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



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

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

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

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

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

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

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

    public voidtestDivideByZero()
    {
        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());//抛出的异常信息是否和期望一致
        
        //如果上面两个都通过,则测试通过
}

}

测试套件类:

packagecom.mengdd.junit;

importjunit.extensions.RepeatedTest;
importjunit.framework.Test;
importjunit.framework.TestCase;
importjunit.framework.TestSuite;

public class TestAll extendsTestCase
{

    public staticTest suite()
    {
        //创建一个测试套件
        TestSuite suite = newTestSuite();

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

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

        returnsuite;

    }
}

运行结果:

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

参考资料

圣思园张龙老师视频教程

免责声明:文章转载自《JUnit3 一次运行多个测试类和进行多次重复测试:使用测试套件和RepeatedTest》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇条件变量用例--解锁与signal的顺序问题Linux ERRNO下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】C++调试技巧

自己总是用VC平台来开发东西,但是有时候总是出这样那样的问题,在这里把Visual C++开发工具与调试技巧整理摘录如下,希望对大家有用,省去大家再去搜索的烦恼。   1.如何在Release状态下进行调试   Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选G...

Debug与Release版本的区别

  Debug 和 Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。如果我们愿意,我们完全可以把Debug和Release的行为完全颠倒过来。当然也可以提供其他的模式,例如自己定义一组编译选项,然后命名为MY_ABC等。习惯上,我们仍然更愿意使用VC已经定义好的名称。    Debug版本包括调试...

Debug与Release的区别

  Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。Release  Buil...

C++ 宏和模板简介

参考《21天学通C++》第14章节,对C++中的宏和模板进行了学习,总结起来其主要内容如下: (1) 预处理器简介 (2) 关键字#define与宏 (3) 模板简介 (4) 如何编写函数模板和模板类 (5) 宏和模板之间的区别 (6) 使用static_assert进行编译阶段检查 **********************************...

sphinx安装测试2

上一节咱们介绍了sphinx的安装,也进行了简单的测试,这一节说一下sphinx都有哪些链接方式。 上一节咱们安装的sphinx是2.2.11 最新稳定版本,但是在安装目录、usr/local/sphinx/bin当中没有search命令。不知道是不是最新的sphinx把search命令给去掉的、请大家注意一下。 安装之后最主要怎么应用在咱们的程序当中,s...

C++ 断言

assert宏 (基本概念与用法整理) assert宏的深入学习 1、运行时断言 1.1、assert属于运行时断言,可以在运行时判断给定条件是否为真,如果为真则什么也不做,否则打印一跳错误信息,然后通过abort来终止程。当程序开发阶段,我们可以在debug模式下加入大量的运行时断言,来提高我们程序的健壮性,并且提高开发速度。但是当程序需要发布的时候,大...