Web自动化测试——Junit5篇
文章目录
- 一、相关依赖注入
- 二、注解调用
- 三、断言 Assert
- 四、规定用例执行顺序
- 五、高效参数化
- 1)单参数
- 2)多参数
- 3)文件获取参数
- 4)方法获取数据(动态参数)
- 六、测试套件整活
Junit
是一个面向 Java 语言的单元测试框架
,在 Java 开发过程中的单元测试阶段起着非常重要的作用。同时,在 Web 自动化测试阶段,Junit 是一个非常趁手的测试工具,为 selenium 的使用注入灵魂
在之前写的自动化测试代码中,调用测试用例使用的是非常原始的 main 函数调用,需要实例化对象,调用类的方法。除了书写带来的不便之外,还存在着其他问题,比如调用的其中一个测试用例失败了,就会导致抛出异常,剩下的测试用例没有办法执行到。
那么面对这样的问题,Junit 采用更加简便的高效的注解的方式进行测试用例代码的调用。除了代码调用,这些注解在其他方面使用过程中也发挥着重要的作用。
一、相关依赖注入
使用 Junit ,就需要将相关的依赖进行注入操作,放到 pom.xml 中的 <dependencies> 标签中,同时selenium 相关依赖也需要注入,注入完成后记得刷新
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version>
</dependency>
<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>
二、注解调用
注解一:@Test
正如前面所说的那样,@Test 注解的作用就是使得测试用例能够被调用
private ChromeDriver driver = new ChromeDriver();
@Test
public void demoTest() {driver.get("https://www.baidu.com/");driver.findElement(By.id("kw")).sendKeys("狗狗");driver.findElement(By.id("su")).click();driver.quit();
}
添加完 @Test 注解后,可以明显看见 demoTest 这个方法名高亮了,并且左侧有绿色小三角形,表示该测试用例可以通过点击绿色小三件形进行调用起来
执行完毕后,可以在下方的结果区看见测试用例的执行状况。里面包含着用例的执行成功与否,成功几个,失败几个,失败的话失败原因是什么等等
同时在多个测试用例需要被执行时,我们只需要点击类名旁边的绿色小三角形就能执行到所有被启动注解标注过的用例,一个用例的失败并不会影响到其他的用例
注解二、三:@BeforeEach、@AfterEach
BeforeEach 显而易见,它的意思就是在每个之前。该注解的作用就是使得被注解的方法在每个
需要被执行的测试用例前都执行一遍
通常来说,被 @BeforeEach 标注的方法就不需要再使用 @Test 注解标注了,否则该用例执行前又会执行一遍该用例
@BeforeEach
public void demoTest1() {System.out.println("before");
}
@Test
public void demoTest2() {System.out.println("用例一");
}
@Test
public void demoTest3() {System.out.println("用例二");
}
同理,@AfterEach 注解的作用自然就是使得被其标注的方法在每个测试用例之后都执行一遍
注解四、五:@BeforeAll、@AfterAll
通过上面的例子,我们可以猜测的到,这两个注解的作用,一个是在所有
测试用例执行前执行一遍,另一个是在所有测试用例执行后执行一遍
需要格外注意的是,被这两个注解标注的方法需要被 static 修饰
@BeforeAll
public static void demoTest1() {System.out.println("before");
}
@Test
public void demoTest2() {System.out.println("用例一");
}
@Test
public void demoTest3() {System.out.println("用例二");
}
三、断言 Assert
自动化的测试中, 对于每个的用例来说,一个用例的执行结果中, 必然会有期望结果与实际结果, 从而来判断该用例是通过还是失败。
Junit 提供了Assertions
接口,其中有大量的实用方法来检查预期值与实际值, 来验证用例的结果。一般来说, 检查条件大体分为等价性, 逻辑比较以及其他。 如果给定的断言通过, 测试会继续执行到下一行的代码, 如果断言失败, 对应的用例测试会立即停止或者生成错误信息( 一般打印错误信息即可) ,但是不要影响其他的用例执行
在下面的案例中使用到的断言就是 Assertions.assertEquals(期望值,实际结果) 。如果期望值和实际结果相同,就没问题;反之如果不相同,就表示出了错误,在结果区会打印相关的错误日志
private ChromeDriver driver = new ChromeDriver();
@Test
public void demoTest() {driver.get("https://www.baidu.com/");String title = driver.getTitle();Assertions.assertEquals("百度一下,你就知道",title);driver.quit();
}
断言用法简单且在实际应用过程中发挥着重要的作用,除了上面的断言方法外
Assertions.assertNotEquals(,); //俩参数不同则没问题
Assertions.assertTrue(); //括号内表达式为真则没问题
Assertions.assertFalse(); //括号内表达式为假则没问题
Assertions.assertNull(); //括号内为null则没问题
Assertions.assertNotNull(); //括号内不为null则没问题
//......
四、规定用例执行顺序
在有多个用例需要被执行的时候,有必要时需要去规定用例的执行顺序。因为官方并没有规定顺序
,既不是按照用例书写顺序,也不是按照字典序。
public class AutoTest2 {@Testpublic void WTest() {System.out.println("WWW");}@Testpublic void DTest2() {System.out.println("DDD");}@Testpublic void MTest3() {System.out.println("MMM");}
}
如果用例之间存在联系,为了避免这样的联系导致用例执行的失败,我们将就需要进行排序操作
使用到的注解有两个
注解一:@TestMethodOrder
表示需要按照方法进行排序(Junit 中有多种排序方法)
注解二:@Order
使用该注解标注需要进行排序的用例,括号内填写用例执行顺序
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class AutoTest2 {@Test@Order(1)public void WTest() {System.out.println("WWW");}@Test@Order(2)public void DTest2() {System.out.println("DDD");}@Test@Order(3)public void MTest3() {System.out.println("MMM");}
}
五、高效参数化
参数化是用例编写过程中非常常见的,比如在百度搜索框中输入文本,然后点击“百度一下"按钮,这样简单的操作,如果没有进行参数化,那么就会导致输入的文本的不同而写大量的类似代码,非常的不方便
我们可以将输入的文本进行参数化,从而减少代码冗余
注解一:@ParameterizedTest
标注方法类型为参数化,有了该注解就不需要添加 @Test
之类的启动注解了
1)单参数
注解二:@ValueSource(类型 = {“”,“”})
这里的类型是需要在原生类型的基础上添加s的,比如 strings,ints,doubles,floats,booleans,chars…使用花括号包裹住所有的单参数
private ChromeDriver driver = new ChromeDriver();@BeforeEach
public void startTest() {driver.get("https://www.baidu.com/");driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}@ParameterizedTest
@ValueSource(strings = {"狗狗","猫猫","兔兔"})
public void demoTest(String content) throws InterruptedException {driver.findElement(By.id("kw")).sendKeys(content);driver.findElement(By.id("su")).click();
}@AfterEach
public void endTest() {driver.quit();
}
2)多参数
注解三:@CsvSource(value = {“”,“”,“”})
在双引号中的参数默认情况下使用逗号
进行分割。
如果某参数中包含逗号,那么就需要使用单引号将参数进行包裹。
如果需要使用其他的符号分割,需要通过delimiterString
属性进行说明
PS:数字类型的参数是不能为空的,字符串类型参数为空表示为 null
@ParameterizedTest
@CsvSource(value = {"'李,雷'-15","韩梅梅-18","李明-13"},delimiterString = "-")
public void demoTest(String str,int num) {System.out.println("str:"+str+" num:"+num);
}
3)文件获取参数
在参数非常多的情况下,全部写在代码中会显得非常的乱,我们可以选择写到csv
文件中,从文件中获取参数内容
注解四:@CsvFileSource(resources = “路径”)
表示从 csv 文件中获取信息,如果括号内是resources
表示从 resources 文件夹下面获取文件。如果括号内是files
表示可以从任意路径下面获取文件
@ParameterizedTest
@CsvFileSource(resources = "/data1.csv")
//@CsvFileSource(files = "F:\\Work\\Test\\Selenium\\SeleniumPractice\\data2.csv")public void demoTest1(String str,int num) {System.out.println("str:"+str+" num:"+num);
}
4)方法获取数据(动态参数)
除了上面提到的获取数据方法外,还可以从其他的方法
中获取数据
注解五:@MethodSource
表示从方法中获取参数内容,如果没有说明就是从同名的静态方法
中获取。如果不同名的话需要在注解后面的括号中进行说明
@ParameterizedTest
@MethodSource
public void demoTest2(String str) {System.out.println("str:"+str);
}
//单参数
public static Stream<String> demoTest2() {return Stream.of("一帆风顺","四喜临门","八面玲珑");
}
@ParameterizedTest
@MethodSource("dataFunc")
public void demoTest3(String str,int num) {System.out.println("str:"+str+" num:"+num);
}
//多参数
public static Stream<Arguments> dataFunc() {return Stream.of(Arguments.arguments("七上",7),Arguments.arguments("八下",8));
}
六、测试套件整活
如果想要一起执行多个类或者包中的用例就需要试用版到测试套件
注解一:@Suite
表示这是一个测试套件
注解二:@SelectClasses(value = {,})
表示将指定的类
下面的被执行注标注的用例进行执行
@Suite
@SelectClasses(value = {AutoOneTest.class,AutoTest1.class})
public class RunSuite {}
注解三:@SelectPackages(“包路径”)
表示将指定的包
底下的符合标准的类下的用例进行执行,标准指的是以 Test(s) 开头或结尾的类名
@Suite
@SelectPackages("com.Case.JunitTest")
public class RunSuite {}
相关文章:

