测开 (Junit 单元测试框架)
目录
了解 Junit
引入相关依赖
1、Junit注解
@Test
@BeforeEach、@BeforeAll
@AfterEach && @AfterAll
2、断言
1、Assertions - assertEquals 方法
2、Assertions - assertNotEquals 方法
3、Assertions - assertTrue && assertFalse方法
4、Assertions - assertNull && assertNotNull
小结
3、用例的执行顺序 - 方法排序( @Order 注解)
4、测试套件 - Suite
第一种方法:@Suite && @SelectClasses
第二种方法:@Suite && @SelectPackages
5、参数化
1、@ParameterizeTest(参数化) && @ValueSource(参数来源)
2、@ParameterizeTest(参数化)&& @CsvSource(参数列表)
3、@ParameterizeTest(参数化)&& @CsvFileSource(指定文件路径)
6、动态参数
@ParameterTest(参数化) && @MethodSource
现在,我们有了 selenium 基础语法 之后,只能说我们会写自动化。
但不是说:我们就能写自动化测试 。
而本文的重点:通过学习 Junit 基础,再加上前面的 selenium 框架,来实现自动化测试。
了解 Junit
Junit 是一个开源的 Java 语言的单元测试框架。
Junit 是 Java方向使用最广泛的单元测试框架。
使用 Java 的开发者都应当学习 Junit ,并且掌握单元测试的编写。
有了 Junit 之后,我们的自动化写起来就更漂亮了。
有的朋友可能就会有疑问:为什么有了 selenium 之后,还需要Junit?selenium 和 Junit 都是可以通过 Maven 来导入进来的包。
这两个工具包里面提供了 非常多的 API(方法 / 功能) 给我们使用。
让我们去实现 想要实现的自动化测试。
selenium 和 Junit 之间的关系,举个例子:
假如: 我们要让灯泡亮起来,selenium 就是灯泡,Junit 就是电源。
引入相关依赖
<!-- selenium 先关依赖--><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><!-- Junit 先关依赖--><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><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-reporting</artifactId><version>1.8.2</version><scope>test</scope></dependency>
1、Junit注解
@Test
将其与我们之前写的 selenium 代码 比较一下,就能发现 Junit 的好处了。
甚至我们可以一次性执行多个测试单元。
@BeforeEach、@BeforeAll
表示被注解的方法应该在其它方法之前被执行。
@BeforeEach:表示被注解的方法,在每个方法执行之前。都要执行一遍.
@BeforeAll:表示被注解的方法,在所有方法执行之前。只要执行一遍.
@AfterEach && @AfterAll
有 Before,那么就有After,不过分吧?
@AfterEach:在每个测试单元执行之后,都要执行一遍
@AfterAll:在所有测试单元都执行完之后,在最后执行一次。
2、断言
写自动化测试,测试结果分为两种:成功 和 失败。
就像我们前面写的测试来说
看起来很美好。
但是!查询的结果可能跟预期不相符,而我们只是将获取的数据进行输出。
至于结果和我们预期的结果是否一样,那就不得而知了。
更重要的是:当查询的结果和预期结果不一致时,它是不会报错的。
像这样的测试用例就没有起到测试的作用,只是单纯的获取打印信息而已。
等我们有了断言之后,就能对查询到的结果做出判断(测试操作)。这时候它才真正算是一个 自动化测试!
以前写的代码,只能算是 自动化,不算是测试。
1、Assertions - assertEquals 方法
校验 实际数据 是否与 期望值 相同
2、Assertions - assertNotEquals 方法
校验 实际数据 是否与 期望值 不相同
3、Assertions - assertTrue && assertFalse方法
assertTrue 方法 :条件为真通过测试,条件为假测试失败。
将等号换成 equals 即可。
assertFalse 方法 :条件为假通过测试,条件为真测试失败
4、Assertions - assertNull && assertNotNull
assertNull:如果条件为null,通过测试;反之,则不通过。
assertNotNull:如果条件不为null,测试通过;反之,则不通过。
小结
正是因为有了断言,我们的自动化才能带上 “测试” 两个字。
以前我们写的自动化代码【没有断言】对结果是没有标准的。
我们不知道什么样的结果才是正确的,是错误的。
有了断言,我们才知道什么样子的结果才是我们想要的结果。
3、用例的执行顺序 - 方法排序( @Order 注解)
我们先来看两个例子
通过上面的测试用例,我们知道 Junit 的执行顺序不是 “标准(从上往下)”的。
这里需要注意的是: Junit 的默认执行顺序是不确定的,而且官方文档也没有明确给出答案。Junit官方地址:https://junit.org/junit5/
有兴趣的,可以去看看
但是,我们仍可以使用 Junit里提供的方法【方法非常多】来 手动设置 用例的执行顺序。
1、方法的排序
2、标签的排序
3、类的排序
。。。。。
这里我们着重学习 方法排序 —— 通过 @Order 注解来排序
虽然说:Junit 是有 执行顺序的,但是容易翻车!
所以我们可以使用 @Order 注解来设置执行的顺序。
在此之前,我们需要引入一个注解 @TestMethodOrder
使用 @TestMethodOrder 注解 所提供的 @Order 注解 的目的就是:
为了保证测试用例执行的顺序,确保测试过程中按照人为预设的步骤执行得到预期的结果。【用例之间存在关联关系】
下面我们再通过 @Order 注解 来制定顺序
虽然这个例子举的不太好,但是意思get的到,就OK。
4、测试套件 - Suite
目前,我们一次最多启动一个类中的 测试单元。
现在我们想把 junittest 包中的所有测试类都执行起来,我们该怎么做呢?
这就需要借助到 测试套件了。
第一种方法:@Suite && @SelectClasses
@Suite【表示被注解的类是套件(类)】 && @SelectClasses【指定需要执行测试的类文件】
上面只是选择额一个类,下面我们来选择多个类文件。
虽然我们可以一次执行多个类文件中的 测试单元。
但是,还是存在一个致命问题:
如果我们想一次性执行 几十个类文件中的测试单元,那就太麻烦了(低效)。
第二种方法:@Suite && @SelectPackages
既然选择类文件的方式太低效了,那不如我们直接选择包。
我们可以看到有几个测试类没有被执行。
这是因为使用指定的包来添加套件的前提:
1、所有类文件的命名都要以 Test、Tests 结尾。
2、所有的测试单元都要使用 @Test 注解
5、参数化
我们前面写的测试单元(方法)都是不带参数的。
下面我们来写个示例,通过这个我们来了解参数化是什么。
那么我们该如何去写呢?
使用 @Parameterizetest 注解,标注方法类型为“参数化”.
在注明方法类型为参数化,同时需要强调参数的来源。
1、@ParameterizeTest(参数化) && @ValueSource(参数来源)
这里需要特别注意的是 @ValueSource 的使用。
下面我就来使用它们。【使用时候,在类型名称后面加上 s】
通过这两个注解,我们就能实现 参数化(批量测试)了。
我们可以发现 这两个测试方法是分开进行,而且都是只指定了一种数据类型【单参数】。
那么,如果我们想同时输出 name 和 i ,在一个方法里呢?【多参数】
2、@ParameterizeTest(参数化)&& @CsvSource(参数列表)
@CsvSource(value = {“张三,1”,“李四,2”,“王五,3”…})
如何你觉得 逗号分割参数 不明显。
我们还可以通过 @Csvsource 的 delimiterString 属性来指定。
但是!还存在一个问题:
在使用 逗号进行分割 的时候,如果其中一个双引号中的 参数里面也出现了一个逗号,那么此时运行就会报错。
解决方法:对于这样的参数,使用 单引号 单独 引起来,就可以了。
问题可不止一个哦~
试想一下:
如果参数个数一多,每个参数都像这么去写,那不得麻烦死。
我们可以通过借助文件注入的方式来添加:@Csvsource(指定文件路径)
3、@ParameterizeTest(参数化)&& @CsvFileSource(指定文件路径)
@CsvFileSource(resources = “当前项目下csv文件路径”)
当然,csv文件并不是一定要在 项目底下,在本地其它位置也是可以的
哦,对了,参数除了 String,其它的类型都必要传
6、动态参数
前面我们看到的参数,其实都是静态参数是写死了的。
哪怕参数个数很多,也改变不了的事实。
接下来,我们就来了解一下 动态参数 是怎么实现的。
@ParameterTest(参数化) && @MethodSource
@MethodSource( 字符串)
字符串参数: 给测试单元(方法)传递的数据 的 方法名。
简单来说:就是通过 一个方法 来向 测试单元 传递测试数据。
另外,还有一种传参方式:@MethodSource注解不表明数据源,它会去寻找同名的数据源(静态方法)
我们再来看传递多种类型参数是怎么写的。
相关文章:

