当前位置: 首页 > news >正文

单元测试框架——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语言的单元测试框架&#xff0c;也是Java方向使用最广泛的单元测试框架。 在pom.xml中引入Junit5…...

centos 系列添加 yum 源

nginx 首先&#xff0c;安装 EPEL (Extra Packages for Enterprise Linux) 仓库。这是一个由 Fedora 项目提供的免费扩展软件包仓库&#xff0c;其中包含许多有用的软件包。 sudo yum install epel-release 接下来&#xff0c;导入 Nginx 的官方 GPG 密钥&#xff0c;以便验证安…...

[Hive高级特性与 DDL和DML语法]

目录 &#x1f387;前言: &#x1f387; HiveQL语言的基本语法&#xff0c;包括DDL和DML两个方面。 &#x1f387;DDL&#xff08;数据定义语言&#xff09;&#xff1a; &#x1f387;DML&#xff08;数据操作语言&#xff09;&#xff1a; &#x1f387; Hive高级特性 多种…...

Web服务器群集:Web基础与HTTP协议

目录 一、理论 1.Web基础 2.HTTP协议 二、实验 1.浏览本地HTML页面 三、总结 一、理论 1.Web基础 &#xff08;1&#xff09;域名和DNS ① 域名 网络是基于TCP/IP 协议进行通信和连接的&#xff0c;每一台主机都有一个唯一的标识&#xff08;固定的IP地 址&#xff0…...

cmd命令常用速记

cmd命令大全 常见的appwiz.cpl control calc 等&#xff0c;各类功能、设置、甚至是文件属性和系统版本&#xff0c;都可以通过命令的方式快速查看和操作&#xff0c;有助于我们的提高工作效率&#xff0c;具体见下文。 cmd命令:开始&#xff0d;>运行&#xff0d;>键入…...

Python网络爬虫基础进阶到实战教程

文章目录 认识网络爬虫HTML页面组成Requests模块get请求与实战效果图代码解析 Post请求与实战代码解析 发送JSON格式的POST请求使用代理服务器发送POST请求发送带文件的POST请求 Xpath解析XPath语法的规则集&#xff1a;XPath解析的代码案例及其详细讲解&#xff1a;使用XPath解…...

树莓派使用VNC、SSH、Xrdp等方式进行远程控制的方法和注意事项

下面来总结一下远程操控树莓派用到的三种方式及其注意事项&#xff0c;其实这三种方式对于所有的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注入

原创稿件征集 邮箱&#xff1a;eduantvsion.com QQ&#xff1a;3200599554 黑客与极客相关&#xff0c;互联网安全领域里 的热点话题 漏洞、技术相关的调查或分析 稿件通过并发布还能收获 200-800元不等的稿酬 更多详情&#xff0c;点我查看&#xff01; 简介 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&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13166 效果图如下&#xff1a; # cc-defineKeyboard #### 使用方法 使用方法 <!-- ref:唯一ref pas…...

VB+ACCESS超市管理系统设计(源代码+系统)

超市管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备,易使用等特点。经过分析,我们使用 MICROSOFT公司的 VISUAL BASI…...

【机器学习】十大算法之一 “神经网络”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…...

【MarkDown】CSDN Markdown之流程图graphflowchart详解

基本语法 flowchart/graph 流程图&#xff08;Flowcharts/Graphs&#xff09;是由节点 (几何形状) 和连接线 (箭头或线条)组成的. Mermaid代码定义了节点和连线的编码方式&#xff0c;并支持不同的箭头类型、多向箭头以及子图之间的任意链接。 警告 如果在流程图的节点使用e…...

Git下:Git命令使用-详细解读

目录 一、Git 安装 二、Git 配置 三、Git 工作流程 四、Git 工作区、暂存区和版本库 五、常用 Git 命令清单 1. 创建仓库 2. 增加/删除文件 3. 代码提交 4. 分支管理 5. 标签 6. 查看历史提交 7. 远程仓库同步 8. 撤销操作 六、Git 常用命令速查表 七、Git 电子…...

