百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

是时候升级你的Junit了,Junit5超详细实战

ztj100 2024-12-29 07:22 24 浏览 0 评论

每天进步一点点,关注我们哦,每天分享测试技术文章

本文章出自【码同学软件测试】

码同学公众号:自动化软件测试

码同学抖音号:小码哥聊软件测试

介绍

单元测试是软件开发流程中的重要环节,在软件工程理论里,越早发现bug,修复的成本越低。单元测试就属于测试人员/开发人员提前介入测试的一种手段,在代码还没正式提测前,提前对函数、类进行测试。但是很多时候往往因为项目周期比较紧张,从而忽略了单元测试,这样很多bug可能要到提测后,甚至就一直隐藏在代码中无法被发现。这就相当于在代码中埋藏了定时炸弹。因此单元测试是十分有必要的,它是保障代码执行的重要手段。


在Java领域里,最知名的单元测试框架就是Junit了。 JUnit 有着较长的发展历史和不断演进的丰富功能,备受大多数 Java 开发者的青睐。


最新的Junit版本是Junit5,这个版本可以说是 JUnit 单元测试框架的一次重大升级,首先需要 Java 8 以上的运行环境,虽然在旧版本 JDK 也能编译运行,但要完全使用 JUnit 5 功能, JDK 8 环境是必不可少的。


Junit5的主要特性有:

1. 提供全新的断言和测试注解,支持测试类内嵌

2. 更丰富的测试方式:支持动态测试,重复测试,参数化测试等

3. 实现了模块化,让测试执行和测试发现等不同模块解耦,减少依赖

4. 提供对 Java 8 的支持,如 Lambda 表达式,Sream API等


接下来,我们来学习下Junit的一些基本使用。


在工程中引入Junit依赖

<dependency>

<groupId>org.junit.jupiter</groupId>

<artifactId>junit-jupiter-engine</artifactId>

<version>5.5.2</version>

<scope>test</scope>

</dependency>


先写一个简单的测试类

@DisplayName("第1个测试类")public class DemoTest {
    @BeforeAll
    public static void init() {
        System.out.println("初始化数据");
    }


 @AfterAll
    public static void end() {
        System.out.println("清理数据");
    }

    @BeforeEach
    public void setup() {
        System.out.println("当前测试方法开始");
    }

    @AfterEach
    public void tearDown() {
        System.out.println("当前测试方法结束");
    }

    @DisplayName("第1个测试")
    @Test
    void test1() {
        System.out.println("第1个测试开始测试");
    }
@DisplayName("第2个测试")
    @Test
    void test2() {
        System.out.println("第2个测试开始测试");
    }}

几个常用的注解解释:

@DisplayName:测试类在测试报告中的名称,可以加在类上,也可以加在方法上

@BeforeAll和@AfterAll:它们定义了整个测试类在开始前以及结束时的操作,只能修饰静态方法,主要用于在测试过程中所需要的全局数据和外部资源的初始化和清理

@BeforeEach和@AfterEach:它们所标注的方法会在每个测试用例方法开始前和结束时执行,主要是负责该测试用例所需要的运行环境的准备和销毁。


在idea中运行测试类,看到控制台打印信息如下:


可以看到,在整个测试过程中,init函数和end函数只执行了一次,setup和tearDown函数在每次运行test1、test2函数前后分别执行。


重复性测试

在函数上添加@RepeatedTest注解可以指定重复执行的次数


@DisplayName("我的第三个测试-断言")
@RepeatedTest(3)
void test3() {
    System.out.println("我的第三个测试开始测试");
    Assertions.assertEquals(1, 1);
}


执行代码,可以看到test3函数连续执行了3次

免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦


断言

在Junit5中,提供了新的断言类Assertions,常见的api:

assertEquals:判断两个数据是否相等

assertNotEquals:判断两个数据是否不相等

assertNotNull:判断对象是否为空

示例:

@DisplayName("第4个测试")
@Test
void test4() {
    System.out.println("第4个测试开始测试");
    Assertions.assertEquals(1, 2);
}

执行测试,可以看到case执行失败


参数化测试

在Junit5中,对参数化提供了非常丰富的支持,比如固定数组、csv文件等。

首先在项目中添加参数化依赖包

<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.5.2</version>
<scope>test</scope>


</dependency>


数组化参数

在测试函数上添加参数化相关的注解即可,如:

@DisplayName("第5个测试-参数化测试-数字")@ParameterizedTest
@ValueSource(ints = {1,2,3})
void test5(int num) {
    System.out.println("当前数字为:" + num);
}

注解解释:

@ParameterizedTest:运行参数化测试

