JUnit和异常
对于测试而言,下面两种异常是我们可能会感兴趣的:
1.从测试代码抛出的可预测异常。
2.由于某个模块(或代码)发生严重错误,而抛出的不可预测异常。
任何对assertTrue(true)的使用都应该被翻译为“我预期控制流程会达到这个地方”。通常而言,对于方法中每个被期望的异常,你都应该写一个专门的测试来确认该方法在应该抛出异常的时候确实会抛出异常。如上例中testEmpty()测试方法的设计。
对于处于出乎意料的异常,你最好简单的改变你的测试方法的声明让它能抛出可能的异常。JUnit框架可以捕获任何异常,并且把它报告为一个错误,这些都不需要你的参与。
Per-method的Setup和Tear-down
对于重复出现在各个单元测试中的运行环境,可以集中加以管理,可以在继承TestCase之后,重新定义setUp()与tearDown()方法,将数个单元测试所需要的运行环境在setUp()中创建,并在tearDown()中销毁。
JUnit的TestCase基类提供两个方法供你改写,分别用于环境的建立和清理:
protected void setup();
protected void teardown();
测试类MathToolTest2:
packagecom.zj.c01; importjunit.framework.TestCase; publicclassNumberToolTest2extendsTestCase { privateint[]arr; publicNumberToolTest2(String name) { super(name); } protectedvoidsetUp()throwsException { super.setUp(); arr=newint[] { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5 }; } protectedvoidtearDown()throwsException { super.tearDown(); arr=null; } publicvoidtestMax() { assertEquals(5, NumberTool.getMax(arr)); } publicvoidtestMin() { assertEquals(-5, NumberTool.getMin(arr)); } } |
TestSuite
每一个定义好的TestCase,都使用TestRunner来运行测试,事实上TestRunner并不直接运行TestCase上的单元方法,而是通过TestSuite ,TestSuite可以将数个TestCase组合在一起。
在上面的例子中,并没有看到任何的TestSuite,这是因为TestRunner的run()方法中会建立TestSuite:
staticpublicvoidrun(Class testClass) { run(newTestSuite(testClass)); } |
在这个TestSuite的建构式中,会使用反射自动找出testXXX()方法,并加入待执行的测试方法, TestRunner的run()方法中会去执行TestSuite上的run()方法,然后TestSuite会将之委托给TestCase上的 run()方法,而该run()方法中执行每一个testXXX()方法。
如果你只想执行某TestCase中的部分测试函数,则可自己构建TestSuite,下面的代码针对NumberToolTest中的两个测试函数testSimple()和testNegitave()进行测试。
packagecom.zj.c02; importcom.zj.c01.NumberToolTest; importjunit.framework.Test; importjunit.framework.TestSuite; publicclassPartTest { TestSuite suite =newTestSuite(); suite.addTest(newNumberToolTest("testSimple")); suite.addTest(newNumberToolTest("testNegitave")); returnsuite; } } |
使用Eclipse-Run As JUnit Test