junit单元测试
现在最新的Junit是Junit4,Junit4最大的亮点就是引入了注解(annotation),通过解析注解就可以为测试提供相应的信息,并抛弃Junit3使用命名约束的方式。
我们先从Junit3开始
对于Junit3,有一下的规定和要求
1. 测试类必须要继承于TestCase父类,必须已Test开头或结尾
2. 测试方法需要满足如下原则:
- 测试方法是public类型
- 测试方法无返回类型,是void的
- 测试方法无方法参数
- 测试方法方法名称必须以test开头
我们看个Junit3测试的例子
1 public class CalculatorTest extends TestCase 2 { 3 private Calculator cal; 4 5 @Override 6 public void setUp() throws Exception 7 { 8 cal = new Calculator(); 9 } 10 11 @Override 12 public void tearDown() throws Exception 13 { 14 15 } 16 17 public void testAdd() 18 { 19 int result = cal.add(1, 2); 20 Assert.assertEquals(3, result); 21 } 22 23 public void testSubtract() 24 { 25 int result = cal.subtract(1, 2); 26 Assert.assertEquals(-1, result); 27 } 28 }
对于要进行测试方法test前后操作,则对setUp(), tearDown()这两个方法进行重写。每进行一个测试用例前后,都会调用setUp(), tearDown()。对伊test case的执行次序如下:
1 setUp()
2 testYYY()
3 tearDown()
4 setUp()
5 testXXX()
6 tearDown()
2 testYYY()
3 tearDown()
4 setUp()
5 testXXX()
6 tearDown()
实际上:对于测试用例,每执行一个都会new一个新的对象。
对于junit测试我们可以指定文本界面或图形界面来运行,我们需要自己写静态main方法,在main方法中通过调用下面的方法启动不同的运行器。
1. 启动文本界面
junit.textui.TestRunner.run(CalculatorTest.class);
2. 启动文本图形界面
junit.swingui.TestRunner.run(CalculatorTest.class);
对于Junit3,当需要对多个类或者模块进行测试的时候,我们都会写好每个类的测试用例,然后写一个Suite来将它们串联起来。
1 public class TestAll extends TestCase 2 { 3 public static Test suite() 4 { 5 TestSuite suite = new TestSuite(); 6 7 suite.addTestSuite(CalculatorTest.class); 8 suite.addTestSuite(LargestTest.class); 9 suite.addTestSuite(DeleteAllTest.class); 10 11 suite.addTest(new RepeatedTest(new CalculatorTest("testSubtract"), 20)); 12 13 return suite; 14 } 15 }
对于Junit3,通过RepeatedTest可以重复运行某个单个方法,但是对于该测试类,必须增加一个String参数的构造方法。
1 public class Calculator2Test extends TestCase 2 { 3 public void testAdd() 4 { 5 try 6 { 7 Calculator2 cal2 = new Calculator2(); 8 Class<Calculator2> clazz = Calculator2.class; 9 Method method = clazz.getDeclaredMethod("add", new Class[] { 10 Integer.TYPE, Integer.TYPE }); 11 method.setAccessible(true); 12 Object result = method.invoke(cal2, new Object[] { 2, 3 }); 13 Assert.assertEquals(5, result); 14 } 15 catch (Exception ex) 16 { 17 Assert.fail(); 18 } 19 } 20 }
Junit3就到这,下面我们看看Junit4
JUnit4利用Annotation简化测试用例的编写。不要求必须继承自TestCase。对于类名,方法名也不强制要求,但是实际项目中按照junit3的要求书写,这样便于测试用例的管理。