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个参数:
expected
- 定义测试方法应该抛出的异常,如果测试方法没有抛出异常或者抛出了一个不同的异常,测试失败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注解的用法
注意:该方法需要满足一定的要求:
- 该方法必须为
public static
的- 该方法返回值必须为
java.util.Collection
类型- 该方法的名字不做要求
- 该方法没有参数
JUnit 4参数化测试的五个步骤:
为准备使用参数化测试的测试类指定特殊的运行器
org.junit.runners.Parameterized
。为测试类声明几个变量,分别用于存放期望值和测试所用数据。
为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
为测试类声明一个使用注解
org.junit.runners.Parameterized.Parameters
饰的,返回值为java.util.Collection
的公共静态方法,并在此方法中初始化所有需要测试的参数对。编写测试方法,使用定义的变量作为参数进行测试。
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());
}
}