单元测试框架——Junit5
文章目录
- Junit
- 1. 注解
- 2.断言
- 3.测试用例执行顺序
- 4.测试套件Suite
- 1) 指定多个类
- 2) 指定包
- 5. 参数化
- 1) 单参数
- 2) 多参数
- 3) 文件注入
- 6.动态参数
Junit
Junit是一个开源的用于Java语言的单元测试框架,也是Java方向使用最广泛的单元测试框架。
在pom.xml中引入Junit5相关依赖
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version><scope>test</scope>
</dependency>
<dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope>
</dependency>
1. 注解
@Test:表示一个方法/用例BeforeEach:表示被注解的方法在其它所有方法执行前都要执行一遍,也就是说其它方法有3个它就要执行3遍@BeforeAll:表示被注解的方法在其它方法之前执行(使用该注解的方法必须定义成static)@AfterEach:表示被注解的方法应该在其它方法执行后都要执行一遍,其它方法有4个就执行4遍@AfterAll:表示被注解的方法在其它方法后执行一遍就可以了(使用该注解的方法必须定义成static)
public class JunitDemo {private static ChromeOptions options;private static ChromeDriver driver;@BeforeAllpublic static void init() {options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");driver = new ChromeDriver(options);driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));//隐式等待两秒}@Testpublic void test1() {driver.get("https://www.baidu.com");driver.findElement(By.cssSelector("#kw")).sendKeys("Junit");driver.findElement(By.cssSelector("#su")).click();}@AfterAllpublic static void quit() throws InterruptedException {driver.quit();}
}
前后执行代码
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;public class JunitDemo2 {@BeforeEachpublic void BeforeEach() {System.out.println("@BeforeEach");}@AfterEachpublic void AfterEach() {System.out.println("@AfterEach");}@Testpublic void test1() {System.out.println("test1");}@Testpublic void test2() {System.out.println("test2");}@Testpublic void test3() {System.out.println("test3");}
}
运行结果
@BeforeEach
test1
@AfterEach@BeforeEach
test2
@AfterEach@BeforeEach
test3
@AfterEach
2.断言
很多编程语言都有断言C语言和Java都是有断言功能的,但断言一遍是出现在测试阶段,如果在生产环境使用断言,只要一旦触发断言程序就会立即终止。
在Junit中提供了一些断言方法
Assertions.assertEquals(预期值,实际值):如果预期和实际值不相同就会触发断言Assertions.assertNotEquals(预期值,实际值):如果预期值和实际值匹配就会触发断言
public class AssertDemo {private static ChromeOptions options;private static ChromeDriver driver;@BeforeAllpublic static void init() {options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");driver = new ChromeDriver(options);driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));}@Testpublic void test1() {driver.get("https://www.baidu.com");WebElement element = driver.findElement(By.cssSelector("#su"));String button = element.getAttribute("value");Assertions.assertEquals("百度一下",button);}@AfterAllpublic static void quit() {driver.quit();}
}
Assertions.assertTrue():如果括号里的表达式值为False就会触发断言Assertions.assertFalse():如果括号里的表达式值为True就会触发断言Assertions.assertNull():如果括号里的表达式的值不为null就会触发断言Assertions.assertNotNull():如果括号里的表达式的值为null就会触发断言
3.测试用例执行顺序
Junit的默认执行顺序是不确定的,官网文档中也没有给出明确的执行顺序。但我们可以使用Junit里提供的方法来手动设置用例的执行顺序,文档中给出了很多的排序方法。
这里介绍方法的排序,通过@order注解来排序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)//标注当前类使用方法来进行排序
public class JunitOrderTest {@Test@Order(3)void test1() {System.out.println("aaa");}@Test@Order(2)void test2() {System.out.println("bbb");}@Test@Order(1)void test3() {System.out.println("ccc");}
}
运行结果
cccbbbaaa
4.测试套件Suite
1) 指定多个类
通过测试套件可以将多个类的测试用例一起执行,通过@Suite和@SelectClasses注解配合实现
/*** 指定类来添加到套件中执行*/
@Suite
@SelectClasses({JunitDemo.class,JunitDemo2.class})
public class RunAllSuite {@Testvoid test() {System.out.println("@Suite");}
}

运行结果

2) 指定包
指定包,添加到套件中执行,需要注意的是执行包下面所有Test命名的文件中的所有@Test注解的用例。
这里指定的是junit包下的Test命名的类
@Suite
@SelectPackages("junit")//指定包下所有以Test命名的类中所有被@Test注解的用例
public class runAllSuite {
}

