@Test public void method() | 定义一个要测试的方法 |
@Before public void method() | 在每一个测试之前都会被执行的方法,这个方法常常用来进行一些测试环境的准备,比喻说读入输入数据,初始化类 |
@After public void method() | 与 @Before 进行对应,做一个清理工作 |
@BeforeClass public void method() | 在所有的测试开始之前执行,这个方法在类运行的时候运行,而且只会运行一次,所以常常用来做一些所有的方法都要依赖到工作,比喻说,数据库的链接。 |
@AfterClass public void method() | 与 @BeforeClass 进行对应,做一些类级别的清理工作 |
@Ignore | 表明方法是被忽略的,这个方法非常实用,比喻你的方法已经修改,但是对应的测试方法还没有得到一致的修改的时候,可以忽略掉这个测试方法先。 |
@Test(expected=IllegalArgumentException.class) | 检查测试方法是不是抛出了对应的异常 |
@Test(timeout=100) | 如果方法的执行操作所耗费的毫秒数 >100MS ,那么方法失败。 |
修改MathDemo类中div方法如下所示:
public int div(int a, int b) {
if(b == 0)
throw new ArithmeticException("除数不能为零");
return a / b;
}
测试用例如下所示:
package com.reiyen.junit;
import static org.junit.Assert.assertEquals;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class MathDemoTest2 {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("set up.......");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("gone........");
}
@Test
public void testAdd() {
assertEquals("1不等于2", 1 ,2);
}
@Test(expected=ArithmeticException.class)
public void testDiv(){
assertEquals(1, new MathDemo().div(1,0));
}
}
运行此测试用例,控制台打印信息如下:
set up.......
gone........
测试方法testAdd()未通过,打印如下信息:java.lang.AssertionError: 1不等于2 expected:<1> but was:<2>
测试方法testDiv()通过,因为当除数为0时,抛出了ArithmeticException;如果改为:
@Test(expected=ArithmeticException.class)
public void testDiv(){
assertEquals(1, new MathDemo().div(1,1));
}
则未通过,打印出了如下异常:java.lang.AssertionError: Expected exception: java.lang.ArithmeticException
在 JUnit 4 中,您仍然可以在每个测试方法运行之前初始化字段和配置环境。然而,完成这些操作的方法不再需要叫做 setUp(),只要用 @Before 注释来指示即可,如下所示:
@Before
protected void initialize() {
System.setErr(new PrintStream(new ByteArrayOutputStream()));
inputDir = new File("data");
inputDir = new File(inputDir, "xslt");
inputDir = new File(inputDir, "input");
}
甚至可以用 @Before 来注释多个方法,这些方法都在每个测试之前运行:
@Before
protected void findTestDataDirectory() {
inputDir = new File("data");
inputDir = new File(inputDir, "xslt");
inputDir = new File(inputDir, "input");
}
@Before
protected void redirectStderr() {
System.setErr(new PrintStream(new ByteArrayOutputStream()));
}
对于JUnit 3 中的tearDown() 方法,在JUnit 4,我可以给它取一个更自然的名称,并用 @After 注释它:
@After
protected void disposeDocument() {
doc = null;
System.gc();
}
与 @Before 一样,也可以用 @After 来注释多个清除方法,这些方法都在每个测试之后运行。最后,您不再需要在超类中显式调用初始化和清除方法,只要它们不被覆盖即可,测试运行程序将根据需要自动为您调用这些方法。超类中的 @Before 方法在子类中的 @Before 方法之前被调用(这反映了构造函数调用的顺序)。@After 方法以反方向运行:子类中的方法在超类中的方法之前被调用。否则,多个 @Before 或 @After 方法的相对顺序就得不到保证。
时间测试
性能测试是单元测试中最头疼的问题,JUnit 4也未完全解决此问题, 你可以在JUNIT4的测试方法中添加一个时间参数。如果测试时间超过参数,则测试失败。如下,如果测试时间超过0.5秒,则此测试失败:
@Test(timeout=500)
public void retrieveAllElementsInDocument()
{
doc.query("//*");
}
除基准性能测试外,时间测试在网络测试方面也很有用.如果一个远端的主机或数据当掉或太慢,你可以跳过此测试而不用阻塞在这里,好的测试集可以在作了一些改动后很快的一遍一遍的执行,可能一天数十次.设置一个超时让测试更快的执行,下面的示例中如果分析http://www.ibiblio.org/xml 的时间超过2秒,则测试失败.
@Test(timeout=2000)
public void remoteBaseRelativeResolutionWithDirectory() throws IOException, ParsingException
{
builder.build("http://www.ibiblio.org/xml");
}
需要忽略的测试
@lgnore:该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。如下所示:
@Test
@Ignore
public void test1(){
.............
}