详解自动化之单元测试工具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.…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
