Web自动化测试——Junit5篇

news2024/11/28 22:47:10

文章目录

    • 一、相关依赖注入
    • 二、注解调用
    • 三、断言 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 {
    @Test
    public void WTest() {
        System.out.println("WWW");
    }
    @Test
    public void DTest2() {
        System.out.println("DDD");
    }
    @Test
    public 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 {

}

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

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

相关文章

网络安全-协议爆破-xhydra

网络安全-协议爆破-xhydra 啥叫爆破呢&#xff0c;当你忘记密码了&#xff0c;一个一个去猜想的时候&#xff0c;这个东东就叫暴力破解 简称爆破&#xff0c;而且用程序的组合去一个一个试&#xff0c;时间问题&#xff0c;总有尝试到的那天 爆破前需求 也就是说满足了什么…

数据库测试的认知和分类

数据库测试的认知和分类 目录&#xff1a;导读 系统测试 集成测试 单元测试 功能测试 数据库性能 性能优化分4部分 安全测试 现在的软件系统&#xff0c;尤其是业务应用系统&#xff0c;后台都连接着一个数据库。数据库中存储了大量的数据&#xff0c;数据库的设计是否…

完整爬虫学习笔记(第一章)

文章目录前言:fu:. 爬虫概述:hotdog:原理解剖:one: 服务器渲染:two: 前端JS渲染:fire: 第一个爬虫程序案例总结前言 最近正在学习Python网络爬虫的相关知识&#xff0c;鉴于本人Python水平有限 , 对Python并无太深的理解&#xff0c;所以此文章的主要目的在于抛砖引玉&#xf…

C语言(ANSI C类型限定符)

目录 1.const(恒常性) 2.volatile 3.restrict 1.const(恒常性) 如果我们想处理一个基本类型时&#xff0c;我们可以选择传递类型变量值或类型变量的地址。但有的时候我们传入地址但不想让其修改地址上面存储的值&#xff0c;那么就可以用到const。 这个时候const的作用就到了。…

Ansys Speos | 基于 Workbench 和 Speos 的准直全反射透镜优化设计案例

概述 基于Ansys Speos软件&#xff0c;可以准确建立光学系统模型并进行成像效果仿真。在使用Speos进行光学系统设计过程中&#xff0c;当完成初始光学系统建模后&#xff0c;还需要进一步结合仿真结果&#xff0c;调整出满足设计要求的系统参数&#xff0c;如果采用手动调整参…

香农 | 流行潮(bandwagon)

【编者按&#xff1a;面对当前的Chatgpt热潮&#xff0c;该如何看待呢&#xff1f;英语当中有种说法叫 jump on the bandwagon&#xff0c;意为跟风随大流。60多年前&#xff0c;当信息论的发展进入越来越多的领域&#xff0c;一向低调的香农在《流行潮》&#xff08;The Bandw…

Linux 游戏性能谁的 更优秀X.Org还是Wayland!

导读X.Org 和 Wayland 是目前 Linux 平台上的两大主流显示服务器&#xff0c;那么两者在 Linux 游戏性能上谁更优秀呢&#xff1f;国外科技媒体 Phoronix 在 Ubuntu 22.10 上对其进行了多款游戏的实测。评测在运行 GNOME 43.1 的 Ubuntu 22.10 上进行测试&#xff0c;在安装英伟…

基于QT5.14.2的MQTT通信

一、概述 默认的Qt环境是不能使用MQTT的&#xff0c;但Qt官方提供了基于MQTT的封装&#xff0c;需要通过源码进行编译。 可以在下面的链接中获取到&#xff1a; https://github.com/qt/qtmqtt 在dev分支中可以选择MQTT版本&#xff0c;选择最新的下载到本地。注意一定要选择对…

Video Speed Controller谷歌视频加速插件——16倍速

文章目录前言最简单的版本一、如果是简单的话 可以Microsoft Edge使用二、简单的版本 火狐的话使用Global Speed插件三、由于视频受限以上的方法行不通 还是谷歌好用前言 主要是网课刷的时候 太慢所以找到了刷视频的方法 由于前几个的权限受限制 所以还是选用了谷歌浏览器的 V…

Ambire Wallet 2023 年路线图

在一个充满活力的建设者空间&#xff0c;但在一个努力的熊市中&#xff0c;作为加密技术创新者&#xff0c;我们必须保持适应&#xff0c;同时继续通过做好工作来领导&#xff1a;建立愿景。 已经建设了很多&#xff0c;也还有很多要做的&#xff1a;Ambire 发布了今年的雷达图…

炎症回路和肠道微生物

✦ ✦ ✦ 炎症&#xff1a;就是平时人们所说的“发炎”&#xff0c;是机体对于刺激的一种防御反应。炎症&#xff0c;可以是感染引起的感染性炎症&#xff0c;也可以不是由于感染引起的非感染性炎症。 炎症在在各种症状中起重要作用&#xff0c;如脑雾、焦虑和抑郁、腹胀、各种…

数据工程师需要具备哪些技能?

成为数据工程师需要具备哪些技能&#xff1f;数据工程工作存在于各个行业&#xff0c;在银行业、医疗保健业、大型科技企业、初创企业和其他行业找到工作机会。许多职位描述要求数据工程师、拥有数学或工程学位&#xff0c;但如果有合适的经验学位往往没那么重要。 大数据开发…

linux高级命令之用户组相关操作

用户组相关操作学习目标能够知道创建用户组的命令1. 创建用户组命令说明groupadd创建(添加)用户组创建用户组效果图:2. 创建用户并指定用户组创建用户并指定用户组效果图:3. 修改用户组修改用户组效果图:4. 删除用户组命令说明groupdel删除用户组删除用户组效果图:说明:如果用户…

Git-学习记录

文章目录1. Git-基础1.1 获取 Git 仓库1.2 记录每次更新到仓库1.3 远程仓库的使用2. Git-分支2.1 Git 分支的新建与合并2.2 Git 分支的管理1. Git-基础 1.1 获取 Git 仓库 通常有两种获取 Git 项目仓库的方式&#xff1a; 将尚未进行版本控制的本地目录转换为 Git 仓库&…

一文解决从进程栈内存底层原理到Segmentation fault报错

栈是编程中使用内存最简单的方式。例如&#xff0c;下面的简单代码中的局部变量 n 就是在堆栈中分配内存的。 #include <stdio.h> void main() {int n 0;printf("0x%x\n",&v); } 那么我有几个问题想问问大家&#xff0c;看看大家对于堆栈内存是否真的了…

maven deploy上传本地jar至私服

1.场景 首先目前依赖包的管理大多数是maven&#xff0c;其次当使用到第三方的包的时候&#xff0c;官方的仓库或者aliyun的maven都是没有这个包的。那么&#xff0c;为了方便我们使用 我们需要将本地的这个jar上传到 公司内部的私服去&#xff0c;以便大家使用 2. 上操作 我…

VS Code 用作嵌入式开发编辑器

使用 Keil MDK 进行嵌入式开发时&#xff0c;Keil 的编辑器相对于主流编辑器而言有些不方便&#xff0c;比如缺少暗色主题、缺少智能悬停感知&#xff08;鼠标停在一个宏上&#xff0c;能自动展开最终的宏结果&#xff09;、代码补全不好用等等&#xff0c;所以推荐使用 VS Cod…

【Java技术】基于Http的文件断点续传实现

1.断点续传的介绍 客户端软件断点续传指的是在下载或上传时&#xff0c;将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分&#xff0c;每一个部分采用一个线程进行上传或下载&#xff0c;如果碰到网络故障&#xff0c;可以从已经上传或下载的部分开始继续上传下载…

电子科技大学操作系统期末复习笔记(二):进程与并发控制

目录 前言 进程管理 进程基本知识 程序的顺序执行 前趋图 程序的并发执行 并发程序 进程的定义和特征 进程的特征和状态 操作系统内核 定义 功能 原语 原子操作的实现 操作系统控制结构 进程控制块PCB 进程组织&#xff08;进程树&#xff09; 进程的创建 …

3DMAX高级弯曲插件使用教程

3dMax高级弯曲插件是对3dmax原生“弯曲&#xff08;Bend&#xff09;”修改器的一个增强&#xff0c;给用户更多控制弯曲修改器的参数设置&#xff0c;它让用户输入宽度&#xff0c;插件脚本将移动中心以获得正确的宽度。 主要特性&#xff1a; - 使用智能捕捉捕捉到自定义网格…