测试套件
如果测试类写到很多,每次要进行测试,难道要重新点击每一个测试类来运行?如果有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);}@Overridepublic void setUp() throws Exception{System.out.println("set up");// 生成成员变量的实例calculator = new Calculator();System.out.println(calculator);}@Overridepublic 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;} }
运行结果:
参考资料
圣思园张龙老师视频教程