1.2.2 JUnit4引入了一个JUnit3中没有的新特性——类范围的 setUp() 和tearDown() 方法。
任何用 @BeforeClass 注释的方法都将在该类中的测试方法运行之前刚好运行一次,而任何用@AfterClass注释的方法都将在该类中的所有测试都运行之后刚好运行一次。
1.2.3 异常测试:
异常测试是Junit4中的大改进。Junit3的异常测试是在抛出异常的代码中放入try块,然后在try块的末尾加入一个fail()语句。
例如该方法测试一个被零除抛出一个ArithmeticException:
该方法不仅难看,而且试图挑战代码覆盖工具,因为不管测试是否通过还是失败,总有一些代码不被执行。在JUni4中,可以编写抛出异常的代码,并使用注释来声明该异常是预期的:
如果没有异常抛出或者抛出一个不同的异常,那么测试将失败。
1.2.4 JUnit4添加了两个比较数组的assert() 方法:
public static void assertEquals(Object[] expected,Object[]actual)
public static void assertEquals(String message, Object[]expected,Object[] actual)
这两个方法以直接的方式比较数组:如果数组长度相同,且每个对应的元素相同,则两个数组相等,否则不相等。数组为空的情况也作了考虑。
1.3 JUnit 4 常用的几个annotation 介绍
★ @Before:初始化方法,在任何一个测试执行之前必须执行的代码;
★ @After:释放资源,在任何测试执行之后需要进行的收尾工作;
★@Test:测试方法,表明这是一个测试方法。对于方法的声明也有如下要求:名字可以随便取,没有任何限制,但是返回值必须为void,而且不能有任何参数。如果违反这些规定,会在运行时抛出一个异常。至于方法内该写些什么,那要看你需要测试些什么了;在这里可以测试期望异常和超时时间,如@Test(timeout=100),我们给测试函数设定一个执行时间,超过了这个时间(100毫秒),它们会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样你可以发现这些Bug了。
★@Ignore:忽略的测试方法,标注的含义是“某些方法尚未完成,暂不参与此次测试”;这样的话测试结果会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,可以进行正常的测试。
★ @BeforeClass:针对所有测试,只执行一次,且必须为static void;
★ @AfterClass:针对所有测试,只执行一次,且必须为static void;
所以一个Junit 4 的单元测试用例执行顺序为:@BeforeClass –> @Before –>@Test–> @After –> @AfterClass;每一个测试方法的调用顺序为:@Before –>@Test–> @After。
如下面例子:
import static org.junit.Assert.*; importorg.junit.After;importorg.junit.AfterClass;importorg.junit.Before;importorg.junit.BeforeClass;importorg.junit.Ignore;importorg.junit.Test; public class JUnit4Test{
@Before
public void before() {
System.out.println(@Before);
}
@Test
public void test() {
System.out.println(@Test);
assertEquals(5 + 5, 10);
}
@Ignore
@Test
public void testIgnore() {
System.out.println(@Ignore);
}
@Test(timeout = 50)
public void testTimeout() {
System.out.println(@Test(timeout = 50));
assertEquals(5 + 5, 10);
}
@Test(expected = ArithmeticException.class)
public void testExpected() {
System.out.println(@Test(expected = Exception.class));
throw new ArithmeticException();
}
@After
public void after() {
System.out.println(@After);
}
@BeforeClass
public static void beforeClass() {
System.out.println(@BeforeClass);
};
@AfterClass
public static void afterClass() {
System.out.println(@AfterClass);
};
};