测开 (Junit 单元测试框架)

news2024/11/29 4:28:17

目录

了解 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.coloradmin.cn/o/1145783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nodejs+vue人脸识别考勤管理系统的设计与实现-计算机毕业设计

根据分析&#xff0c;本系统主要有3个角色&#xff1a;管理员、用户、考勤系统。 &#xff08;1&#xff09;管理员&#xff1a;管理员信息的添加、删除、修改和查询&#xff0c;用户信息添加、删除、修改和查询。 &#xff08;2&#xff09;用户&#xff1a;用户的注册和登录&…

[红蓝攻防]MDOG(全新UI重制版)为Xss跨站而生,数据共享,表单劫持,URL重定向

说明 功能Cookie窃取表单劫持(钓鱼账密)重定向流量劫持多平台数据推送钉钉数据推送 运行窗口 ./dist目录下已生成exe文件,双击打开 Cookie窃取 点击运行服务,复制以上的payload,payload怎么变形那么你可已去混淆 payload在页面执行 受害者访问存在xss漏洞的页面时受到攻击,…

【软考】系统集成项目管理工程师(十)项目质量管理【3分】

一、质量概念 1、定义 国际&#xff1a;反应实体满足主体明确和隐含需求的能力的特性总和 国内&#xff1a;一组固有特性满足要求的程度 2、质量与等级 质量&#xff1a;作为实现的性能或成果&#xff0c;是一系列内在特性满足要求的程度ISO9000 等级&#xff1a;作为设计意…

阅读JDK源码的经验分享

理论先行。阅读某一个模块时&#xff0c;先搜索它的理论支撑&#xff0c;甚至可以先看别人的阅读经验&#xff0c;有了一个大致的了轮廓之后&#xff0c;自己再去实践。 必须试用。面对一个新的类&#xff0c;最好是先搜索一下它的基本用法&#xff0c;写成一个小的示例&#…

Camtasia mac版怎么加字幕 Camtasia mac版怎么打马赛克

在视频制作过程中&#xff0c;字幕和马赛克是两项非常常用的编辑功能&#xff0c;添加字幕可以提高观众的观看体验&#xff0c;添加马赛克可以保护视频创作者不想公开的画面内容。Camtasia作为一款知名的视频制作软件&#xff0c;在具备基本的录制和视频编辑功能的同时&#xf…

麻匪音频识别-网易云-BetterNCM(目前仅网易云支持)

麻匪音频识别-网易云-BetterNCM&#xff08;目前仅网易云支持&#xff09; 这个东西很帅的哦&#xff0c;你网易云放什么歌他就联动什么&#xff0c;自动变 首先下载一点东西 1.steam 2.steam里面搜索wallpaper下载&#xff08;这个免费的哈&#xff09; 3.然后到这个界面 搜…

【软考】系统集成项目管理工程师(十一)项目人力资源管理【2分】

一、 人力资源管理【ITO口诀版】 二、 规划人力资源管理 1、定义 &#xff08;1&#xff09;确定项目的角色、职责以及汇报关系&#xff0c;并编制人员配备管理计划 &#xff08;2&#xff09;作为项目最初阶段的一部分。但是这一过程的结果应当在项目的整个生命周期中进行经…

GoLand GC(垃圾回收机制)简介及调优

GC(Garbage Collector)垃圾回收机制及调优 简单理解GC机制 其实gc机制特别容易理解&#xff0c;就是物理内存的自动清理工。我们可以把内存想象成一个房间&#xff0c;程序运行时会在这个房间里存放各种东西&#xff0c;但有时候我们会忘记把不再需要的东西拿出去&#xff0c…

Go学习第十五章——Gin参数绑定bind与验证器

Go web框架——Gin&#xff08;参数绑定bind与验证器&#xff09; 1 bind参数绑定1.1 JSON参数1.2 Query参数1.3 Uri绑定动态参数1.4 ShouldBind自动绑定 2 验证器2.1 常用验证器2.2 gin内置验证器2.3 自定义验证的错误信息2.4 自定义验证器 1 bind参数绑定 在Gin框架中&#…

