如果测试类写到很多,每次要进行测试,难道要重新点击每一个测试类来运行?如果有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:
就相当于运行了CalculatorTest和CalculatorTest2。
实例:进行方法的重复测试
如果要对某个方法进行多次测试,可以使用RepeatedTest。
使用时注意,测试类需要一个带参数(String)的构造函数,将String参数传给基类TestCase,调用基类的带参数的构造函数。
于是修改之前的代码如下:
被测试类不变:
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; } }
测试类:
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; } }
运行结果:
参考资料
圣思园张龙老师视频教程