11. Junit

我们主要学习的是 Junit5.

1. selenium 和 Junit 之间的关系

selenium 和 Junit 之间的关系 就像 Java 和 JavaScript 之间的关系,也就是没有关系

为什么学习了 selenium 还要学习 Junit 呢?

举个例子,如果 Selenium 编写的自动化测试用例是灯,Junit 则是控制灯如何让去亮等。

通过 Junit 来管理测试用例。

2. 常用的注解

2.1 添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>TestCode</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>3.141.59</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.2</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.2</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version><scope>test</scope></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency></dependencies><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>

2.2 @Test

public class JunitTest {@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}
}

    @Testvoid test02(){System.out.println("这是第二个测试用例");}

2.3 @BeforeAll @AfterAll

 @BeforeAll// 当前所有的测试用例执行之前执行这个方法static void setUp(){System.out.println("开始执行 @BeforeAll 修饰的方法");}@AfterAll// 当前所有的测试用例执行之后执行这个方法static void tearDown(){System.out.println("开始执行 @AfterAll 修饰的方法");}

2.4 @BeforeEach @AfterEach

@BeforeEach// 当前每个测试用例执行之前执行这个方法void boforeTest(){System.out.println("开始执行 @BeforeEach 修饰的方法");}@AfterEach// 当前每个测试用例执行之后执行这个方法void afterTest(){System.out.println("开始执行 @AfterEach 修饰的方法");}

2.5 @Disabled

@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Testvoid test02(){System.out.println("这是第二个测试用例");}

3. Junit 测试用例的执行顺序

是从上到下执行测试用例吗?

我们先来看以下的测试用例的执行情况:

public class JunitTest {@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Testvoid test02(){System.out.println("这是第2个测试用例");}@Testvoid test03(){System.out.println("这是第3个测试用例");}@Testvoid test04(){System.out.println("这是第4个测试用例");}
}

可以看到确实是从上往下执行的,那么此时我们改变一下测试用例的顺序:

public class JunitTest {@Testvoid test04(){System.out.println("这是第4个测试用例");}@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Testvoid test02(){System.out.println("这是第2个测试用例");}@Testvoid test03(){System.out.println("这是第3个测试用例");}
}

可以看到依旧是从上往下执行的。

那么,我们如何根据指定的顺序来执行测试用例呢?

// 根据指定的顺序来执行测试用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {@Order(4)@Testvoid test04(){System.out.println("这是第4个测试用例");}@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Order(2)@Testvoid test02(){System.out.println("这是第2个测试用例");}@Order(3)@Testvoid test03(){System.out.println("这是第3个测试用例");}
}

可以看到,我们是通过注解 @TestMethodOrder(MethodOrderer.OrderAnnotation.class) 设定为根据指定的顺序来执行测试用例,通过 @Order 来指定具体的测试用例执行的顺序,没有被 @Order修饰的测试用例默认最后执行 。

接下来,我们来了解一下通过随机的顺序来执行测试用例:

// 根据随机的顺序来执行测试用例
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {@Order(4)@Testvoid test04(){System.out.println("这是第4个测试用例");}@Disabled// 忽略当前测试用例(当前这个测试用例不执行)@Test// @Test 表明当前的方法是一个测试用例void test01(){WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");}@Order(2)@Testvoid test02(){System.out.println("这是第2个测试用例");}@Order(3)@Testvoid test03(){System.out.println("这是第3个测试用例");}
}

 可以看到每次执行的测试用例顺序不同。

4. 参数化

参数化中有单参数、多参数、CSV、方法。

4.1 单参数

注意,以下两个注解不能同时用来修饰一个方法

    @ParameterizedTest@ValueSource(strings = {"1","2","3"})void test05(String str){System.out.println(str);}

4.2 多参数

4.2.1 CSV
@ParameterizedTest@CsvSource({"1,2","3,4"})void test06(String str,int num){System.out.println(str + " " + num);}

接下来,在 resources 中新建文件:

编写代码:

    @ParameterizedTest@CsvFileSource(resources = "test01.csv")void test07(int id,String name){System.out.println("id" + id + ",name" + name);}

4.2.2 方法

编写方法:

public static Stream<Arguments> Generator(){return Stream.of(Arguments.arguments("1,小张","2,小李"));}

代码: 

// 注册参数@ParameterizedTest// 注册的参数@MethodSource("Generator")void test08(String num,String name){System.out.println(num + " " + name);}

5. 断言

