你好啊,我是大阳。

本文咱们探讨JUnit5测试生命周期,以及JUnit5与JUnit4的不同之处。

1. 测试阶段的生命周期

通常,一个测试类蕴含多个测试方法。JUnit 以生命周期的模式治理每个测试方法的执行。

在注解的帮忙下,测试用例的残缺生命周期能够分为三个阶段

  1. 设置:此阶段将测试基础设施配置到位。JUnit 提供类级别设置办法级别设置。通常,像数据库连贯这样的重对象是在类级别设置中创立的,而像测试对象这样的轻量对象是在办法级别设置的。
  2. 测试执行:在这个阶段,次要是测试执行和断言。执行后果将应用胜利或失败来示意。
  3. 清理:此阶段用于清理第一阶段的测试基础设施配置。就像配置一样,装配配置也分为类级别办法级别

在 JUnit 5 中,测试生命周期由四个次要注解驱动,即@BeforeAll、@BeforeEach、@AfterEach和@AfterAll。除此之外,每个测试方法都必须应用@Test注解进行标记。如图(应用drawIO绘制)

如上所示,在测试生命周期中,咱们次要须要应用带注解的办法来装载和卸载测试运行的测试环境或测试数据。

  • JUnit 在默认状况下,为每个测试方法创立一个新的测试实例。
  • @BeforeAll@AfterAll 正文,应该在整个测试执行周期中只调用一次。所以必须申明它们static
  • @BeforeEach@AfterEach为每个测试实例调用,所以它们不应该是static.
  • 如果有多个办法应用雷同的注解进行正文(例如两个办法应用@BeforeAll),则它们的执行程序是不确定的。
  • 要在 JUnit 5 中禁用测试,您须要应用@Disabled正文。它相当于 JUnit 4 的@Ignored注解。

    @Disabled正文能够利用于测试类(禁用该类中的所有测试方法)或单个测试方法。

上代码:

package cn.dayangshuo.junit5.tests;import cn.dayangshuo.junit5.Calculator;import org.junit.jupiter.api.*;/** * @author DAYANG */public class LifeCycleTests {    @BeforeAll    static void beforeAll() {        System.out.println("@BeforeAll 执行了");    }    @BeforeEach    void setupThis() {        System.out.println("@BeforeEach 执行了");    }    @Tag("DEV")    @DisplayName("生命周期测试")    @Test    void testCalcOne() {        System.out.println("======测试1执行了=======");        Assertions.assertEquals(4, Calculator.add(2, 2));    }    @Tag("PROD")    @Disabled    @Test    void testCalcTwo() {        System.out.println("======测试2执行了=======");        Assertions.assertEquals(6, Calculator.add(2, 4));    }    @AfterEach    void tearThis() {        System.out.println("@AfterEach 执行了");    }    @AfterAll    static void tear() {        System.out.println("@AfterAll 执行了");    }}

执行后果:

2. JUnit5与JUnit4注解比照

两个版本中的大多数正文都是雷同的,但也有一些不同。如下表:

特色JUnit 4六月 5
申明一个测试方法@Test@Test
在以后类中的所有测试方法之前执行@BeforeClass@BeforeAll
在以后类中的所有测试方法之后执行@AfterClass@AfterAll
在每个测试方法之前执行@Before@BeforeEach
在每个测试方法之后执行@After@AfterEach
禁用测试方法/类@Ignore@Disabled
测试工厂NAN@TestFactory
嵌套测试NAN@Nested
标记和过滤@Category@Tag
注册自定义扩大NAN@ExtendWith

接下来咱们将探讨JUnit5的断言、假如、测试套件和灵便的参数化测试性能。