Spring Boot 2.2.0 以后的版本开始引入 JUnit 5 作为单元测试默认库
JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入。
JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部 包含了一个测试引擎,用于在Junit Platform上运行。
JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎。 SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖,如果需要继续兼容junit4需要自行引入vintage
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
JUnit5常用注解
● @Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试 ● @ParameterizedTest :表示方法是参数化测试 , 与 @ValueSource 共同使用 ● @RepeatedTest :表示方法可重复执行,循环执行次数 ● @DisplayName :为测试类或者测试方法设置展示名称 ● @BeforeEach :表示在每个单元测试之前执行 ● @AfterEach :表示在每个单元测试之后执行 ● @BeforeAll :表示在所有单元测试之前执行 ● @AfterAll :表示在所有单元测试之后执行 ● @Tag :表示单元测试类别,类似于JUnit4中的@Categories ● @Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore ● @Timeout :表示测试方法运行如果超过了指定时间将会返回错误
@DisplayName("测试类")
@SpringBootTest
class SpringbootJunitApplicationTests {
@Test
@DisplayName("第一次测试")
@RepeatedTest(10)
void contextLoads() {
System.out.println("==================执行了====================");
}
@ParameterizedTest
@DisplayName("第二次测试")
@ValueSource(strings={"a","b","c"})
void test1(String val){
System.out.println("=========>>>"+val+"<<<============");
}
@BeforeEach
void tsetbeforeEach(){
System.out.println("=========>>>beforeEach<<<============");
}
@AfterEach
void tsetafterEach(){
System.out.println("=========>>>afterEach<<<============");
}
@BeforeAll
static void tsetbeforeAll(){
System.out.println("=========>>>beforeAll<<<============");
}
@AfterAll
static void tsetafterAll(){
System.out.println("=========>>>afterAll<<<============");
}
}
断言(assertions)
测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法
方法 | 说明 |
---|
assertEquals | 判断两个对象或两个原始类型是否相等 | assertNotEquals | 判断两个对象或两个原始类型是否不相等 | assertSame | 判断两个对象引用是否指向同一个对象 | assertNotSame | 判断两个对象引用是否指向不同的对象 | assertTrue | 判断给定的布尔值是否为 true | assertFalse | 判断给定的布尔值是否为 false | assertNull | 判断给定的对象引用是否为 null | assertNotNull | 判断给定的对象引用是否不为 null | assertArrayEquals | 判断两个对象或原始类型的数组是否相等 | assertAll | 组合断言接受多个函数式接口的实例作为要验证的断言 |
@Test
@DisplayName("简单的断言")
public void simple() {
assertFalse(1 > 2);
assertTrue(1 < 2);
assertNull("123");
}
组合断言
@Test
@DisplayName("组合断言")
public void test3() {
assertAll("Math",()->assertEquals(2,1+1),
()->assertTrue(true),
()->assertNotEquals(1,2));
}
异常断言
@Test
@DisplayName("异常断言")
public void test4() {
Assertions.assertThrows(
ArithmeticException.class,
() -> System.out.println(1 % 0));
}
超时断言
@Test
@DisplayName("超时断言")
public void test5() {
Assertions.assertTimeout(Duration.ofMillis(1000),
() -> Thread.sleep(500));
}
直接失败
通过 fail 方法直接使得测试失败
@Test
@DisplayName("fail")
public void test6() {
fail("This should fail");
}
前置条件 不同之处 : 不满足的断言会使得测试方法失败, 不满足的前置条件只会使得测试方法的执行终止.
前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。
@DisplayName("JunitTest")
public class JunitTest {
private final String environment = "dev";
@Test
@DisplayName("前置条件测试")
public void assumeThenDo() {
assumingThat(
Objects.equals(this.environment, "test"),
() -> System.out.println("in dev")
);
}
}
|