04.Junit的注解

JUnit4的测试类不用需要像Junit3那样继承TestCase类了。使用注解会方便很多。

在测试用例中常用的注解如下:

  • @Before : 初始化方法
  • @After : 释放资源
  • @Test : 测试方法,在这里可以测试期望异常和超时时间
  • @Ignore : 忽略的测试方法
  • @BeforeClass : 针对所有测试,只执行一次,且必须为static void
  • @AfterClass : 针对所有测试,只执行一次,且必须为static void

一个JUnit 4 的单元测试用例执行顺序为:

@BeforeClass –> @Before –> @Test –> @After –> @AfterClass

每一个测试方法的调用顺序为:

@Before –> @Test –> @After

@BeforeClass

使用@BeforeClass注解一个public static void方法,并且该方法不带任何参数,会使该方法在所有测试方法被执行前执行一次,并且只执行一次

父类的@BeforeClass注解方法会在子类的@BeforeClass注解方法执行前执行

此注释常用于初始化一些资源,比如数据库连接池,网络连接池等。

@Before

使用@Before注解一个public void方法会使该方法在@Test注解方法被执行前执行(那么就可以在该方法中创建相同的对象)

父类的@Before注解方法会在子类的@Before注解方法执行前执行

此注释常用于初始化初始化一些公共的对象资源。

@Ignore

对包含测试类的类或@Test注解方法使用@Ignore注解将使被注解的类或方法不会被当做测试执行

JUnit执行结果中会报告被忽略的测试数

@Test

@Test注解的public void方法将会被当做测试方法

JUnit每次都会创建一个新的测试实例,然后调用@Test注解方法

任何异常的抛出都会认为测试失败

@Test注解提供2个参数:

  1. expected - 定义测试方法应该抛出的异常,如果测试方法没有抛出异常或者抛出了一个不同的异常,测试失败
  2. timeout - 如果测试运行时间长于该定义时间,测试失败(单位为毫秒)

@After

如果在@Before注解方法中分配了额外的资源,那么在测试执行完后,需要释放分配的资源。

使用@After注解一个public void方法会使该方法在@Test注解方法执行后被执行

即使在@Before注解方法、@Test注解方法中抛出了异常,所有的@After注解方法依然会被执行

父类中的@After注解方法会在子类@After注解方法执行后被执行

@AfterClass

如果在@BeforeClass注解方法中分配了代价高昂的额外的资源,那么在测试类中的所有测试方法执行完后,需要释放分配的资源。

使用@AfterClass注解一个public static void方法会使该方法在测试类中的所有测试方法执行完后被执行

即使在@BeforeClass注解方法中抛出了异常,所有的@AfterClass注解方法依然会被执行

父类中的@AfterClass注解方法会在子类@AfterClass注解方法执行后被执行


除了以上的常用注释,还有一些不常用的,如下:

@Runwith

测试运行器,此注解放在测试类名之前,用来确定测试类怎么运行的,当不指定这个注解时,使用默认Runner来运行测试代码

常见的运行器有:

  • @RunWith(Parameterized.class):

    参数化运行器,配合@Parameters使用JUnit的参数化功能。

  • @RunWith(Suite.class)

    @RunWith(Suite.class)
    @SuiteClasses({ATest.class,BTest.class,CTest.class})
    

  测试集运行器配合使用测试集功能。

  • @RunWith(JUnit4.class)

  JUnit 4的默认运行器

  • @RunWith(JUnit38ClassRunner.class)

  用于兼容junit3.8的运行器

  • 一些其它运行器具备更多功能。

  例如@RunWith(SpringJUnit4ClassRunner.class)集成了Spring的一些功能。

@Parameters

为了保证单元测试的严谨性,我们模拟了不同的测试数据来测试方法的处理能力,为此我们编写了大量的单元测试方法。而这些测试方法大同小异:代码结构都是相同的,不同的仅仅是测试数据和期望值。为了降低代码的冗余,JUnit 4提供了参数化测试,即只写一个测试方法,把这若干种情况作为参数传递进去,一次性的完成测试。

Junit Parameters注解的用法

注意:该方法需要满足一定的要求:

  1. 该方法必须为public static
  2. 该方法返回值必须为java.util.Collection类型
  3. 该方法的名字不做要求
  4. 该方法没有参数

JUnit 4参数化测试的五个步骤:

  1. 为准备使用参数化测试的测试类指定特殊的运行器org.junit.runners.Parameterized

  2. 为测试类声明几个变量,分别用于存放期望值和测试所用数据。

  3. 为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。

  4. 为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters饰的,返回值为java.util.Collection的公共静态方法,并在此方法中初始化所有需要测试的参数对。

  5. 编写测试方法,使用定义的变量作为参数进行测试。

Demo:

@RunWith(Parameterized.class)
public class SquareTest {
 
	private static Calculator calculator = new Calculator();
 
	private int param;//参数
 
	private int result;//期望值
 
	// 准备数据 
	@Parameters  
	public static Collection data() {
		return Arrays.asList(new Object[][]{{2, 4},{0, 0},{3, 9}});
	}
 
	//构造函数,对变量进行初始化
	public SquareTest(int param, int result) {
		this.param = param;
		this.result = result;
	}
 
	@Test  
	public void square() {
		calculator.square(param);
		assertEquals(result, calculator.getResult());
	}
 }