断言相等和断言不相等:

    @ParameterizedTest@ValueSource(ints = {10})void test09(int num){// 断言相等Assertions.assertEquals(num,10);// 断言不相等Assertions.assertNotEquals(num,11);}

 可以看到运行正确,此时我们修改代码:

    @ParameterizedTest@ValueSource(ints = {10})void test09(int num){// 断言相等Assertions.assertEquals(num,10);// 断言不相等Assertions.assertNotEquals(num,10);}

可以看到此时报错,因为我们断言是不相等的,而实际是相等的。 

断言为空和断言不为空:

    @ParameterizedTest@ValueSource(strings = "1")void test10(String num){// 断言相等Assertions.assertEquals(num,"1");// 断言不相等Assertions.assertNotEquals(num,"11");// 断言为空Assertions.assertNull(num);}

    @ParameterizedTest@ValueSource(strings = "1")void test10(String num){// 断言相等Assertions.assertEquals(num,"1");// 断言不相等Assertions.assertNotEquals(num,"11");// 断言为空
//        Assertions.assertNull(num);// 断言不为空Assertions.assertNotNull(num);}

 

6. 测试套件

测试套件:通过一段代码直接将所有的测试用例跑起来。

@Suite
@SelectClasses({JunitTest.class,JunitTest02.class})
public class RunSuite {}

通过添加以上两个注解就可以将所有需要测试的类运行起来。

执行指定的包:

@Suite
// 按照指定的类执行
//@SelectClasses({JunitTest.class, JunitTest02.class})
// 按照指定的包执行
@SelectPackages({"Junitlearn","Junitlearn02"})
public class RunSuite {}

 

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

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

相关文章

论坛系统公共组件部分

1.在Java⽬录下创建包&#xff0c;在Resources⽬录下创建⽂件夹&#xff0c;结构如下 ├─java # java⽂件区 │ └─com │ └─example │ └─demo │ ├─common # 公共类 │ ├─config # 配置…

MySQL表操作

目录 一、创建mysql表的结构 1.在mydb数据库下创建一个表格名字为stu_info&#xff0c;里面结构包含了学号和姓名的名称&#xff0c;字符型以及他的引擎为innodb 字符集为gbk 校队规则为gbk_chinese_ci 二、数据库表查看的基本用法语句 1.查看数据库表明 2.查看数据库表的结…

数字图像处理:亮度对比度-几何变换-噪声处理

文章目录 数字图像增强亮度与对比度转换几何变换图像裁剪尺寸变换图像旋转 噪声处理添加噪声处理噪声 数字图像增强 亮度与对比度转换 图像变换可分为以下两种&#xff1a; 点算子&#xff1a;基于像素变换&#xff0c;在这一类图像变换中&#xff0c;仅仅根据输入像素值计算…

【计算机网络】 ARP协议和DNS协议

文章目录 数据包在传输过程中的变化过程单播组播和广播ARP协议ARP代理免费ARP路由数据转发过程DNS协议 数据包在传输过程中的变化过程 在说ARP和DNS之前&#xff0c;我们需要知道数据包在传输过程的变化过程 从图片中可以看到&#xff0c;发送方的原数据最开始是在应用层&…

vscode使用delve调试golang程序

环境配置 delve仓库&#xff0c;含有教程&#xff1a;https://github.com/go-delve/delve golang的debugging教程&#xff1a;https://github.com/golang/vscode-go/wiki/debugging > go version go version go1.20 windows/amd64> go install github.com/go-delve/de…

华为云Stack的学习(五)

六、华为云stack服务简介 1.云服务在华为云Stack中的位置 云服务对接多个数据中心资源池层提供的资源&#xff0c;并向各种行业应用提供载体。 2.华为云Stack通用服务 2.1 云计算的服务模式 2.2 计算相关的云服务 2.3 存储相关的云服务 2.4 网络相关的云服务 3.云化案例 **…

如何取消KEIL-MDK工程中出现的CMSIS绿色图标

如何取消KEIL-MDK工程中出现的CMSIS绿色图标&#xff1f;我以前经常遇到&#xff0c;不知道怎么搞&#xff0c;好像也不影响编译结果。以前问过其他人&#xff0c;但是不知道怎么搞&#xff0c;相信很多人也遇到过。水平有限&#xff0c;表达不清楚&#xff0c;见下图&#xff…

Bootstrap的标题类(标题样式h1~h6)

Bootstrap 的标题字体大小通常遵循以下样式规则&#xff1a; h1 标题的字体大小为 2.5rem&#xff08;40像素&#xff09;。h2 标题的字体大小为 2rem&#xff08;32像素&#xff09;。h3 标题的字体大小为 1.75rem&#xff08;28像素&#xff09;。h4 标题的字体大小为 1.5re…

【trie树】CF Edu12 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 这其实是一个套路题 区间异或转化成前缀异或&#xff0c;然后枚举 i 对于每一个 i&#xff0c;ai ^ x k&#xff0c;对 x 计数 先建一棵字典树&#xff0c;然后在字典树上计数 先去对 > k 的部分计数&a…

国际版阿里云/腾讯云:弹性高性能计算E-HPC入门概述

入门概述 本文介绍E-HPC的运用流程&#xff0c;帮助您快速上手运用弹性高性能核算。 下文以创立集群&#xff0c;在集群中安装GROMACS软件并运转水分子算例进行高性能核算为例&#xff0c;介绍弹性高性能核算的运用流程&#xff0c;帮助您快速上手运用弹性高性能核算。运用流程…

易云维®医院后勤管理系统软件利用物联网智能网关帮助实现医院设备实现智能化、信息化管理

近年来&#xff0c;我国医院逐渐意识到医院设备信息化管理的重要性&#xff0c;逐步建立医院后勤管理系统软件&#xff0c;以提高信息化管理水平。该系统是利用数据库技术&#xff0c;为医院的中央空调、洁净空调、电梯、锅炉、医疗设备等建立电子档案&#xff0c;把设备监控、…

性能炸裂c++20协程+iocp/epoll,超轻量高性能异步库开发实战

前言&#xff1a; c20出来有一段时间了。其中一大功能就是终于支持协程了&#xff08;c作为行业大哥大级别的语言&#xff0c;居然到C20才开始支持协程&#xff0c;我也是无力吐槽了&#xff0c;让多少人等了多少年&#xff0c;等了多少青春&#xff09;但千呼万唤他终于还是来…

基于Matlab实现多个图像融合案例(附上源码+数据集)

图像融合是将多幅图像合成为一幅图像的过程&#xff0c;旨在融合不同图像的信息以获得更多的细节和更丰富的视觉效果。在本文中&#xff0c;我们将介绍如何使用Matlab实现图像融合。 文章目录 简单案例源码数据集下载 简单案例 首先&#xff0c;我们需要了解图像融合的两种主…

【STM32】IIC的初步使用

IIC简介 物理层 连接多个devices 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中&#xff0c;可连接多个 I2C 通讯设备&#xff0c;支持多个通讯主机及多个通讯从机。 两根线 一个 I2C 总线只使用两条总线线路&#xff0c;一条双向串行数…

Android Studio 汉化

一、汉化&#xff1a; 查看版本号&#xff0c;查看Android Studio版本&#xff0c;根据版本下载对应的汉化包。例如我的是223。 下载汉化包&#xff1a; 中文语言包下载地址 找到对应的版本 回到Android Studio 1、进入设置 2、从磁盘安装插件 3、选择下载好的包点击OK 4、…

介绍OpenCV

OpenCV是一个开源计算机视觉库&#xff0c;可用于各种任务&#xff0c;如物体识别、人脸识别、运动跟踪、图像处理和视频处理等。它最初由英特尔公司开发&#xff0c;目前由跨学科开发人员社区维护和支持。OpenCV可以在多个平台上运行&#xff0c;包括Windows、Linux、Android和…

AJAX学习笔记6 JQuery对AJAX进行封装

AJAX学习笔记5同步与异步理解_biubiubiu0706的博客-CSDN博客 AJAX请求相关的代码都是类似的&#xff0c;有很多重复的代码&#xff0c;这些重复的代码能不能不写&#xff0c;能不能封装一个工具类。要发送ajax请求的话&#xff0c;就直接调用这个工具类中的相关函数即可。 用J…

深圳-海岸城购物中心数据分析

做数据分析的时候&#xff0c;如果要对商场进行分析&#xff0c;可以从这些数据纬度进行分析&#xff0c;如下图所示&#xff1a; 截图来源于数位观察&#xff1a;https://www.swguancha.com/

如何炒伦敦金

由于疫情的影响&#xff0c;目前世界上多个国家降低存款利率&#xff0c;以推动经济发展&#xff0c;由此也引发了比较严重的通胀问题&#xff0c;尤其是在俄乌冲突之后&#xff0c;国际油价不断上涨&#xff0c;加大了这种通货膨胀的影响。进行伦敦金投资是一种规避通胀的好方…

Python爬虫-某网酒店数据

前言 本文是该专栏的第5篇,后面会持续分享python爬虫案例干货,记得关注。 本文以某网的酒店数据为例,实现根据目标城市获取酒店数据。具体思路和方法跟着笔者直接往下看正文详细内容。(附带完整代码) 正文 地址:aHR0cHM6Ly93d3cuYnRoaG90ZWxzLmNvbS9saXN0L3NoYW5naGFp …