一条SQL语句的前世今生

文章目录 MySQL 基础架构分析语句分析查询语句更新语句 总结 本篇文章会分析下一个 SQL 语句在 MySQL 中的执行流程&#xff0c;包括 SQL 的查询在 MySQL 内部会怎么流转&#xff0c;SQL 语句的更新是怎么完成的。 MySQL 基础架构分析 下图是 MySQL 的一个简要架构图&#xff…...

各种架构比较

架构特点适用领域x86- 市场份额大&#xff0c;广泛支持和应用<br>- 成熟稳定&#xff0c;软件生态丰富<br>- 相对较低的功耗<br>- 适用于桌面、服务器和嵌入式系统等桌面应用、服务器、嵌入式系统x86-64- 支持 64 位操作系统和应用程序<br>- 更大的内存…...

scapy定制数据包探测主机

kali 输入scapy 进入界面 scapy定制ARP协议 输入ARP().display()显示ARP包的详细信息 输入sr1(ARP(pdst"192.168.133.2"))&#xff0c;向网关发送arp请求数据包 scapy定制PING包 输入IP().display()显示IP包的详细信息 输入ICMP().display()显示ICMP包的详细信息…...

【Java】Java核心要点总结70

文章目录 1. volatile 如何保证变量的可⻅性&#xff1f;2. volatile 可以保证原⼦性么&#xff1f;3. synchronized 关键字4. synchronized 和 volatile 的区别5. synchronized 和 ReentrantLock 的区别 1. volatile 如何保证变量的可⻅性&#xff1f; 在Java中&#xff0c;使…...

如何把一个 Git 仓库的分支加入另一个无关的 Git 仓库

文章目录 笔者需要将两个无关的 Git 仓库合并&#xff0c;也就是把一个 Git 仓库的分支加入另一个无关的 Git 仓库。笔者琢磨了一下之后就实现了。方法如下。 笔者的运行环境&#xff1a; git version 2.37.0.windows.1 TortoiseGit 2.11.0.0 IntelliJ IDEA 2023.1.1 (Ultima…...

深蓝学院C++基础与深度解析笔记 第 4 章 表达式

第 4 章 表达式 一、表达式基础 A、表达式: 由一到多个操作数组成&#xff0c;可以求值并 ( 通常会 ) 返回求值结果: #include <iostream> int main(){int x;x 3; }最基本的表达式&#xff1a;变量、字面值通常来说&#xff0c;表达式会包含操作符&#xff08;运算符…...

CLION开发STM32之W5500系列(一)

开篇说明 本系列适用于需要使单片机通过网口进行通信的开发。针对的是刚入门的同学们,也是个人的经验分享。本次使用到的芯片为stm32f103vet6(其他的也可以)本次使用的网口模块为W5500,其网关有示例程序均可以参考.本次使用Clion+OpenOCD+ARM-GCC 进行开发、烧录、编译.建议熟…...

Web3通过ganache运行起一个本地虚拟区块链

通过文章 Web3开发准备工作 手把手带你创建自己的 MetaMask 账号大家简单的对网络 有了个比较模糊的概念 不同的网络连接这不同的区块链 那么 我们就要搞清楚 我们切换不同的网络 我们的数字资产是不一样的 在这里 我们需要先安装一个插件工具 ganache 我们先在本地创建一个文…...

01 背包问题解析与代码 python 实现

01 背包问题解析与代码 问题定义 给定一堆具有不同重量 { w 1 , w 2 , ⋯ , w n } \{ w_1,w_2, \cdots,w_n \} {w1​,w2​,⋯,wn​}与价值 { v 1 , v 2 , ⋯ , v n } \{ v_1,v_2, \cdots,v_n \} {v1​,v2​,⋯,vn​}的背包&#xff08;knapsack&#xff09;&#xff0c;在总重…...

Vue实现前端视频展示列表及特征提取、笔记、删除、文件夹组织功能

