当前位置: 首页 > news >正文

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&#xff09;单参数2&#xff09;多参数3&#xff09;文件获取参数4&#xff09;方法获取数据&#xff08;动态参数&#xff09;六、测试套件整活Junit 是一个面向 Java 语言的单元测试…...

Seata源码学习(二)-源码入口

Seata源码剖析-源码入口 Seata客户端启动 首先一个Seata的客户端启动一般分为几个流程&#xff1a; 自动加载各种Bean及配置信息初始化TM初始化RM&#xff08;具体服务&#xff09;初始化分布式事务客户端完成&#xff0c;代理数据源连接TC&#xff08;Seata服务端&#xff…...

2023如何选购适合游戏设计的电脑硬件

游戏设计涉及许多不同的学科&#xff0c;因此涉及许多不同的软件包。有游戏引擎本身&#xff0c;例如 Unreal Engine 和 Unity&#xff0c;以及 3D 设计软件&#xff0c;例如 3ds Max、Blender 和 ZBrush——等等&#xff01;大多数软件开发人员都维护着这些不同应用程序的系统…...

springboot maven项目集成阿里p3c-pmd插件使用

阿里巴巴规约使用的是pmd代码静态分析工具&#xff0c;通过maven-pmd-plugin这个maven插件实现。 pom文件引入 <!-- 阿里p3c插件 --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-pmd-plugin</artifactId><…...

PowerJob的server启动都经历了哪些?代码不多也很简单,咱们来逐一理解。

这是一篇让你受益匪浅的文章&#xff0c;点个关注交流一下吧~ PowerJob如何使用&#xff0c;官方文档已经说的很详细了&#xff0c;即使没学过计算机的人&#xff0c;按照那上面的步骤来也是可以搭建出一个可以使用的例子来&#xff0c;所以今天就不在这里重复前人的工作&#…...

分享好玩的h5小游戏制作步骤_怎么做h5微信小游戏

近年来&#xff0c;市面上一直流行各种h5游戏&#xff0c;例如投票、答题、刮刮乐、大转盘等等等等&#xff0c;而且我在各种营销场景下经常看到它们的身影&#xff0c;是做促销&#xff0c;引流和宣传的神器之一&#xff01;那么&#xff0c;怎么做好玩的h5游戏&#xff1f;还…...

代理模式--设计模式

为什么要学习代理模式&#xff1f; 因为这是SpringAOP的底层&#xff01; 1、定义&#xff1a; 在不改变源码的情况下&#xff0c;实现对目标对象的功能扩展 根据代理类的生成时间不同可以将代理分为静态代理和动态代理两种 静态代理 角色分析 抽象角色&#xff1a;一般会…...

【RSTP的原理和配置】

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

Doom流量回放工具导致的测试环境服务接口无响应的排查过程

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

2023年留学基金委(CSC)西部/地方合作项目选派办法及解读

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

ILSSI国际研讨会将为您呈现六西格玛技术的未来与前景

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

KDJ日周月金叉共振指标

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

线程私有变量ThreadLocal详解

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 烈火试真金&#xff0c;逆境试强者。——塞内加 文章目录什么是ThreadLocalThreadLocal 原理set()方法get()方法remove()方法ThreadLocal 的Hash算法ThreadLocal 1.7和1.8的区别ThreadLocal 的问题ThreadLoca…...

如何保证数据库和缓存双写一致性

前言 数据库和缓存(比如:redis)双写数据一致性问题,是一个跟开发语言无关的公共问题。尤其在高并发的场景下,这个问题变得更加严重。 我很负责的告诉大家,该问题无论在面试,还是工作中遇到的概率非常大,所以非常有必要跟大家一起探讨一下。 今天这篇文章我会从浅入深,…...

一文搞懂:JS严格模式“use strict”

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

Linux的ACL(扩展权限)规划:setfacl、getfacl

目录 什么是ACL与如何支持启动ACL ACL设置技巧&#xff1a;getfacl、setfacl getfacl命令用法 setfacl命令用法 最简单的【u&#xff1a;账号&#xff1a;权限】设置 使用默认权限设置目录未来文件的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并发的基石&#xff1f; 二、LockSupport的用途 2.1 LockSupport的主要方法 2.2 使用案例 2.3 总结 三、LockSupport 源码分析 3.1 学习原理前的前置知识 3.1.1 Unsafe.park()和Unsafe.unpark() 3.1.2wait和notify/notify…...

