详解自动化之单元测试工具Junit
目录
1.注解
1.1 @Test
1.2 @BeforeEach
1.3 @BeforeAll
1.4 @AfterEach
1.5 @AfterAll
2. 用例的执行顺序
通过 @order() 注解来排序
3. 参数化
3.1 单参数
3.2 多参数
3.3 多参数(从第三方csv文件读取数据源)
3.4 动态参数@ParameterizedTest + @MethodSource()
4. 测试套件
4.1 指定类来运行实例@Suite + @SelectClasses
4.2 指定包名来运行包下所有测试用例
5. 断言 Assertions类
5.1 断言匹配/不匹配Assertions.assertEquals()
5.2 断言结果为真/假Assertions.assertTrue()
5.3 断言结果为空/非空Assertions.assertNull()
自动化就是 selenium 脚本来实现的,junit 是 java 的单元测试工具,只不过在实现自动化的时候需要借用一下 junit 库里面提供的一些注解
注:博主的版本为 Junit5,支持的 Java 版本最低要为 8
添加依赖:
<dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope>
</dependency>
1.注解
1.1 @Test
@Test 表示当前方法为测试方法,执行这个类的时候会自动执行这个注释下的所有方法
public class JunitTest {@Test//表示当前方法是测试方法,执行这个类时会自动执行这个类下的所有带 @Test 注解的用例void baseZhujie(){System.out.println("这是一个测试方法");}@Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}
}

1.2 @BeforeEach
@BeforeEach 当前方法需要在每个用例执行之前都执行一遍
@BeforeEach// 表示当前方法需要在每个用例执行之前都执行一遍
// @Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.3 @BeforeAll
@BeforeAll 表示当前方法需要在所有用例执行之前执行一次
@Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
// @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.4 @AfterEach
@AfterEach 表示当前发给发需要在每个用例执行之后都执行一遍
@Testvoid baseZhujie(){System.out.println("这是一个测试方法");}@AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍
// @Testvoid aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

1.5 @AfterAll
@AfterAll 表示当前用例需要在每个用例执行之后执行一遍
@Testvoid baseZhujie(){System.out.println("这是一个测试方法");}// @BeforeAll// 表示当前方法需要在所有用例执行之前执行一次
// @AfterEach // 表示当前方法需要在每个用例执行之后都执行一遍@AfterAll// 当前方法需要在所有用例执行之后执行一次
// @Teststatic void aaa(){System.out.println("aaa");}@Testvoid bbb(){System.out.println("bbb");}

注意:
@BeforeAll 和 @AfterAll 修饰的方法需要用 static 进行修饰才能正常运行
2. 用例的执行顺序
在先前我一直以为用例的执行顺序是按照排列顺序来执行的:

对比这两个实例中的用例的执行顺序,我又产生了是不是按照方法名的字母顺序来执行的呢?
但是后面我才了解到官方网站是并没有说明用例默认的执行顺序的!!
通过 @order() 注解来排序
- 要先使用注解说明当前类下所有的用例需要使用 order 注解来进行排序
- 然后通过 Order 来指定用例的具体执行顺序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)// 通过 order 来排序
public class JunitTest {@Order(1)@Testvoid editloginTest(){System.out.println("loginTest");}@Order(3)@Testvoid AindexTest(){System.out.println("indexTest");}@Order(2)@Testvoid editTest(){System.out.println("editTest");}
}


3. 参数化
目的:尽可能的用一个用例来模拟多个用户的行为
3.1 单参数
@ParameterzedTest + @ValueSource(数据类型方法 = {参数1,参数2,参数3,…})
//声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@ValueSource(strings = {"lucky","mary","tom"})void methodPramsTest(String username){System.out.println("name:" + username );}

3.2 多参数
@parameterizedTest + @CsvSource({“”, “”, '", …}) 每个双引号就是一组测试用例
//声明该方法为参数化方法@ParameterizedTest//参数来源--单参数@CsvSource({"张三,123","李四,123","王五,123"})//多参数(从注解中手动编写数据源)void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}

3.3 多参数(从第三方csv文件读取数据源)
@ParameterizedTest + @CsvFileSource(files = “文件路径+名字”)
这里的这个 csv 文件,不要直接改后缀生成,要用系统自带的 Excel 工具,来打开和编辑 csv 文件

这里出现乱码的情况就是因为没有使用电脑系统自带的Excel来编辑

3.4 动态参数@ParameterizedTest + @MethodSource()
@ParameterizedTest + @MethodSource("方法名")
@ParameterizedTest@MethodSource("paramSupport")void methodPramsTest(String username,int age){System.out.println("name:" + username + " age:" + age);}static Stream<Arguments> paramSupport() throws InterruptedException {//构造动态参数String[] arr = new String[5];for (int i = 0; i < arr.length; i++) {Thread.sleep(500);arr[i] = System.currentTimeMillis() + "";}return Stream.of(Arguments.arguments(arr[0],10),Arguments.arguments(arr[1],14),Arguments.arguments(arr[2],13),Arguments.arguments(arr[3],12),Arguments.arguments(arr[4],11));}


注意:当@MethodSource不指定数据源时,会自动寻找与用例方法名相同的静态方法

4. 测试套件
当我们需要测试多个类中的用例时,如果一个类一个类的去运行,那是非常耗时耗力的,
如果我们能够同时运行多个类就很好,所以可以使用测试套件来同时运行多个测试类

4.1 指定类来运行实例@Suite + @SelectClasses
//标识为测试套件类,而不是测试类
@Suite
@SelectClasses({aaa.class,bbb.class,ccc.class})//指定类
public class runSuite {}

注意:想要用例被运行,用例必须要被 @Test 修饰
4.2 指定包名来运行包下所有测试用例
//标识为测试套件类,而不是测试类
@Suite
@SelectPackages("com.junit1121")//指定包名运行包下所有用例
public class runSuite {}

但是我们的运行结果为:

在这里类 aaa,bbb,ccc 中的用例都没有正常运行
那是因为:
如果使用包名来指定运行的范围,那么该包下来所有的测试类的命名需要以Test/Tests结尾(T必须要大写)
5. 断言 Assertions类
5.1 断言匹配/不匹配Assertions.assertEquals()
断言匹配:Assertions.assertEquals(期待得到对象,实际得到)
断言不匹配:Assertions.assertNotEquals(期待得到对象,实际得到)
@Testvoid TestBefo(){ChromeDriver driver = new ChromeDriver();driver.get("https://www.baidu.com");String test = driver.findElement(By.cssSelector("#su")).getAttribute("value");//百度一下// 假如这里获取到的值不是“百度一下”而是“搜狐一下”这就是一个bugSystem.out.println(test);// 断言// 断言匹配/不匹配Assertions.assertEquals("搜狐一下",test);driver.quit();}

5.2 断言结果为真/假Assertions.assertTrue()
断言结果为真:Assertions.assertTrue()
断言结果为假:Assertions.assertFalse()
@Testvoid ddd(){// 断言结果为真/假
// Assertions.assertTrue(1==1);Assertions.assertFalse(1==0);}
5.3 断言结果为空/非空Assertions.assertNull()
断言结果为空:Assertions.assertNull()
断言结果为非空:Assertions.assertNotNull()
@Test
void ggg() {String aaa = null;Assertions.assertNull(aaa);//通过
}
@Test
void hhh() {Assertions.assertNotNull("你好");//通过
}
相关文章:
详解自动化之单元测试工具Junit
目录 1.注解 1.1 Test 1.2 BeforeEach 1.3 BeforeAll 1.4 AfterEach 1.5 AfterAll 2. 用例的执行顺序 通过 order() 注解来排序 3. 参数化 3.1 单参数 3.2 多参数 3.3 多参数(从第三方csv文件读取数据源) 3.4 动态参数ParameterizedTest MethodSource() 4. 测试…...
超声波雪深传感器冬季里的科技魔法
在冬季的某个清晨,当你打开大门,被厚厚的积雪覆盖的大地映入眼帘,你是否曾想过,这片雪地的深度是多少?它又如何影响着我们的生活和环境?今天,我们将为你揭开这个谜团,介绍一款神秘的…...
2023年【熔化焊接与热切割】免费试题及熔化焊接与热切割模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 熔化焊接与热切割免费试题是安全生产模拟考试一点通生成的,熔化焊接与热切割证模拟考试题库是根据熔化焊接与热切割最新版教材汇编出熔化焊接与热切割仿真模拟考试。2023年【熔化焊接与热切割】免费试题及…...
【数据结构】—搜索二叉树(C++实现,超详细!)
🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:消えてしまいそうです—真夜中 1:15━━━━━━️💟──────── 4:18 🔄 ◀️ ⏸ ▶️…...
机器人算法—ROS TF坐标变换
1.TF基本概念 (1)什么是TF? TF是Transformations Frames的缩写。在ROS中,是一个工具包,提供了坐标转换等方面的功能。 tf工具包,底层实现采用的是一种树状数据结构,根据时间缓冲并维护多个参考…...
路由VRRP配置例子
拓朴如下: 主要配置如下: [R1] interface GigabitEthernet0/0/0ip address 10.1.1.1 255.255.255.0 vrrp vrid 1 virtual-ip 10.1.1.254vrrp vrid 1 priority 200vrrp vrid 1 preempt-mode timer delay 20 # interface GigabitEthernet0/0/1ip address …...
OpenGL 绘制点与三角形(Qt)
文章目录 一、简介二、实现代码三、实现效果一、简介 这里对OpenGL中点与三角形相关绘制操作进行封装,方便后续点云数据与模型数据的渲染。 二、实现代码 这里我们先创建一个基类Drawable,后续的点、线、面等,均会继承该类: Drawable.h #ifndef DRAWABLE_H #define DRAWABL…...
究竟什么是阻塞与非阻塞、同步与异步
文章目录 前言阻塞与非阻塞同步与异步复杂的网络IO真正的异步IOIO分类与示例总结 前言 这几个名词在程序开发时经常听到,但是突然问起来各个词的含义一时间还真是说不清楚,貌似这几个词都是翻译过来的,每个人的解释都不太一样,我…...
Openlayer【三】—— 绘制多边形GeoJson边界绘制
1.1、绘制多边形 在绘制多边形和前面绘制线有异曲同工之妙,多边形本质上就是由多个点组成的线然后连接组成的面,这个面就是最终的结果,那么这里使用到的是Polygon对象,而传给这个对象的值也是多个坐标,坐标会一个个的…...
用SOLIDWORKS画个高尔夫球,看似简单的建模却大有学问
SOLIDWORKS软件提供了大量的建模功能,如果工程师能灵活使用这些功能,就可以绘制得到各式各样的模型,我们尝试使用SOLIDWORKS绘制高尔夫球模型,如下图所示。 为什么选用solid works进行建模? solid works是一款功能强大…...
Linux:Network: ARP被动删除的一个情况
今天看到Linux内核里arp代码相关的一个函数,让人想起来很久之前掉进去的一个坑。 说产品的实现里,会存放一个dummy的neighbor(arp记录)在系统里,然后根据这个dummy的记录做一些特殊的处理。 但是当时根本就不知道这个记录的存在,也就无从谈起说要在做设计时考虑它的存在。…...
『接口测试干货』| Newman+Postman接口自动化测试完整过程
『接口测试干货』| NewmanPostman接口自动化测试完整过程 1 Newman简介2 如何安装Newman?2.1 安装NodeJs2.2 安装Newman2.2 解决Newman不是内部命令 3 Newman使用3.1 Newman如何运行集合?3.2 如何查看帮助文档?3.3 环境变量设置3.4 关于全局变…...
根据商品链接获取拼多多商品详情数据接口|拼多多商品详情价格数据接口|拼多多API接口
拼多多,作为中国最大的社交电商之一,为卖家提供了丰富的商品详情接口。这些接口可以帮助卖家快速获取商品信息,提高销售效率。本文将详细介绍如何使用拼多多商品详情接口,以及它的优势和注意事项。 一、拼多多商品详情接口概述 …...
KaiwuDB 监控组件及辅助 SQL 调优介绍
一、介绍 KaiwuDB 具备完善的行为数据采集功能,此功能要求 KaiwuDB 数据库系统 C/E/T 端不同进程的不同维度的指标采集功能十分完善;在不同进程完成指标采集后,会通过 Opentelemetry 和 Collector 将指标存入 Prometheus,以便查找…...
双11再创新高!家电行业如何通过矩阵管理,赋能品牌增长?
双11大促已落下帷幕,虽然今年不再战报满天飞,但从公布的数据来看,家电行业整体表现不俗。 根据抖音电商品牌业务发布的收官战报,家电行业创造了成交新纪录,整体同比增长125%。快手官方数据显示,消电家居行业…...
苏东坡最经典的诗词
苏东坡最经典的诗词_诗词_百度汉语 水调歌头明月几时有 [作者] 苏轼 [朝代] 宋 丙辰中秋,欢饮达旦,大醉,作此篇,兼怀子由。明月几时有?把酒问青天。不知天上宫阙,今夕是何年。我欲乘风归去,又…...
iterator遍历赋值
在Java中,迭代器(Iterator)是用于遍历集合的对象。它提供了一种顺序访问集合元素的方式,但是不能直接用于给特定索引赋值。 迭代器只能用于遍历集合并访问集合中的元素,而不能通过迭代器来修改集合元素的值。如果你想…...
【从删库到跑路】MySQL数据库 — E-R图 | 关系模型
🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 文章目录 🌹简述什么是E-R图⭐核心概念 🌹E-R图…...
网工内推 | 美的、得力集团,包吃包住,IE认证优先,14薪
01 美的 招聘岗位:网络工程师 职责描述: 1.负责IT网络设备、IDC机房的日常维护巡检、监控和管理; 2.负责路由、交换、防火墙、无线控制器、AP等网络设备的开通、调整、优化升级; 3.负责公司OT、IT网络规划,项目实施以…...
java springboot在测试类中构建虚拟MVC环境并发送请求
好 上文java springboot在测试类中启动一个web环境我们在测试类中搭了一个web环境 那么 下面就要想办法弄一个接口的测试 这边 我们还是要在controller包下去创建一个 controller类 写一个访问接口 这里 我创建一个 TestWeb.java 这里 我们编写代码如下 package com.example.…...
Phi-3-mini-4k-instruct-gguf部署教程:基于Docker镜像的vLLM服务启动与健康检查
Phi-3-mini-4k-instruct-gguf部署教程:基于Docker镜像的vLLM服务启动与健康检查 1. 准备工作与环境搭建 1.1 了解Phi-3-mini-4k-instruct模型 Phi-3-Mini-4K-Instruct是一个38亿参数的轻量级开源模型,采用GGUF格式提供。这个模型经过Phi-3数据集训练&…...
AI辅助编程提升代码质量的实践指南
1. 代码质量提升的AI实践指南在程序员群体里有个心照不宣的事实:我们80%的工作时间都在和前人写的烂代码搏斗——其中有不少还是自己三个月前写的。代码质量就像房间里的空气,平时没人注意,一旦出问题所有人都要窒息。最近两年,AI…...
DLSS Swapper深度解析:如何通过注册表管理实现游戏性能调优
DLSS Swapper深度解析:如何通过注册表管理实现游戏性能调优 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 当你在游戏中启用DLSS技术时,是否曾好奇过它到底在后台做了些什么?为什么…...
城通网盘解析器:3分钟掌握高速下载的终极秘籍
城通网盘解析器:3分钟掌握高速下载的终极秘籍 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载速度慢、广告多而烦恼吗?城通网盘解析器正是解决这些问题的利器…...
量子基准测试:跨平台评估与模块化实践
1. 量子基准测试的核心价值与挑战量子计算机的性能评估与传统计算机有着本质区别。在经典计算中,我们习惯用每秒浮点运算次数(FLOPS)或指令吞吐量来衡量性能。但量子计算机的"性能"是一个多维度的概念,需要同时考虑计算精度、噪声抗性、资源消…...
三环境零停机!Dokploy部署流水线从开发到生产全攻略
三环境零停机!Dokploy部署流水线从开发到生产全攻略 【免费下载链接】dokploy Open Source Alternative to Vercel, Netlify and Heroku. 项目地址: https://gitcode.com/GitHub_Trending/do/dokploy Dokploy 是一款开源的部署平台,作为 Vercel、…...
Windows 11/10 空间音效二选一:免费 Sonic 还是付费 Dolby Atmos?实测对比帮你避坑
Windows空间音效实战指南:Sonic与Dolby Atmos的深度对比与场景化选择 刚入手一副千元级游戏耳机的张伟,在Windows 11的声音设置里发现了两个陌生的选项——Windows Sonic和Dolby Atmos。这位《赛博朋克2077》的忠实玩家很快发现,不同的音效设…...
别再为y+发愁了!Fluent新手必看:不同湍流模型的近壁面处理到底怎么选?
Fluent湍流模型近壁面处理实战指南:从理论到一键配置 在计算流体力学(CFD)领域,湍流模拟的准确性很大程度上取决于近壁面处理的正确选择。许多Fluent初学者在面对Standard Wall Functions、Enhanced Wall Treatment、Menter-Lechner等选项时,…...
别再死记硬背遗传算法了!用Python实战POX/JBX交叉,搞定流水车间调度
用Python实战遗传算法:POX/JBX交叉算子解决流水车间调度问题 每次看到遗传算法的理论推导都头大?论文里的数学公式让人望而生畏?今天我们就用Python代码,手把手带你实现POX和JBX这两种经典交叉算子,解决实际的流水车间…...
Windows上Python subprocess报错FileNotFoundError?别慌,这5个排查步骤帮你搞定
Windows上Python subprocess报错FileNotFoundError?5个实战排查技巧 最近在Windows系统调试Python脚本时,突然遇到FileNotFoundError: [WinError 2]错误,让人一头雾水。这个错误看似简单,但背后可能隐藏着多种Windows特有的陷阱。…...
