1、 生命周期方法
测试方法:任何用@Test
、@RepeatedTest
、@ParameterizedTest
、@TestFactory
标记的方法。
生命周期方法:@BeforeAll
、@AfterAll
、@BeforeEach
、 @AfterEach
。
import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assumptions.assumeTrue; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; class StandardTests { @BeforeAll static void initAll() { System.out.println("@BeforeAll......."); } @BeforeEach void init() { System.out.println("@BeforeEach.........."); } @Test void succeedingTest() { System.out.println("succeedingTest.........."); } @Test void failingTest() { fail("a failing test"); } @AfterEach void tearDown() { System.out.println("@AfterEach........."); } @AfterAll static void tearDownAll() { System.out.println("@AfterAll........."); } }
输出结果:
输出: @BeforeAll....... @BeforeEach.......... succeedingTest.......... @AfterEach......... @BeforeEach.......... org.opentest4j.AssertionFailedError: a failing test at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:39) at org.junit.jupiter.api.Assertions.fail(Assertions.java:117) @AfterEach......... @AfterAll.........
2、显示名称
测试类和测试方法可以使用@DisplayName
设置名称,这些名称将显示在测试报告中以及测试运行程序和 IDE 中。
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @DisplayName("A special test case") class DisplayNameDemo { @Test @DisplayName("Custom test name containing spaces") void testWithDisplayNameContainingSpaces() { } @Test @DisplayName("╯°□°)╯") void testWithDisplayNameContainingSpecialCharacters() { } @Test @DisplayName("?") void testWithDisplayNameContainingEmoji() { } }
IDEA插件显示:
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @DisplayName("A special test case") class DisplayNameDemo { @Test @DisplayName("Custom test name containing spaces") void testWithDisplayNameContainingSpaces() { } @Test @DisplayName("╯°□°)╯") void testWithDisplayNameContainingSpecialCharacters() { } @Test @DisplayName("?") void testWithDisplayNameContainingEmoji() { } }
3、断言
Junit 5 附带了 JUnit 4 拥有的许多断言方法,并添加了一些非常适合与 Java 8 lambda 一起使用的断言方法。所有 JUnit Jupiter 断言都是类中的static
方法org.junit.jupiter.api.Assertions
。
import static java.time.Duration.ofMillis; import static java.time.Duration.ofMinutes; import java.util.concurrent.CountDownLatch; import example.domain.Person; import example.util.Calculator; import org.junit.jupiter.api.Test; class AssertionsDemo { private final Calculator calculator = new Calculator(); private final Person person = new Person("Jane", "Doe"); @Test void standardAssertions() { assertEquals(2, calculator.add(1, 1)); assertEquals(4, calculator.multiply(2, 2), "The optional failure message is now the last parameter"); assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- " + "to avoid constructing complex messages unnecessarily."); } @Test void exceptionTesting() { Exception exception = assertThrows(ArithmeticException.class, () -> calculator.divide(1, 0)); assertEquals("/ by zero", exception.getMessage()); } @Test void timeoutExceeded() { assertTimeout(ofMillis(10), () -> { Thread.sleep(100); }); } }
3.1、第三方断言库
尽管 JUnit 5 提供的断言工具足以满足许多测试场景,但有时需要或需要更多功能和附加功能(例如 匹配器)。在这种情况下,JUnit 团队建议使用第三方断言库,例如AssertJ
、Hamcrest
、Truth
等。因此开发人员可以自由使用他们选择的断言库。
以下示例演示了使用 Hamcrest 库的断言方法,只要将 Hamcrest 库添加到类路径中,就可以静态导入assertThat()
、is()
、 等方法equalTo()
,然后在测试中使用它们,如assertWithHamcrestMatcher()
下面的方法所示。
import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import example.util.Calculator; import org.junit.jupiter.api.Test; class HamcrestAssertionsDemo { private final Calculator calculator = new Calculator(); @Test void assertWithHamcrestMatcher() { assertThat(calculator.subtract(4, 1), is(equalTo(3))); } }
欢迎来到testingpai.com!
注册 关于