Vue实现前端视频展示列表及特征提取、笔记、删除、文件夹组织功能 在前端展示上传的视频列表时&#xff0c;我们可以使用Element-UI中的Card组件来实现。同时&#xff0c;我们还可以添加一些功能&#xff0c;如缓存播放的视频、选择视频文本特征提取处理、写笔记、删除视频、组…...

多传感器时频信号处理:多通道非平稳数据的分析工具(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

数据结构算法 -分而治之算法

引言 坤坤是一个养鸡场的员工&#xff0c;他非常热爱他的工作&#xff0c;并且总是努力提高他的专业技能。有一天&#xff0c;养鸡场接到了一项任务&#xff1a;在短时间内处理一批大量的鸡。 这批鸡数量非常大&#xff0c;比普通的数量要多得多&#xff0c;坤坤意识到他们需…...

涉密信息系统口令管理制度

第一条 口令是涉密信息系统身份认证的基本防护措施&#xff0c;为保障 涉密信息系统的安全运行&#xff0c;规范网络用户及系统口令&#xff0c;特制定本制度。 第二条 具有口令功能的计算机、网络设备等计算机信息系统设 备&#xff0c;必须使用口令对用户的身份进行验证…...

UML与流程图

UML简介 UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;是一种用于软件系统分析与设计的标准化建模语言。它提供了一套丰富的图形符号和规则&#xff0c;可用于描述系统的结构、行为和交互&#xff0c;帮助开发人员、设计师和利益相关者之间进…...

音视频开发Level0: 入门级20~25k的工作

今天给大家分享一个音视频开发领域&#xff0c;入门级别的工作&#xff0c;要求不高。 主要做什么呢&#xff0c;行车记录仪&#xff0c;运动相机&#xff0c;各种拍摄器材包括医疗领域的喉镜啊&#xff0c;等等。 这种产品&#xff0c;招人的公司深圳最多&#xff0c;因为深…...

wordpress支持中文用户名/今日头条指数查询

"The secret of change is to focus all of your energy, not on fighting the old but on building the new.—— Dan Millman"请问视图是什么&#xff1f;视图相关语句有哪些&#xff1f;视图在什么场景下使用&#xff1f;夺命三连更多精彩文章请关注公众号『Pytho…...

招投标信息查询平台/seo排名点击报价

转载于:https://www.cnblogs.com/6DAN_HUST/archive/2012/08/19/2646715.html...

开发网页的公司/seo流程

并行计算无疑是.Net Framework平台的一大亮点&#xff0c;它自动的将一个任务分解&#xff0c;并以并发的形式执行&#xff0c;程序员不用操心各任务之间的协作和同步问题&#xff0c;这使得可以更加专注于业务的实现。 .NET 中的 TPL(Task Parallel Library)&#xff0c;中文…...

云南云南住房和城乡建设厅网站/网络热词2022

js 判断当前时间(或者所选时间)是否在某一时间范围,js 日期比较大小,js判断日期是否在区间内,js判断时间段是否在另外一个时间段内传入 beginDateStr (开始时间)&#xff0c; endDateStr(结束时间)废话不说直接上代码/*** [isDuringDate 比较当前时间是否在指定时间段内]* auth…...

做海报的免费网站/指数函数公式

http://blog.csdn.net/qianchenglenger/article/details/19332011 【opencv】图像细化 2014-02-17 21:03 5333人阅读 评论(14) 收藏 举报分类&#xff1a;opencv&#xff08;1&#xff09; 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 在我们进…...

织梦做企业网站/网站怎么收录到百度

刷完了数学专题&#xff0c;感觉思维量有些大&#xff0c;同时也对浮点数的运算有些接触。最重要的还是感觉有时候题目读起来有些吃力&#xff0c;需要借助中文翻译。 UVaOJ 113 这道题目是集训的时候第一天晚上的题目&#xff0c;据说可以double解决&#xff0c;当时没有AC。 …...