`
sirong_chan
  • 浏览: 11460 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Junit Test

    博客分类:
  • Test
 
阅读更多
@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(){
.............
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics