你好啊,我是大阳。
本文咱们探讨JUnit5测试生命周期,以及JUnit5与JUnit4的不同之处。
1. 测试阶段的生命周期
通常,一个测试类蕴含多个测试方法。JUnit 以生命周期的模式治理每个测试方法的执行。
在注解的帮忙下,测试用例的残缺生命周期能够分为三个阶段:
- 设置:此阶段将测试基础设施配置到位。JUnit 提供类级别设置和办法级别设置。通常,像数据库连贯这样的重对象是在类级别设置中创立的,而像测试对象这样的轻量对象是在办法级别设置的。
- 测试执行:在这个阶段,次要是测试执行和断言。执行后果将应用胜利或失败来示意。
- 清理:此阶段用于清理第一阶段的测试基础设施配置。就像配置一样,装配配置也分为类级别和办法级别。
在 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的断言、假如、测试套件和灵便的参数化测试性能。