IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> SpringBoot教程(13) 单元测试 JUnit5详解 常用注解案例 -> 正文阅读

[开发测试]SpringBoot教程(13) 单元测试 JUnit5详解 常用注解案例

一、前言

前几个月我跳槽,入职了一家软件外包公司。虽然薪资很低,但好在不用加班。项目是个外国的,给我最大的感觉就是老外很重视UT,覆盖率要80%以上。所以开发工作中写UT也是很重要的工作。

由于我之前待过的几家公司是民企,对UT并不重视,而且我个人也没有特地学UT。虽然从大学就接触JUnit了,但是只停留在会用@Test这个水平,现在是时候学习下JUnit了。因为目前新的SpringBoot用的JUnit5,所以直接看JUnit5,JUnit4和JUnit5有不少差异。

当然UT工具不仅仅是JUnit,SpringBoot还集成了mockito、hamcrest等工具。

1. 引入test包

现在的项目基本使用SpringBoot,所以直接引入spring-boot-starter-test,

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

二、注解

注解说明
@SpringBootTestSpringBoot的注解,修饰在类上,程序会找到@SpringBootApplication修饰的主启动类,创建ApplicationContext容器。
@ExtendWith(1)当你测试类用到Spring时
Spring boot 2.1.x之前,@SpringBootTest 需要配合@ExtendWith(SpringExtension.class)才能正常工作的。
Spring Boot 2.1.x之后,@SpringBootTest里包含了@ExtendWith(SpringExtension.class),就无需再加@ExtendWith注解。
(2)当你测试类不用Spring时
如果您只想涉及Mockito而不必涉及Spring,那么当您只想使用@Mock、@InjectMocks注解时,您就得使用@ExtendWith(MockitoExtension.class),因为它不会加载到很多不需要的Spring东西中。
@Test修饰在方法上,表示这个方法是一个测试方法
@ParameterizedTest修饰在方法上,进行参数化测试。对同一个测试方法,可以有多种入参对其测试,要定义一个参数源。
@RepeatedTest修饰在方法上,表示会自动重复测试这个方法,比如@RepeatedTest(10),会自动执行10次。
@DisplayName修饰在类或者方法上,指定测试方法的展示名称
@DisplayNameGeneration修饰在类上,展示名称生成器。设置一定规则生成方法的展示名称。
例如:方法if_it_is_zero()展示出的名字为if it is zero,去掉了其中的下划线。
@BeforeEach修饰在方法上,在每一个测试方法(所有@Test、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法)之前执行一次。
例如:一个测试类有2个测试方法testA()和testB(),还有一个@BeforeEach的方法,执行这个测试类,@BeforeEach的方法会在testA()之前执行一次,在testB()之前又执行一次。@BeforeEach的方法一共执行了2次。
@AfterEach修饰在方法上,和@BeforeEach对应,在每一个测试方法(所有@Test、@RepeatedTest、@ParameterizedTest或者@TestFactory注解的方法)之后执行一次。
@BeforeAll修饰在方法上,使用该注解的方法在当前整个测试类中所有的测试方法之前执行,每个测试类运行时只会执行一次。
@AfterAll修饰在方法上,与@BeforeAll对应,使用该注解的方法在当前测试类中所有测试方法都执行完毕后执行的,每个测试类运行时只会执行一次。
@Nested使用了这个注解的测试类表示这是一个嵌套的测试类,什么是嵌套测试类呢通俗的说就是在测试类中嵌套一个非静态的测试类(即内部类),并且可以嵌套多层。
@Tag修饰在类名或方法上,通过 @Tag 对测试类和方法进行打标签。
例如打上product表示只在生产环境执行。
@Disabled修饰在类名或方法上,表示不用执行它。
@Timeout修饰方法上,表示超过多少时间,方法还没有执行完,就判定测试失败。

三、测试案例

1. @BeforeAll、@AfterAll、@BeforeEach、@AfterEach

@ExtendWith(MockitoExtension.class)
public class DictTypeControllerTest {

    @BeforeAll
    static void testBeforeAll() {
        System.out.println("BeforeAll");
    }

    @BeforeEach
    void testBeforeEach() {
        System.out.println("BeforeEach");
    }

    @AfterEach
    void testAfterEach() {
        System.out.println("AfterEach");
    }

    @Test
    @DisplayName("方法A")
    void testA() {
        System.out.println("testA");
    }


    @Test
    @DisplayName("方法B")
    void testB() {
        System.out.println("testB");
    }

    @Test
    @DisplayName("方法C")
    @Disabled
    void testC() {
        System.out.println("testC");
    }

    @AfterAll
    static void testAfterAll() {
        System.out.println("AfterAll");
    }
}

在这里插入图片描述

2. @ParameterizedTest

@ExtendWith(MockitoExtension.class)
public class ParameterizedAnnoTest {

    @ParameterizedTest
    @MethodSource("getParams")
    void testAdd(int a, int b) {
        System.out.println(a + b);
    }

    private static Stream<Arguments> getParams() {
        return Stream.of(
                Arguments.of(1, 2),
                Arguments.of(3, 2)
        );
    }
}

3. RepeatedTest

@ExtendWith(MockitoExtension.class)
public class RepeatedAnnoTest {
    
    @RepeatedTest(3)
    @DisplayName("方法A")
    void testA() {
        System.out.println("testA");
    }
}

结果显示执行了3次

testA
testA
testA

如果@Test和@RepeatedTest(3)同时都修饰了方法,那么会叠加,总执行4次。

@ExtendWith(MockitoExtension.class)
public class RepeatedAnnoTest {
	
	//这里多了个@Test
    @Test
    @RepeatedTest(3)
    @DisplayName("方法A")
    void testA() {
        System.out.println("testA");
    }
}

结果显示执行了4次

testA
testA
testA
testA
  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:43:15  更:2022-04-01 23:44:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:20:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码