Web自动化测试——Junit5篇
文章目录一、相关依赖注入二、注解调用三、断言 Assert四、规定用例执行顺序五、高效参数化1)单参数2)多参数3)文件获取参数4)方法获取数据(动态参数)六、测试套件整活Junit 是一个面向 Java 语言的单元测试…...

Seata源码学习(二)-源码入口
Seata源码剖析-源码入口 Seata客户端启动 首先一个Seata的客户端启动一般分为几个流程: 自动加载各种Bean及配置信息初始化TM初始化RM(具体服务)初始化分布式事务客户端完成,代理数据源连接TC(Seata服务端ÿ…...

2023如何选购适合游戏设计的电脑硬件
游戏设计涉及许多不同的学科,因此涉及许多不同的软件包。有游戏引擎本身,例如 Unreal Engine 和 Unity,以及 3D 设计软件,例如 3ds Max、Blender 和 ZBrush——等等!大多数软件开发人员都维护着这些不同应用程序的系统…...
springboot maven项目集成阿里p3c-pmd插件使用
阿里巴巴规约使用的是pmd代码静态分析工具,通过maven-pmd-plugin这个maven插件实现。 pom文件引入 <!-- 阿里p3c插件 --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId><…...

PowerJob的server启动都经历了哪些?代码不多也很简单,咱们来逐一理解。
这是一篇让你受益匪浅的文章,点个关注交流一下吧~ PowerJob如何使用,官方文档已经说的很详细了,即使没学过计算机的人,按照那上面的步骤来也是可以搭建出一个可以使用的例子来,所以今天就不在这里重复前人的工作&#…...

分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏
近年来,市面上一直流行各种h5游戏,例如投票、答题、刮刮乐、大转盘等等等等,而且我在各种营销场景下经常看到它们的身影,是做促销,引流和宣传的神器之一!那么,怎么做好玩的h5游戏?还…...
代理模式--设计模式
为什么要学习代理模式? 因为这是SpringAOP的底层! 1、定义: 在不改变源码的情况下,实现对目标对象的功能扩展 根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种 静态代理 角色分析 抽象角色:一般会…...

【RSTP的原理和配置】
一、RSTP 概述 RSTP使用了IEEE 802.1W协议,视为STP的改进版本,收敛速度快,兼容STP。 RSTP可以兼容STP,但是会丧失快速收敛等优势; 1、RSTP对STP的改进; 1.1、端口角色的增补、简化了生成树协议的理解及部…...

Doom流量回放工具导致的测试环境服务接口无响应的排查过程
Doom流量回放工具导致的测试环境服务接口无响应的排查过程 现象描述: a)部分接口(A组接口)无响应 b)部分接口(B组接口)正常响应 c)还有一部分接口(C组接口),场景1无响应,场景2正常响…...