5. 参数化
有的时候我们的测试方法需要传递参数,而有多个参数写多个方法又比较麻烦,所以需要使用Junit的参数化。通过@ParameterizedTest注解标注类型参数化。
1) 单参数
单参数通过@ValueSource注解来实现,@ValueSource(类型={参数1,参数2,…})
@ValueSource中支持的类型有:
- short
- byte
- int
- long
- float
- double
- char
- boolean
- Stirng
- Class
在对应的类型使用后面+s使用
public class ParameterTest {@ParameterizedTest@ValueSource(strings = {"张三","李四","王五"})void test1(String name) {System.out.println("name:"+name);}
}
运行结果
name:张三name:李四name:王五
2) 多参数
多参数使用@CsvSource注解,@CsvSource(value={“张三,18”,“李四,20”,…})
public class ParameterTest {/*** 多参数* @param name* @param age*/@ParameterizedTest@CsvSource(value = {"张三,18","李四,20","王五,25"})void test2(String name,Integer age) {System.out.println("name:"+name+"age:"+age);}
}
运行结果
name:张三name:李四name:王五
多参数可以指定分割符,通过delimiterString属性设置
public class ParameterTest {@ParameterizedTest@CsvSource(value = {"张三-18","李四-20","王五-25"},delimiterString = "-")void test3(String name,Integer age) {System.out.println("name:"+name+"age:"+age);}
}
如果参数里包含逗号就要使用单引号做转义字符
@ParameterizedTest@CsvSource(value = {"'张,三',18","李四,20","王五,25"})void test2(String name,Integer age) {System.out.println("name:"+name+"age:"+age);}
3) 文件注入
如果参数非常多,在代码中编写不太友好,就可以借助文件注入的方式来添加,通过@CsvFileSource来指定
指定读取resources目录
@ParameterizedTest
@CsvFileSource(resources = "/test.txt",delimiterString = " ") //指定文件中参数以空格分割
void test4(String name,int age) {System.out.println("name:"+name+"age:"+age);
}
test.txt文件内容
张三 18
李四 20
王五 25
赵六 30
指定读取本机文件
@ParameterizedTest@CsvFileSource(files = "C:\\Users\\HeHanYu\\Desktop\\code\\Java\\JavaCode\\spring\\ssm_blog_system\\src\\test\\java\\file\\test.txt",delimiterString = " ")void test5(String name,int age) {System.out.println("name:"+name+"age:"+age);}
6.动态参数
单参数
通过@MethodSource指定方法的返回值为动态参数,返回值可以是Stream流,List、Set等
public class ParameterTest {@ParameterizedTest@MethodSource("demo")void test6(String name) {System.out.println(name);}static Stream<String> demo() {return Stream.of("张三","李四");}static List<String> createV() {List<String> list = new ArrayList<>();list.add("张三");list.add("李四");list.add("王五");return list;}static Set<String> createValue() {Set<String> set = new HashSet<>();set.add("张三");set.add("李四");set.add("王五");return set;}
}
多参数
使用Arguments可以实现多参数
public class ParameterTest {@ParameterizedTest@MethodSource("multiparameter")void test7(String name,int age) {System.out.println(name+":"+age);}static Stream<Arguments> multiparameter() {return Stream.of(Arguments.arguments("张三",18),Arguments.arguments("李四",25));}
}相关文章:
单元测试框架——Junit5
文章目录 Junit1. 注解2.断言3.测试用例执行顺序4.测试套件Suite1) 指定多个类2) 指定包 5. 参数化1) 单参数2) 多参数3) 文件注入 6.动态参数 Junit Junit是一个开源的用于Java语言的单元测试框架,也是Java方向使用最广泛的单元测试框架。 在pom.xml中引入Junit5…...
centos 系列添加 yum 源
nginx 首先,安装 EPEL (Extra Packages for Enterprise Linux) 仓库。这是一个由 Fedora 项目提供的免费扩展软件包仓库,其中包含许多有用的软件包。 sudo yum install epel-release 接下来,导入 Nginx 的官方 GPG 密钥,以便验证安…...
[Hive高级特性与 DDL和DML语法]
目录 🎇前言: 🎇 HiveQL语言的基本语法,包括DDL和DML两个方面。 🎇DDL(数据定义语言): 🎇DML(数据操作语言): 🎇 Hive高级特性 多种…...
Web服务器群集:Web基础与HTTP协议
目录 一、理论 1.Web基础 2.HTTP协议 二、实验 1.浏览本地HTML页面 三、总结 一、理论 1.Web基础 (1)域名和DNS ① 域名 网络是基于TCP/IP 协议进行通信和连接的,每一台主机都有一个唯一的标识(固定的IP地 址࿰…...
cmd命令常用速记
cmd命令大全 常见的appwiz.cpl control calc 等,各类功能、设置、甚至是文件属性和系统版本,都可以通过命令的方式快速查看和操作,有助于我们的提高工作效率,具体见下文。 cmd命令:开始->运行->键入…...
Python网络爬虫基础进阶到实战教程
文章目录 认识网络爬虫HTML页面组成Requests模块get请求与实战效果图代码解析 Post请求与实战代码解析 发送JSON格式的POST请求使用代理服务器发送POST请求发送带文件的POST请求 Xpath解析XPath语法的规则集:XPath解析的代码案例及其详细讲解:使用XPath解…...
树莓派使用VNC、SSH、Xrdp等方式进行远程控制的方法和注意事项
下面来总结一下远程操控树莓派用到的三种方式及其注意事项,其实这三种方式对于所有的Linux系统来说都是适用的。 目录 一、ssh控制树莓派 1.开启 ssh服务方法一 2.开启 ssh服务方法二 二、VNC远程连接 三、xrdp远程连接 四、其他注意事项 一、ssh控制树莓派 S…...
C++ 第二弹封装-类和对象
目录 1.类的引入 2.类的定义方式 3.访问权限 4.封装 5.类也是作用域 6.类的实例化 7.如何求一个类的大小 8.this指针 9.默认成员函数 10.构造函数 11.析构函数 12.拷贝构造函数 13.赋值运算符重载 14.const的类成员 15初始化列表 16.static的类成员 17.友元 …...
浅析 GeoServer CVE-2023-25157 SQL注入
原创稿件征集 邮箱:eduantvsion.com QQ:3200599554 黑客与极客相关,互联网安全领域里 的热点话题 漏洞、技术相关的调查或分析 稿件通过并发布还能收获 200-800元不等的稿酬 更多详情,点我查看! 简介 GeoServer是一个开…...
1001router6-react
文章目录 1 一级路由2 Navigate3 NavLink 自定义高亮样式4 useRoutes()5 嵌套路由6 路由传参6.1 传递params参数6.2 传递search参数6.3 传递state参数 7 编程式导航7.1 路由跳转7.2 前进、后退 8 钩子函数8.1 useInRouterContext()8.2 useNavigationType()8.3 useOutlet()8.4 u…...
前端Vue自定义支付密码输入键盘Keyboard和支付设置输入框Input
前端Vue自定义支付密码输入键盘Keyboard和支付设置输入框Input, 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id13166 效果图如下: # cc-defineKeyboard #### 使用方法 使用方法 <!-- ref:唯一ref pas…...
VB+ACCESS超市管理系统设计(源代码+系统)
超市管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。经过分析,我们使用 MICROSOFT公司的 VISUAL BASI…...
【机器学习】十大算法之一 “神经网络”
作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…...
【MarkDown】CSDN Markdown之流程图graphflowchart详解
基本语法 flowchart/graph 流程图(Flowcharts/Graphs)是由节点 (几何形状) 和连接线 (箭头或线条)组成的. Mermaid代码定义了节点和连线的编码方式,并支持不同的箭头类型、多向箭头以及子图之间的任意链接。 警告 如果在流程图的节点使用e…...
Git下:Git命令使用-详细解读
目录 一、Git 安装 二、Git 配置 三、Git 工作流程 四、Git 工作区、暂存区和版本库 五、常用 Git 命令清单 1. 创建仓库 2. 增加/删除文件 3. 代码提交 4. 分支管理 5. 标签 6. 查看历史提交 7. 远程仓库同步 8. 撤销操作 六、Git 常用命令速查表 七、Git 电子…...
一条SQL语句的前世今生
文章目录 MySQL 基础架构分析语句分析查询语句更新语句 总结 本篇文章会分析下一个 SQL 语句在 MySQL 中的执行流程,包括 SQL 的查询在 MySQL 内部会怎么流转,SQL 语句的更新是怎么完成的。 MySQL 基础架构分析 下图是 MySQL 的一个简要架构图ÿ…...
各种架构比较
架构特点适用领域x86- 市场份额大,广泛支持和应用<br>- 成熟稳定,软件生态丰富<br>- 相对较低的功耗<br>- 适用于桌面、服务器和嵌入式系统等桌面应用、服务器、嵌入式系统x86-64- 支持 64 位操作系统和应用程序<br>- 更大的内存…...
scapy定制数据包探测主机
kali 输入scapy 进入界面 scapy定制ARP协议 输入ARP().display()显示ARP包的详细信息 输入sr1(ARP(pdst"192.168.133.2")),向网关发送arp请求数据包 scapy定制PING包 输入IP().display()显示IP包的详细信息 输入ICMP().display()显示ICMP包的详细信息…...
【Java】Java核心要点总结70
文章目录 1. volatile 如何保证变量的可⻅性?2. volatile 可以保证原⼦性么?3. synchronized 关键字4. synchronized 和 volatile 的区别5. synchronized 和 ReentrantLock 的区别 1. volatile 如何保证变量的可⻅性? 在Java中,使…...
如何把一个 Git 仓库的分支加入另一个无关的 Git 仓库
文章目录 笔者需要将两个无关的 Git 仓库合并,也就是把一个 Git 仓库的分支加入另一个无关的 Git 仓库。笔者琢磨了一下之后就实现了。方法如下。 笔者的运行环境: git version 2.37.0.windows.1 TortoiseGit 2.11.0.0 IntelliJ IDEA 2023.1.1 (Ultima…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