Unity Meta Quest 一体机开发(三):Oculus Integration 基本原理、概念与结构+玩家角色基本配置

文章目录 &#x1f4d5;教程说明&#x1f4d5;输入数据&#x1f4d5;Oculus Integration 处理手部数据的推荐流程&#x1f4d5;VR 中交互的基本概念&#x1f4d5;Oculus Integration 中的交互流程&#x1f4d5;配置一个基本的玩家物体⭐OVRCameraRig⭐OVRInteraction⭐OVRHandP…

MC红显材质包安装

红显材质包安装 UP介绍视频 https://www.bilibili.com/video/BV1ML4y1u7nd/?vd_source3b8afcc2613780d7607382bae034945a 材质包下载地址&#xff1a; 需要 OptiFine 或 CITResewn 模组&#xff08;以后还会支持其他自定义贴图模组&#xff09; 下载&#xff1a;https://xek…

【python与数据结构】(leetcode算法预备知识)

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ python与数据结构 Python 中常见的数据类型数据结构1.数组&#xff08;Array&#xff09;2.链表&#xff08;Linked List&#xff09;3.哈希表&#xff08;Hash Table&#xff09;4.队列&#xff08;Queue&#x…

7.多线程之单例模式

单例模式 文章目录 单例模式1. 什么是单例模式2. 饿汉模式3. 懒汉模式3.1 单线程版&#xff1a;3.2 多线程版 1. 什么是单例模式 单例模式是一种设计模式&#xff0c;常见的设计模式还有工厂模式、建造者模式等。 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码…

Java练习题2022-1

HashSet是Java中常用的Set集合&#xff0c;向HashSet集合中添加数据对象时&#xff0c;首先会调用对象的hashCode()方法获取哈希码&#xff0c;根据哈希码计算对象的存储位置&#xff0c;如果相应位置上已经有数据对象&#xff0c;则会调用对象的equals()方法判断新加入的对象与…

【HarmonyOS】鸿蒙操作系统架构

HarmonyOS架构 一. 鸿蒙系统定位二. 架构整体遵从分层设计三. HarmonyOS具有的技术特性四. HarmonyOS有三大特征 其它相关推荐&#xff1a; 软考系统架构之案例篇(架构设计相关概念) 系统架构之微服务架构 系统架构设计之微内核架构 所属专栏&#xff1a;系统架构设计师 一. 鸿…

分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测

分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测 目录 分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现KOA-CNN-LSTM-selfAttention开普勒算法优化卷积长短期记忆神经网络融合…

Camtasia Mac 2023版怎么给视频加字幕

在视频制作过程中&#xff0c;字幕和马赛克是两项非常常用的编辑功能&#xff0c;添加字幕可以提高观众的观看体验&#xff0c;添加马赛克可以保护视频创作者不想公开的画面内容。Camtasia作为一款知名的视频制作软件&#xff0c;在具备基本的录制和视频编辑功能的同时&#xf…

Python运维学习Day01-文件基本操作

这里写自定义目录标题 1.遍历目录下所有的文件1.1 这里主要利用os.walk 函数的功能 2. 计算文件的 MD5 值3. 我们组合下两个函数&#xff0c;遍历下某个文件夹下的文件的md5码 1.遍历目录下所有的文件 def getFileName(directory):file_list []for dir_name, sub_dir,file_na…

CC002:ContextCapture倾斜摄影建模流程

摘要&#xff1a;本文主要介绍cc倾斜摄影建模流程&#xff0c;包括工程创建、影像添加、任务序列路径指定、空三、像控点的导入与刺点、空三优化、三维重建、定义生产三维产品的格式等流程&#xff0c;其中实验数据来源为多普云职业教育平台。 一、实验数据获取 本实验使用cc软…

【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度学习的实践层面

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 吴恩达课程笔记——参数VS超参数、深度学习的实践层面 六、参数VS超参数1.参数和超参数的区别2.什么是超参数&#xff1f;3.如何寻找超参数的最优值&#xff1f; 七、深度学习的实践层面1.训练 / 验证 / 测试集(T…