2023年留学基金委(CSC)西部/地方合作项目选派办法及解读
2023年2月13日国家留学基金委(CSC)官方网站发布了2023年西部地区人才培养特别项目、地方合作项目通知。知识人网小编现将其选派工作流程及选派办法原文转载并加以解读、提出建议。知识人网建议1. 邀请函是公派申请的必备条件。对于外语语言证明未达标者&…...

ILSSI国际研讨会将为您呈现六西格玛技术的未来与前景
ILSSI 欢迎世界各地的精益六西格玛专业人士参加即将举行的2023年国际精益六西格玛研讨会,这次研讨会将邀请到世界各地的专家学者,分享他们的专业知识和经验,并就精益六西格玛等相关议题进行探讨和交流。 这是一个绝佳的机会,让您…...

KDJ日周月金叉共振指标
昨天介绍了MACD多周期共振指标公式,KDJ通过类似的写法,也可以共振。本文介绍的KDJ日周月金叉共振指标包含日周金叉共振、日月金叉共振、周月金叉共振、日周月金叉共振四种类型。 需要注意的问题依然是周、月金叉的信号漂移,接近周末月末的信…...

线程私有变量ThreadLocal详解
本文已收录至Github,推荐阅读 👉 Java随想录 烈火试真金,逆境试强者。——塞内加 文章目录什么是ThreadLocalThreadLocal 原理set()方法get()方法remove()方法ThreadLocal 的Hash算法ThreadLocal 1.7和1.8的区别ThreadLocal 的问题ThreadLoca…...
如何保证数据库和缓存双写一致性
前言 数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率非常大,所以非常有必要跟大家一起探讨一下。 今天这篇文章我会从浅入深,…...

