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…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...