JUnit5 学习笔记②-官方手册翻译+理解

2.2. 测试类和方法

测试类: 任何顶层类,静态成员类,或者至少包含一个测试类的@Nested class.

测试类必须不是抽象,以及有一个简单构造函数.

测试方法: 任何被与@Test,@RepeatedTest,@ParameterizedTest,@TestFactory, 或@TestTemplate直接声明实例方法.

生命周期方法: 任何被与@BeforeAll, @AfterAll, @BeforeEach, 或 @AfterEach直接声明方法.

测试方法和生命周期方法可以被局部声明在当前的测试类,继承超类,接口. 此外测试方法和生命周期方法必须不是抽象,也不能返回一个值.


! 测试类,方法和生命周期方法不要求public,但他们一定不是private


如下测试类证实方法的使用和所有支持的生命周期方法

A standard test class
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() {
  }
  @BeforeEach
  void init() {
  }
  @Test
  void succeedingTest() {
  }
  @Test
  void failingTest() {
  fail("a failing test");
  }
  @Test
  @Disabled("for demonstration purposes")
  void skippedTest() {
  // not executed
  }
  @Test
  void abortedTest() {
  assumeTrue("abc".contains("Z"));
  fail("test should have been aborted");
  }
  @AfterEach
  void tearDown() {
  }
  @AfterAll
  static void tearDownAll() {
  }
}

2.3.展示名称

测试类和测试方法能通过@DisplayName表明常用名称,可以空格,特殊字母,甚至是emoji. 它们将被测试启动器和IDEs展示在测试报告中.

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("🐎")//Win10,IDEA中需要使用微软输入法才可以展示emoji
  void testWithDisplayNameContainingEmoji() {
  }
}

 

2.3.1 展示名字生成器

JUnit Jupiter 支持常用的能通过@DisplayNameGeneration注解展示名字生成器配置。通过@DisplayName注解提供的值总是优先于DisplayNameGenerator

通过执行DisplayNameGenerator生成器能被创造,下列是Jupiter中的一些默认可选的DisplayNameGenerator

DisplayNameGenerator Behavior
Standard  匹配标准展示名字生成器在通常的位置
Simple  为方法移除拖拉的括号为无参
ReplaceUnderscores  把空格换成下划线
IndicativeSentences 通过链接测试的名字和随附的类生成完整的句子

2.3.2. 设置默认展示名字生成器

你能使用junit.jupiter.displayname.generator.default configuration parameter 去具体说明DisplayNameGenerator的你想默认使用的完全限定类名.如同通过@DisplayNameGeneration注解配置的展示名字生成器, 这个被支持的类必须执行DisplayNameGenerator的接口.默认展示名字生成器会被所有测试使用除非@DisplayNameGeneration注解出现在一个随附的测试类或测试接口. 通过@DisplayName注解提供的值总是优先于DisplayNameGenerator.

例如,为了使用ReplaceUnderscores默认展示名字生成器,你应该设置配置参数给相一致的完全限定类名.

与之类似,你能具体说明执行DisplayNameGenerator的任何常用类完全限定类名.

总而言之,测试类或方法的展示名称取决于下列优先规则:

  1. @DisplayName的注解的值,如果存在;
  2. 通过呼叫具体说明在@DisplayNameGeneration注解的DisplayNameGenerator,如果存在;
  3. 通过呼叫默认被配置参数配置的DisplayNameGenerator,如果存在;
  4. 通过呼叫 org.junit.jupiter.api.DisplayNameGenerator.Standard 

2.4. 断言

JUnit Jupiter来自于部分JUnit 4的断言方法和添加了一些能用在Java 8闭包.

所有JUnit Jupiter断言是静态方法在org.junit.jupiter.api.Assertions类.

手册示例略.(无法执行,需要Person,Calculator类)


! assertTimeoutPreemptively() 抢占式暂停

    与声明式暂停相反,Assertions中不同的assertTimeoutPreemptively()方法执行提供的executablesupplier类在一个不同的线程中(和调用代码).如果执行依赖于java.lang.ThreadLocalexecutablesupplier类中,这个行为会导致不良侧反应

一个常见的例子是Spring框架中的相互作用的测试支持.特别的,Spring的测试支持结合事务状况和当前的线程在测试方法被调用前. 因此,如果提供给assertTimeoutPreemptively()executablesupplier类调用参与到事务Spring-managed部件时,那些组件采取的动作不会随着test-managed事务回滚.相反地,这些行动会被投入到持久性存储器即使test-managed事务回滚

类似的副作用会在依赖于ThreadLocal存储器的其他框架中出现

2.4.1略

2.4.2略

 

posted @ 2021-07-09 16:22  Jason_Matrix  阅读(119)  评论(0)    收藏  举报