测开 (Junit 单元测试框架)
目录 了解 Junit 引入相关依赖 1、Junit注解 Test BeforeEach、BeforeAll AfterEach && AfterAll 2、断言 1、Assertions - assertEquals 方法 2、Assertions - assertNotEquals 方法 3、Assertions - assertTrue && assertFalse方法 4、Assertions…...
ncurse编程指南
文章目录 0. 介绍1. Hello, Ncurse2. 初始化函数2.1 raw() 和 cbreak()2.2 echo()和noecho()2.3 keypad()2.4 halfdelay()2.5 初始化样例 3. 命名规范4. 输出函数4.1 addch()类函数4.2 printw()类函数4.3 addstr()类函数4.4 注意4.5 输出函数例子 5. 输入函数5.1 getch()5.2 sc…...
Graph U-Net Code【图分类】
1. main.py # GNet是需要用到的model net GNet(G_data.feat_dim, G_data.num_class, args) # graph, 特征维度,类别数,参数 trainer Trainer(args, net, G_data) #开始训练数据 # 正式开始训练数据 trainer.train()2. network.py class GNet(nn.Modul…...
PTA 秀恩爱分得快(树)
题目 古人云:秀恩爱,分得快。 互联网上每天都有大量人发布大量照片,我们通过分析这些照片,可以分析人与人之间的亲密度。如果一张照片上出现了 K 个人,这些人两两间的亲密度就被定义为 1/K。任意两个人如果同时出现在…...

文心一言4.0对比ChatGPT4.0有什么优势?
目录 总结 文心一言4.0的优势 文心一言4.0的劣势 免费分享使用工具 后话 生成式AI的困境 “不会问”“不会用”“不敢信” 为什么要出收费版本? 目前使用过国内的文心一言3.5和WPS AI,国外的ChatGPT4.0。 文心一言和其他国内产品相比࿰…...

美观且可以很方便自定义的MATLAB绘图颜色
函数介绍 主函数是draw_test,用于测试函数。 draw_h是函数,用于给Matlab提供美观且可以很方便自定义的绘图颜色。 draw_h函数介绍 这是一个带输入输出的函数,输入1/2/3,输出下面三种颜色库的配色,每种库均有五种颜色…...

基于jsp,ssm物流快递管理系统
开发工具:eclipse,jdk1.8 服务器:tomcat7.0 数据库:mysql5.7 技术: springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分,功能介绍如下: 一、用户(前台)功能: 用…...

陪诊系统|挂号陪护搭建二开陪诊师入驻就医小程序
我们的陪诊小程序拥有丰富多样的功能,旨在最大程度满足现代人的需求。首先,我们采用了智能排队系统,通过扫描二维码获取排号信息,让您从繁琐的排队过程中解放出来。其次,我们提供了多种支付方式,不仅可以实…...

恒驰服务 | 华为云数据使能专家服务offering之大数据建设
恒驰大数据服务主要针对客户在进行智能数据迁移的过程中,存在业务停机、数据丢失、迁移周期紧张、运维成本高等问题,通过为客户提供迁移调研、方案设计、迁移实施、迁移验收等服务内容,支撑客户实现快速稳定上云,有效降低时间成本…...

轻量级狂雨小说cms系统源码 v1.5.2 基于ThinkPHP5.1+MySQL
轻量级狂雨小说cms系统源码 v1.5.2 基于ThinkPHP5.1MySQL的技术开发 狂雨小说cms提供一个轻量级小说网站解决方案,基于ThinkPHP5.1MySQL的技术开发。 KYXSCMS,灵活,方便,人性化设计简单易用是最大的特色,是快速架设小说类网站首选…...

Leetcode刷题详解——Pow(x, n)
1. 题目链接:50. Pow(x, n) 2. 题目描述: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2:…...

计算机毕业设计选题推荐-校园失物招领微信小程序/安卓APP-项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

人工智能基础_机器学习011_梯度下降概念_梯度下降步骤_函数与导函数求解最优解---人工智能工作笔记0051
然后我们来看一下梯度下降,这里先看一个叫 无约束最优化问题,,值得是从一个问题的所有可能的备选方案中选最优的方案, 我们的知道,我们的正态分布这里,正规的一个正态分布,还有我们的正规方程,他的这个x,是正规的,比如上面画的这个曲线,他的这个x,就是大于0的对吧,而现实生活…...

开放式耳机能保护听力吗,开放式耳机跟骨传导耳机哪个更好?
如果从严格意义上来讲的话,开放式耳机中的骨传导耳机是能保护听力,现如今的开放式耳机是一个统称,将所有不入耳的类目全部规划到一块。因此在开放式耳机中存在着一些耳机是只能够保持周边环境音,而不是保护听力的。 下面让我来给…...

【Qt之QLocale】使用
描述 QLocale类可以在多种语言之间进行数字和字符串的转换。 QLocale类在构造函数中使用语言/国家对进行初始化,并提供类似于QString中的数字转字符串和字符串转数字的转换函数。 示例: QLocale egyptian(QLocale::Arabic, QLocale::Egypt);QString s1 …...

维修服务预约小程序的效果如何
生活服务中维修项目绝对是需求量很高的,如常见的保洁、管道疏通、数码维修、安装、便民服务等,可以说每天都有生意,而对相关维修店企业来说,如何获得更多生意很重要。 接下来让我们看看通过【雨科】平台制作维修服务预约小程序能…...

前端架构体系调研整理汇总
1.公司研发人数与前端体系 小型创业公司 前端人数: < 3 人 产品类型: 产品不是非常成熟,比较新颖。 项目流程:不完善,快、紧促,没有固定的时间排期。 技术栈: 没有历史包袱,技…...
DrawerLayout的点击事件会穿透到底部,如何拦截?
DrawerLayout实现侧后,发现了一个问题。点击DrawerLayout的画面,会触发覆盖的底层页面的控件。由此说明点击事件穿透到了底部。但是我只需要触发抽屉布局里的控件,不想触发底层被覆盖的看不见的按钮,由此我想到的时让抽屉页面拦截…...

在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证 一、登录获得JWT 在navicat中运行如下sql,准备一张user表 -- ---------------------------- -- Table structure for t_user -- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id int(11) …...
天堂2如何对版本里面的内容进行修改
天堂2写装备属性的问题 早一点的版本属性都是写在armor文件夹 xml档里,不再写armor里了 armor文件夹里只有防御 HP MP增加量,套装的属性都用一个技能形式写在 skills里了 在配合数据库里一个叫armorsets实现套装属性,拿皇家套做说明。 id 43…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...