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;仅仅根据输入像素值计算…

c++中的常用知识点总结

命名空间 使用命名空间之后&#xff0c;调用代码时可以省去也可以不省去相关的前缀。 #include <iostream>using namespace std;//使用c自己的命名空间 int main() {int num1 10;std::cout << "Hello, World!" << std::endl;cout<<num1&l…

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

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

【元宇宙】区块链,元宇宙最大化的驱动力

如今&#xff0c;一些观察者认为区块链是在结构上实现元宇宙的必要条件&#xff0c;而其他人则认为这种说法是荒谬的。人们对于区块链技术本身仍然有很多困惑&#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…

SOME/IP 支持两种序列化方式:TLV 和 TV

SOME/IP 是一种基于 IP 的可扩展面向服务的中间件协议,它可以在车载以太网中实现 ECU 之间的高效通信和互操作性。 SOME/IP 的序列化方式是指将数据结构或对象按照一定的规则转换成字节序列的过程,以便在网络中传输和解析。 SOME/IP 支持两种序列化方式:TLV 和 TV。 TLV是…

C++std::function和std::bind()的概念

std::function&#xff1a; 一个通用的函数封装器&#xff0c;它允许你存储和调用任何可以被调用的东西&#xff0c;例如函数、函数指针、函数对象、Lambda 表达式等。 std::bind&#xff1a; 用于创建函数对象。一个可调用对象的绑定版本&#xff0c;可以提前绑定某些参数&am…

Codeforces Round 260 (Div. 1) B. A Lot of Games(字典树+博弈)

B. A Lot of Games 链接&#xff1a;Codeforces Round 260 (Div. 1) B. A Lot of Games 题意 给定 n n n 个字符串&#xff0c;A和B准备玩一个游戏&#xff0c;每一轮有一个初始空字符串&#xff0c;每人轮流向其中添加字符&#xff0c;要求添加后的字符串必须是这 n n n …

【trie树】CF Edu12 E

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

微信小程序第三方插件申请

记录下小程序申请插件的页面&#xff0c;之前自己找了很久&#xff0c;方便后续使用 1. 先找到自己需要的第三方插件的appid 2. 登录微信公众平台后台&#xff08;mp.weixin.qq.com&#xff09; 3. 打开小程序插件页面 https://mp.weixin.qq.com/wxopen/plugindevdoc?appi…

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

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

AI批量写文章伪原创:基于ChatGPT长文本模型,实现批量改写文章、批量回答问题(长期更新)

import traceback import openai import osopenai.api_key = ""conversation=[{"role": "system", "content": "You are a helpful assistant."}] max_history_len = 20 first_message = Nonedir = rJ:\ai\input #要改写的文…

软件设计的七大原则

一. 软件设计的七大原则 单一职责原则&#xff1a;一个类只负责一个功能领域中的饿相应职责。开闭原则&#xff1a;对扩展开放&#xff0c;对修改关闭&#xff0c;多使用抽象类和接口&#xff0c;应该尽量使这个系统能够扩展新的功能&#xff0c;通过扩展来实现变化&#xff0…

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

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

Mysql 主从复制

简述 start slave; show slave status\G stop slave; reset slave; # delete relay log, create relay log. reset master; # delete bin log, restart.单表超过 500 万行 或 容量超过 2GB, 才推荐分库分表. 如果预计三年后的数据量根本达不到这个级别, 请不要在创建表时就分库…