文
章
目
录
章
目
录
在JUnit 5中,测试生命周期由四个主要的注解驱动,即@BeforeAll、@BeforeEach、@AfterEach和@AfterAll。同时,每个测试方法必须标记有来自org.junit.jupiter.api包的@Test注解。
1.测试生命周期阶段
通常,一个测试类包含多个测试方法。JUnit以生命周期的形式管理每个测试方法的执行。
借助注解,可以看到一个测试用例的完整生命周期分为三个阶段:
- 设置:这个阶段将测试基础架构就位。JUnit提供类级别设置(@BeforeAll)和方法级别设置(@BeforeEach)。通常,像数据库连接这样的重量级对象在类级别设置中创建,而像测试对象这样的轻量级对象在方法级别设置中重置。
- 测试执行:在此阶段,执行测试和断言。执行结果将表示成功或失败。
- 清理:此阶段用于清理第一个阶段中设置的测试基础架构。就像设置一样,拆除也发生在类级别(@AfterAll)和方法级别(@AfterEach)。
2. Before和After注解
如上所示,在测试生命周期中,我们主要需要一些带有注解的方法来设置和清理测试环境或测试数据,以便进行测试。
- 在JUnit中,默认情况下,对于每个测试方法都会创建一个新的测试实例。
- @BeforeAll和@AfterAll注解——从它们的名字就可以看出——在整个测试执行周期中只应调用一次。因此,它们必须声明为静态的。
- @BeforeEach和@AfterEach被每个测试实例调用,因此它们不应被声明为静态的。
- 如果有多个方法使用相同的注解(例如两个带有@BeforeAll的方法),那么它们的执行顺序是不确定的。
public class AppTest {
@BeforeAll
static void setup(){
System.out.println("@BeforeAll executed");
}
@BeforeEach
void setupThis(){
System.out.println("@BeforeEach executed");
}
@Test
void testCalcOne()
{
System.out.println("======TEST ONE EXECUTED=======");
Assertions.assertEquals( 4 , Calculator.add(2, 2));
}
@Test
void testCalcTwo()
{
System.out.println("======TEST TWO EXECUTED=======");
Assertions.assertEquals( 6 , Calculator.add(2, 4));
}
@AfterEach
void tearThis(){
System.out.println("@AfterEach executed");
}
@AfterAll
static void tear(){
System.out.println("@AfterAll executed");
}
}
输出:
@BeforeAll executed
@BeforeEach executed
======TEST ONE EXECUTED=======
@AfterEach executed
@BeforeEach executed
======TEST TWO EXECUTED=======
@AfterEach executed
@AfterAll executed
3.@Disabled 禁用测试
要在JUnit 5中禁用测试,您需要使用@Disabled注解。它与JUnit 4中的@Ignored注解等效。
@Disabled注解可以应用于测试类(禁用该类中的所有测试方法)或单独的测试方法。
@Disabled
@Test
void testCalcTwo()
{
System.out.println("======TEST TWO EXECUTED=======");
Assertions.assertEquals( 6 , Calculator.add(2, 4));
}
4.Assertions 断言
在任何测试方法中,我们需要确定它是通过还是失败。我们可以通过断言来完成。
断言有助于将测试的预期输出与实际输出进行比较。为了保持简单,JUnit Jupiter的所有断言都是org.junit.jupiter.Assertions类中的静态方法。
@Test
public void test()
{
//该测试将通过
Assertions.assertEquals(4, Calculator.add(2, 2));
//该测试将失败
Assertions.assertEquals(3, Calculator.add(2, 2), "Calculator.add(2, 2) test failed");
//该测试将失败
Supplier<String> messageSupplier = ()-> "Calculator.add(2, 2) test failed";
Assertions.assertEquals(3, Calculator.add(2, 2), messageSupplier);
}
要使测试失败,只需使用Assertions.fail()方法。
@Test
void testCase() {
Assertions.fail("not found good reason to pass");
}
5.Assumptions 假设
假设提供静态方法来支持基于假设的条件测试执行。如果假设失败,则测试将被中止。
假设通常用于在继续执行给定的测试方法没有意义的情况下使用。在测试报告中,这些测试将被标记为已通过。
假设类有三个具有许多重载形式的方法:
- assumeFalse():验证给定的假设是否为false。
- assumeTrue():验证给定的假设是否为true。
- assumingThat():执行提供的可执行文件,但仅在提供的假设有效时才执行。
@Test
void testOnDev()
{
System.setProperty("ENV", "DEV");
Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));
//剩余的测试将继续进行
}
@Test
void testOnProd()
{
System.setProperty("ENV", "PROD");
Assumptions.assumeTrue("DEV".equals(System.getProperty("ENV")));
//其余的测试将被中止。
}
以上所有注解和类都适用于JUnit测试生命周期。