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; } }
运行结果:
参考资料
圣思园张龙老师视频教程