一文搞懂:JS严格模式“use strict”
什么是JS的严格模式 JS严格模式概念是在ES5中引入的,在此模式下,JS对语法的要求会变的严格,某些不太严谨的代码在严格模式下将不能运行。 如何启用严格模式 只需要JS代码的起始添加 "use strict"即可。如: "use…...

Linux的ACL(扩展权限)规划:setfacl、getfacl
目录 什么是ACL与如何支持启动ACL ACL设置技巧:getfacl、setfacl getfacl命令用法 setfacl命令用法 最简单的【u:账号:权限】设置 使用默认权限设置目录未来文件的ACL权限继承 什么是ACL与如何支持启动ACL ACL是Access Control List的…...

HTML预格式化文本pre标签
文章目录参考white-spaceword-breakfont-family参考 https://blog.csdn.net/weixin_44368963/article/details/120054949 https://www.zhangxinxu.com/wordpress/2017/03/css-font-family-chinese-english/ pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留…...
基于机器学习的心脏病预测方法(11)——梯度提升机(GBM)
一、梯度提升机介绍 GBM(Gradient Boosting Machine)算法是Boosting(提升)算法的一种。主要思想是,串行地生成多个弱学习器,每个弱学习器的目标是拟合先前累加模型的损失函数的负梯度, 使加上该弱学习器后的累积模型损失往负梯度的方向减少。 且它用不同的权重将基学习器…...

Linux多版本python切换以及多版本pip对应 (cloud studio Ubuntu16.04)
linux && cloud studio && Ubuntu16.04 简单解决多版本python切换以及多版本pip对应问题 1.python2切换成python 多版本python: 更改前先查看版本号 $ python -V Python 2.7.12 $ python2 -V Python 2.7.12 $ python3 -V Python 3.5.2 通过下面的命令看到py…...

【并发编程】LockSupport源码详解
目录 一、前言 1.1 简介 1.2 为什么说LockSupport是Java并发的基石? 二、LockSupport的用途 2.1 LockSupport的主要方法 2.2 使用案例 2.3 总结 三、LockSupport 源码分析 3.1 学习原理前的前置知识 3.1.1 Unsafe.park()和Unsafe.unpark() 3.1.2wait和notify/notify…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...