>

单元测试@TestInstance

单元测试 JUnit5的变化

之前的 Junit4 声明一个类是 Spring Boot 测试类时,需要 @RunWith + @SpringBootTest ,而 Junit5 只需要 @SpringBootTest 就可以了,然后就能使用 SpringBoot 容器中的功能。

场景依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

Junit5 的功能注解都在 Jupiter 包下使用引入时要注意。

在 SpringBoot 整合 Junit5 后,测试类就有 Spring 的功能,添加 @Transactional 标注方法后,执行时会自动添加事务,测试完成后自动回滚。

Junit5 常用注解

跟 Junit4 有很大区别,可以去官网手册对照着看。

https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations

常见的几种注解:

**@Test 😗*表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试

**@ParameterizedTest 😗*表示方法是参数化测试,下方会有详细介绍

**@RepeatedTest 😗*表示方法可重复执行

**@DisplayName 😗*为测试类或者测试方法设置展示名称

@BeforeEach :表示在每个单元测试之前执行

@AfterEach :表示在每个单元测试之后执行

@BeforeAll :表示在所有单元测试之前执行

@AfterAll :表示在所有单元测试之后执行

**@Tag 😗*表示单元测试类别,类似于JUnit4中的@Categories

@Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore

@Timeout :表示测试方法运行如果超过了指定时间将会返回错误

**@ExtendWith 😗*为测试类或测试方法提供扩展类引用
————————————————
测试类中

复制代码
//设置类的展示别名
@DisplayName("测试类")
public class Junit5Test {

    @BeforeAll
    static void testBeforeAll() {
        System.out.println("测试类中所有测试方法执行前");
    }

    @AfterAll
    static void testAfterAll() {
        System.out.println("测试类中所有测试方法执行后");
    }

    @BeforeEach
    void testBeforeEach() {
        System.out.println("测试类中每个测试方法执行前");
    }

    @AfterEach
    void testAfterEach() {
        System.out.println("测试类中每个测试方法执行后");
    }

    @Test
    @Disabled
    void testDisabled() {
        System.out.println("不会被执行的类");
    }

    @Test
    @DisplayName("测试类01")
    void test01() {
        System.out.println("test01----->>>>>>");
    }

    @Test
    @Timeout(value = 500, unit = TimeUnit.MILLISECONDS)
    void testTimeOut() throws InterruptedException {
        Thread.sleep(500);
    }

}
复制代码

结果

使用注解 @Disabled 声明方法不用执行,他就不会执行。

使用注解 @TimeOut 声明方法,如果响应时间大于规定的时间就会出现异常

使用 @BeforeAll 、@AfterAll 两个注解时方法必须是 static ,或者类上面用 @TestInstance 注解修饰否则就有异常 @BeforeAll method 'void com.xl.mini.test.Junit5Test.testBeforeAll()' must be static unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).


@TestInstance的使用 / @BeforeAll必须为static方法?

摘自:https://www.cnblogs.com/wadelau/p/16932653.html

@BeforeAll

Junit5会在每个测试方法执行之前创建一个新的测试类实例,如果为每个测试方法都新创建实例,如何让@BeforeAll方法在只执行一侧的情况下,每个方法都可以使用到?
在@BeforeAll方法前加上static,那么这个方法会属于测试类而不是类的实例(面试:类的初始化过程)

@TestInstance

这个注解可以用来控制测试类实例的生命周期,这个注解有两种模式,LifeCycle.PER_METHOD (the default) 表示每个测试方法执行前创建新的测试类实例。Lifecycle.PER_CLASS,表示整个测试的过程中之创建一个测试类的实例。

如何在@BeforeAll方法前不加static

测试类加上@TestInstance(Lifecycle.PER_CLASS)即可。


 测试实例生命周期

摘自:https://blog.csdn.net/HD243608836/article/details/101000429

为了允许隔离执行单个的测试方法,并避免由于可变测试实例状态而产生的意外副作用,JUnit在执行每个测试方法之前创建每个测试类的新实例(请参阅下面的讲解,何为测试方法)。这个”per-method”测试实例生命周期是JUnit Jupiter中的默认行为,类似于JUnit以前的所有版本。

如果您希望JUnit Jupiter在同一个测试实例上执行所有测试方法,只需使用@TestInstance(Lifecycle.PER_CLASS)对您的测试类进行注解即可。当使用这种模式时,每个测试类将创建一个新的测试实例。因此,如果您的测试方法依赖于存储在实例变量中的状态,则可能需要在@BeforeEach@AfterEach方法中重置该状态。

“per-class”模式比默认的”per-method”模式有一些额外的好处。具体来说,使用”per-class”模式,可以在非静态方法和接口默认方法上声明@BeforeAll@AfterAll(否则@BeforeAll与@AfterAll必须是注解在static的方法上才能生效)。因此,”per-class”模式也可以在@Nested测试类中使用@BeforeAll@AfterAll方法。

 

posted @   字节悦动  阅读(463)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示

目录导航