@ValueSource:参数来源为数组,支持各种基本数据类型的数组,如整型数组ints,字符串数组strings,chars等


按照上述配置,test5函数会运行3次,每次会把数组中的元素传入num值


CSV文件参数化

Junit支持将参数数据写入到一个csv文件中,然后在测试用例中读取csv文件中的数据。

在项目resource目录下新建一个csv文件,内部保存用户名和token的对应数据


@DisplayName("第8个测试-参数化测试-csv文件")
@ParameterizedTest
@CsvFileSource(resources = "/output.csv")
void test8(String name, String token) {
    System.out.println("当前姓名为:" + name + ",当前token为:" + token);
}

@CsvFileSource:指定csv文件的路径

在函数名上定义csv文件中每列对应的参数名,这样csv文件中有几行数据,test8函数就会运行几次,并且每次都会传入对应列的数据。


以上就是Junit常用的一些使用场景,更多Junit的使用方法,可以去Junit官网查看相关的示例。

免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试

本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

相关推荐

SpringBoot如何实现优雅的参数校验
SpringBoot如何实现优雅的参数校验

平常业务中肯定少不了校验,如果我们把大量的校验代码夹杂到业务中,肯定是不优雅的,对于一些简单的校验,我们可以使用java为我们提供的api进行处理,同时对于一些...

2025-05-11 19:46 ztj100

Java中的空指针怎么处理?

#暑期创作大赛#Java程序员工作中遇到最多的错误就是空指针异常,无论你多么细心,一不留神就从代码的某个地方冒出NullPointerException,令人头疼。...

一坨一坨 if/else 参数校验,被 SpringBoot 参数校验组件整干净了

来源:https://mp.weixin.qq.com/s/ZVOiT-_C3f-g7aj3760Q-g...

用了这两款插件,同事再也不说我代码写的烂了

同事:你的代码写的不行啊,不够规范啊。我:我写的代码怎么可能不规范,不要胡说。于是同事打开我的IDEA,安装了一个插件,然后执行了一下,规范不规范,看报告吧。这可怎么是好,这玩意竟然给我挑出来这么...

SpringBoot中6种拦截器使用场景

SpringBoot中6种拦截器使用场景,下面是思维导图详细总结一、拦截器基础...

用注解进行参数校验,spring validation介绍、使用、实现原理分析

springvalidation是什么在平时的需求开发中,经常会有参数校验的需求,比如一个接收用户注册请求的接口,要校验用户传入的用户名不能为空、用户名长度不超过20个字符、传入的手机号是合法的手机...

快速上手:SpringBoot自定义请求参数校验

作者:UncleChen来源:http://unclechen.github.io/最近在工作中遇到写一些API,这些API的请求参数非常多,嵌套也非常复杂,如果参数的校验代码全部都手动去实现,写起来...

分布式微服务架构组件

1、服务发现-Nacos服务发现、配置管理、服务治理及管理,同类产品还有ZooKeeper、Eureka、Consulhttps://nacos.io/zh-cn/docs/what-is-nacos...

优雅的参数校验,告别冗余if-else

一、参数校验简介...

Spring Boot断言深度指南:用断言机制为代码构筑健壮防线

在SpringBoot开发中,断言(Assert)如同代码的"体检医生",能在上线前精准捕捉业务逻辑漏洞。本文将结合企业级实践,解析如何通过断言机制实现代码自检、异常预警与性能优化三...

如何在项目中优雅的校验参数

本文看点前言验证数据是贯穿所有应用程序层(从表示层到持久层)的常见任务。通常在每一层实现相同的验证逻辑,这既费时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证...

SpingBoot项目使用@Validated和@Valid参数校验

一、什么是参数校验?我们在后端开发中,经常遇到的一个问题就是入参校验。简单来说就是对一个方法入参的参数进行校验,看是否符合我们的要求。比如入参要求是一个金额,你前端没做限制,用户随便过来一个负数,或者...

28个验证注解,通过业务案例让你精通Java数据校验(收藏篇)

在现代软件开发中,数据验证是确保应用程序健壮性和可靠性的关键环节。JavaBeanValidation(JSR380)作为一个功能强大的规范,为我们提供了一套全面的注解工具集,这些注解能够帮...

Springboot @NotBlank参数校验失效汇总

有时候明明一个微服务里的@Validated和@NotBlank用的好好的,但就是另一个里不能用,这时候问题是最不好排查的,下面列举了各种失效情况的汇总,供各位参考:1、版本问题springbo...

这可能是最全面的Spring面试八股文了

Spring是什么?Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。...

取消回复欢迎 发表评论: