测开 (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注解不表明数据源,它会去寻找同名的数据源(静态方法)

我们再来看传递多种类型参数是怎么写的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/176162.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python随手小练14

题目&#xff1a; 文件操作 &#xff1a; 根据文件要求&#xff08;测试&#xff09;筛选出数据并且放入一个新的文件 具体操作&#xff1a; f1 open("1.txt","r",encoding"UTF-8") f2 open("2.txt","w",encoding"U…

JVM 类加载的过程

JVM 类加载的过程 加载验证准备解析初始化 加载 “加载”&#xff08;Loading&#xff09;阶段是整个“类加载”&#xff08;Class Loading&#xff09;过程中的一个阶段&#xff0c;它和类加载 Class Loading 是不同的&#xff0c;一个是加载 Loading 另一个是类加载 Class L…

【Linux进程控制】进程控制专篇

【Linux进程控制】进程控制专篇 目录 【Linux进程控制】进程控制专篇进程创建fork函数写实拷贝fork常规用法fork调用失败的原因 进程终止进程退出场景进程常见退出方法_exit函数return退出 进程等待进程等待必要性进程等待的方法获取子进程status 具体代码实现进程程序替换替换…

Django 社区志愿者管理系统

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 社区志愿者服务管理系统&#xff0c;主要的模块包括查看首页、个人中心、通知公告管理、志愿者管理、普通管理员管理、志愿活动管理、活动宣…

day02 矩阵 2023.10.26

1.矩阵 2.矩阵乘法 3.特殊矩阵 4.逆矩阵 5.正交矩阵 6.几何意义 7.齐次坐标 8.平移矩阵 9.旋转矩阵 10.缩放矩阵 11.复合运算

浪潮信息inMerge超融合 刷新全球vSAN架构虚拟化VMmark最佳成绩

近日&#xff0c;在国际权威的VMmark测试中&#xff0c;浪潮信息inMerge1100超融合产品搭载NF5280M7服务器&#xff0c;满载运行44Tiles取得40.95分的成绩&#xff0c;刷新了vSAN架构&#xff08;Intel双路最新平台&#xff09;虚拟化性能测试纪录。该测试结果证明inMerge1100可…

hdlbits系列verilog解答(移位寄存器)-23

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 您将获得一个具有两个输入和一个输出的模块 my_dff &#xff08;实现 D 触发器&#xff09;。实例化其中的三个&#xff0c;然后将它们链接在一起以形成长度为 3 的移位寄存器。端口 clk 需要连接到所有实例。…

linux查看系统版本、内核信息、操作系统类型版本

1. 使用 uname 命令&#xff1a;这将显示完整的内核版本信息&#xff0c;包括内核版本号、主机名、操作系统类型等。 uname -a2. 使用 lsb_release 命令&#xff08;仅适用于支持 LSB&#xff08;Linux Standard Base&#xff09;的发行版&#xff09;&#xff1a;这将显示包含…

如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先&#xff0c;开发者应该测试代码里的 private 私有方法吗&#xff1f; 直接信任这些私有方法&#xff0c;测试到…

Servlet 上下文参数

7)Servlet上下文对象&#xff1a;ServletContext生活中的例子&#xff1a;张三和李四在不远处窃窃私语&#xff0c;并且频繁的对着你坏笑。你肯定会跑过去问&#xff1a;你们俩在聊什么&#xff1f;注意&#xff1a;此处的聊什么&#xff0c;其实就是你在咨询他们聊天的上下文&…

FreeRTOS深入教程(队列内部机制和源码分析)

文章目录 前言一、队列结构体分析二、创建队列三、读写队列源码分析1.读队列源码分析2.写队列源码分析 总结 前言 本篇文章主要来为大家分析队列的内部机制和源码实现。 一、队列结构体分析 在FreeRTOS中队列会使用一个结构体来表示&#xff1a; 1.int8_t * pcHead 和 int…

V90PN总线伺服梯形加减速速度控制(标准报文1应用)

V90 PN总线伺服速度控制应用可以利用标准报文1和SinaSpeed功能块实现,具体代码介绍请查看下面相关文章链接,这里不再赘述。 速度随动控制 V90伺服PN总线速度随动控制(手摇轮功能)-CSDN博客文章浏览阅读40次。V90PN总线控制相关内容,请参考下面文章链接:博途1200/1500PLC …

使用tensorflow创建自己的量化金融工具

介绍 在充满活力的金融领域,高频交易 (HFT) 已经成为游戏规则的改变者。高频交易能够在几毫秒内执行数千个订单,利用先进的算法和计算技术实时利用微小的价格差异。随着金融市场的不断发展,支持高频交易策略的工具和框架也必须不断发展。在这一背景下,TF Quant Finance (T…

物联网AI MicroPython传感器学习 之 SHT3X温湿度传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 Sensirion SHT3x-DIS湿度和温度传感器基于CMOSens传感器芯片&#xff0c;更加智能、可靠&#xff0c;精度更高。SHT3x-DIS具有增强的信号处理能力、两个独特的用户可选I2C地址&#xff0c;通信…

JavaScript基础知识19——循环结构:while循环

哈喽&#xff0c;你好&#xff0c;我是雷工。 本节学习JavaScript基础语法的循环结构&#xff1a;while循环&#xff0c;以下为学习笔记。 while循环 循环概念&#xff1a;重复执行一些操作&#xff1b; 循环特征&#xff1a;不断地重复&#xff1b; while&#xff1a;在…期间…

监控浏览器页面展示性能的工具

B/S架构&#xff0c;用户都是使用浏览器访问后端服务&#xff0c;产品在开发时需要关注用户的体验&#xff0c;不仅包含交互的友好&#xff0c;性能指标也非常重要。对于后端开发常见的性能指标&#xff0c;可能包含&#xff1a;reponse time&#xff0c;吞吐量等。此外&#x…

【数据结构】顺序表

今天给大家带来的是顺序表相关知识的分享&#xff0c;喜欢的朋友可以三连一波&#xff01;&#xff01;&#xff01; 顺序表 顺序表的基本结构&#xff1a; 顺序表的实现 我们将顺序表的实现分装成函数大概分为下面几类&#xff1a; //初始化 void InitSL(SL* psl); //打印数…

最新waymo数据集 百度网盘

最新waymo数据集介绍 waymo数据集是有史以来最大&#xff0c;最多样化的自动驾驶数据集&#xff0c;包含 传感器数据边界框数据2D视频全景分割标签关键点标签3D语义分割标签2D和3D边界框的关联 是该领域质量最高、规模最大的数据集之一&#xff0c;用于帮助研究界在机器感知…

管理类联考——英语二——阅读篇——题材:心理

文章目录 2013年&#xff0c;Text 3——题材&#xff1a;心理细节题&#xff08;难&#xff09;细节题——排除法细节题细节题观点态度题 2015 年&#xff0c;Text 1——题材&#xff1a;心理细节题细节题推断题词义句意题细节题 2019 年&#xff0c;Text 1——题材&#xff1a…

c语言练习(9周)

输入样例11输出样例7.0980 #include<stdio.h> int main() {int n, i;double s 1,a1;scanf("%d", &n);for (i 2; i < n; i) {a 1 / (1a);s a;}printf("%.4lf", s);return 0; } 题干输入10个整数&#xff0c;分别按输入正序、逆序显示。输…