实战级SQL注入测试技巧揭秘

目录 一、高阶注入判断技巧&#xff08;不爆数据&#xff0c;只测漏洞&#xff09; 1. 布尔盲注&#xff08;Boolean-based&#xff09; 2. 时间盲注&#xff08;Time-based&#xff09; 3. 报错注入&#xff08;Error-based&#xff09; 二、高阶利用手法&#xff08;实战…...

3步突破设备壁垒:让VR内容在普通显示器上重生的开源方案

3步突破设备壁垒&#xff1a;让VR内容在普通显示器上重生的开源方案 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_…...

告别裸机!用状态机思路重构你的51单片机温度监测程序(以DS18B20为例)

告别裸机&#xff01;用状态机思路重构你的51单片机温度监测程序&#xff08;以DS18B20为例&#xff09; 在嵌入式开发中&#xff0c;51单片机因其简单易用、成本低廉而广受欢迎。但当项目复杂度上升时&#xff0c;传统的"while循环延时"式代码往往会陷入维护噩梦——…...

AI 创作者指南:04.AI写作:从草稿到润色的全流程协作

第4篇AI写作:从草稿到润色的全流程协作 第一部分创意引擎学完,你现在灵感满池、选题稳稳、观点锋利,是不是已经跃跃欲试想动笔了?😊 来,正式进入第二部分:AI作为写作与表达助手! 今天第4篇——AI写作:从草稿到润色的全流程协作。 咱们还是老朋友喝茶模式:AI不是让你…...

如何让经典游戏完美运行在现代Windows系统:DDrawCompat高效解决方案全指南

如何让经典游戏完美运行在现代Windows系统&#xff1a;DDrawCompat高效解决方案全指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/g…...

Yep应用商店优化终极指南:提升App Store排名与下载量的10个策略

Yep应用商店优化终极指南&#xff1a;提升App Store排名与下载量的10个策略 【免费下载链接】Yep Meet Genius 项目地址: https://gitcode.com/gh_mirrors/ye/Yep Yep是一款主打社交互动的移动应用&#xff0c;通过优化App Store展示内容和用户体验&#xff0c;可以显著…...

手把手教你用Python实现双足机器人ZMP预观控制(附开源代码)

用Python实现双足机器人ZMP预观控制的完整指南 1. ZMP理论基础与机器人动力学模型 零力矩点(ZMP)理论是现代双足机器人步态规划的核心概念&#xff0c;它定义了地面反作用力合力作用点的位置。当ZMP位于支撑多边形(由机器人足底接触点构成的凸多边形)内时&#xff0c;机器人能保…...

手把手教你用STM32CubeMX配置LCD1602显示:HAL库驱动移植+Proteus 8.12仿真

STM32CubeMX与Proteus联合开发&#xff1a;LCD1602显示实战指南 在嵌入式开发领域&#xff0c;STM32CubeMX和Proteus的组合为开发者提供了从硬件配置到软件仿真的完整解决方案。本文将深入探讨如何利用这两个工具链实现LCD1602液晶显示屏的驱动与显示功能&#xff0c;特别针对从…...

FBGA200封装揭秘:为什么长鑫这款LPDDR4X内存更适合工业级嵌入式设备?

FBGA200封装工业级LPDDR4X内存的五大实战优势 在工业自动化生产线控制柜里&#xff0c;一块仅有指甲盖大小的内存模块正在零下20度的环境中稳定处理着每秒上千条传感器数据&#xff1b;与此同时&#xff0c;行驶在戈壁滩的智能矿卡车载系统中&#xff0c;同款内存芯片正承受着持…...

告别振动噪音:用DRV8825模块的细分功能,让你的3D打印机或CNC雕刻机运行更安静平稳

静音革命&#xff1a;DRV8825微步进技术在3D打印与CNC中的实战应用 当你的3D打印机在深夜工作时发出刺耳的嗡嗡声&#xff0c;或是CNC雕刻机在低速运行时产生令人不适的振动&#xff0c;这不仅影响工作环境&#xff0c;更会直接反映在成品质量上——那些本应光滑的表面出现的细…...