Junit4常用注解

借助Java 5 注释,JUnit 4 比从前更轻(量级),也更加灵活。JUnit 4 放弃了严格的命名规范和继承层次,转向了一些令人激动的新功能。下面是一份关于 JUnit 4 新功能的快速列表:

l  参数测试

l  异常测试

l  超时测试

l  灵活固件

l  忽略测试的简单方法

l  对测试进行逻辑分组的新方法。

让我们来一个一个整理。兵马未动,注解先行。注解先行之前,公共资源也要都要先准备好。我们现在before,after,beforeClass,afterClass开始。

1,Fixture相关注解:

何谓Fixture?汉语翻译就是:

设备;固定装置;固定于某处不大可能移动之物。

它是指在执行一个或者多个测试方法时需要的一系列公共资源或者数据,例如测试环境,测试数据等等。在编写单元测试的过程中,我们会发现在大部分的测试方法在进行真正的测试之前都需要做大量的铺垫——为设计准备 Fixture 而忙碌。这些铺垫过程占据的代码往往比真正测试的代码多得多,而且这个比率随着测试的复杂程度的增加而递增。当多个测试方法都需要做同样的铺垫时,重复代码的“坏味道”便在测试代码中弥漫开来。这股“坏味道”会弄脏我们的代码,还会因为疏忽造成错误,应该使用一些手段来根除它。
JUnit 专门提供了设置公共 Fixture 的方法,同一测试类中的所有测试方法都可以共用它来初始化 Fixture 和注销 Fixture。和编写 JUnit 测试方法一样,公共 Fixture 的设置也很简单,我们只需要:
1),使用注解 org.junit.Before 修饰用于初始化 Fixture 的方法。
2),使用注解 org.junit.After 修饰用于注销 Fixture 的方法。
和普通的测试方法一样,保证这两种方法都使用 public void 修饰,而且不能带有任何参数。遵循上面的三条原则,编写出的代码大体是这个样子:
//初始化Fixture方法
@Before 
public void setUp(){……}

//注销Fixture方法
@After 
public void tearDown(){……}
这样,在每一个测试方法执行之前,JUnit 会保证setUp方法已经提前初始化测试环境,而当此测试方法执行完毕之后,JUnit 又会调用tearDown方法注销测试环境。注意是每一个测试方法的执行都会触发对公共 Fixture 的设置,也就是说使用注解 Before 或者 After 修饰的公共 Fixture 设置方法是方法级别的(setUp-->test1-->tearDown-->setUp-->test2-->teatDown。。。)。这样便可以保证各个独立的测试之间互不干扰,以免其它测试代码修改测试环境或者测试数据影响到其它测试代码的准确性。
 
可是,这种 Fixture 设置方式还是引来了批评,因为它效率低下,特别是在设置 Fixture 非常耗时的情况下(例如设置数据库链接)。而且对于不会发生变化的测试环境或者测试数据来说,是不会影响到测试方法的执行结果的,也就没有必要针对每一个 测试方法重新设置一次 Fixture。因此在 JUnit 4 中引入了类级别的 Fixture 设置方法,编写规范如下:
1),使用注解 org.junit.BeforeClass 修饰用于初始化 Fixture 的方法。
2),使用注解 org.junit.AfterClass 修饰用于注销 Fixture 的方法。
保证这两种方法都使用 public static void 修饰,而且不能带有任何参数。类级别的 Fixture 仅会在测试类中所有测试方法执行之前执行初始化,并在全部测试方法测试完毕之后执行注销方法(init-->test1-->test2-->destroy)。代码范本如下:
//类级别Fixture初始化方法
@BeforeClass 
public static void init(){……}
    
//类级别Fixture注销方法
@AfterClass 
public static void destroy(){……}


2,Test相关注解:

OK,现在重点来了,我们研究下Test注解。

毫无疑问的,和3.8版本的junit一样,测试方法必须是public void的,并且不带任何参数。然后我们用@Test注解来修饰这个方法,就表示这个方法是一个测试方法了。这个不在赘述了。

关于这个注解我主要是想介绍下@Test注解的异常测试和时间测试。

1),注解 org.junit.Test 中有两个非常有用的参数:expected 和timeout。参数 expected 代表测试方法期望抛出指定的异常,如果运行测试并没有抛出这个异常,则 JUnit 会认为这个测试没有通过。这为验证被测试方法在错误的情况下是否会抛出预定

的异常提供了便利。举例来说,方法 supportDBChecker 用于检查用户使用的数据库版本是否在系统的支持的范围之内,如果用户使用了不被支持的数据库版本,则会抛出运行时异常 UnsupportedDBVersionException。测试方法 

supportDBChecker 在数据库版本不支持时是否会抛出指定异常的单元测试方法大体如下:

@Test(expected=UnsupportedDBVersionException.class)
	public void unsupportedDBCheck(){
		……
}

2),注解 org.junit.Test 的另一个参数 timeout,指定被测试方法被允许运行的最长时间应该是多少,如果测试方法运行时间超过了指定的毫秒数,则JUnit认为测试失败。这个参数对于性能测试有一定的帮助。例如,如果解析一份自定义的 XML 文档花费了多于 1 秒的时间,就需要重新考虑 XML 结构的设计,那单元测试方法可以这样来写:

@Test(timeout=1000)
	public void selfXMLReader(){
		……
}


OK,常用的注解基本就是这几个,现在来写一个例子,演示一下这些常用注解的用法。

package test.junit4test;

import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class LinkinTest
{
	@BeforeClass
	public static void init()
	{
		System.out.println("====这里是类级别的初始化方法。。。");
	}

	@AfterClass
	public static void destroy()
	{
		System.out.println("====这里是类级别的销毁方法。。。");
	}

	@Before
	public void setUp()
	{
		System.out.println("==这里是方法级别的初始化方法。。。");
	}

	@After
	public void tearDown()
	{
		System.out.println("==这里是方法级别的销毁方法。。。");
	}

	@Test
	public void testLinkin1()
	{
		assertTrue(true);
		System.out.println("这里是普通测试方法一。。。");
	}

	@Test
	public void testLinkin2()
	{
		assertTrue(true);
		System.out.println("这里是普通测试方法二。。。");
	}

	@Test(expected = NullPointerException.class)
	public void testLinkin3()
	{
		System.out.println("这里是异常的测试方法。。。");
		String linkin = null;
		System.out.println(linkin.toString());
	}

	@Test(timeout = 1000)
	public void testLinkin4()
	{
		try
		{
			Thread.sleep(2);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			fail("时间测试不通过。。。");
		}
		finally
		{
			System.out.println("这里是测试代码运行时间。。。");
		}
	}

}
 
OK,测试通过。


原文地址:https://www.cnblogs.com/LinkinPark/p/5232890.html