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

【软件测试】单元测试工具---Junit详解

1.junit

1.1 junit是什么

JUnit是一个Java语言的单元测试框架。

虽然我们已经学习了selenium测试框架,但是有的时候测试用例很多,我们需要一个测试工具来管理这些测试用例,Junit就是一个很好的管理工具,简单来说Junit是一个针对Java单元测试的框架。Junit由Junit Platform _ Junit Jupiter + junit Vintage3部分组成。

1.2 Junit和Selenium的关系

Junit和Selenium是完全不同的两个东西!!!

在一个灯串上,如果说selenium编写的测试用例是一个小灯泡,那么junit就是把它们串起来的线。junit是用来管理selenium的测试用例的。

在这里插入图片描述

2.junit技术

2.0 前置工作

在pom.xml文件中添加依赖

引入selenium:

        <dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.7.2</version></dependency><!-- https://mvnrepository.com/artifact/commons-io/commons-io --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</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>

测试套件:

        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite --><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-engine</artifactId><version>5.9.1</version><scope>test</scope></dependency>

2.1 junit常用注解

@Test

@Test表示当前的方法是一个测试用例

使用:

@Test
void + 方法名(){}

举例:

    //表示当前的方法是一个测试用例@Testvoid Test01(){// 创建了一个options对象,用来给请求设置一些参数ChromeOptions options = new ChromeOptions();// 允许所有的请求options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");// 创建了一个驱动WebDriver webDriver = new ChromeDriver(options);//打开百度webDriver.get("https://www.baidu.com/");}

@BeforeAll 和 @AfterAll

这两个注解在整个测试的时候会执行一次。

@BeforeAll表示在当前类所有测试用例执行之前运行
@AfterAll表示在当前类所有测试用例执行之后运行
并且这两个方法都有static修饰,都只执行一次

使用:

@BeforeAll
static void 方法名(){}

举例:

	//当前类里面所有的测试用例执行之前执行这个方法@BeforeAllstatic void SetUp(){System.out.println("开始执行@BeforeAll修饰的方法");}

使用:

@AfterAll
static void 方法名(){}

举例:

	//当前类里面所有的测试用例执行之后执行这个方法@AfterAllstatic void TearDown(){System.out.println("开始执行@AfterAll对应的方法");}

运行结果:
在这里插入图片描述

@BeforeEach 和 @AfterEach

这两个注解会在每一个测试用例执行的时候都执行一次。

  • @BeforeEach表示在每个测试方法执行前运行
  • @AfterEach表示在每个测试方法执行后运行

举例:

    @BeforeEachvoid BeforeTest(){System.out.println("这是一个@BeforeEach注解");}@AfterEachvoid AfterTest(){System.out.println("这是一个@AfterEach注解");}

结果:
在这里插入图片描述

@Disabled

作用:忽略当前的测试用例

举例:

    //忽略当前的测试用例@Disabled//表示当前的方法是一个测试用例@Testvoid Test01(){// 创建了一个options对象,用来给请求设置一些参数ChromeOptions options = new ChromeOptions();// 允许所有的请求options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");// 创建了一个驱动WebDriver webDriver = new ChromeDriver(options);//打开百度webDriver.get("https://www.baidu.com/");}

结果:并没有执行这个测试用例

在这里插入图片描述

2.2 junit测试用例执行顺序

有人觉得junit的测试顺序是从上到下的,是这样吗?

先来看一个示例:

    @Testvoid Test06(){System.out.println("这是测试用例5");}@Testvoid Test05(){System.out.println("这是测试用例4");}@Testvoid Test04(){System.out.println("这是测试用例3");}@Testvoid Test02(){System.out.println("这是测试用例1");}@Testvoid Test03(){System.out.println("这是测试用例2");}

结果:

在这里插入图片描述

以上结果表明了它不是按照从上到下执行的测试用例。

指定顺序执行

使用@TestMethodOrder(MethodOrderer.OrderAnnotation.class)+ @Order(数字)注解顺序执行测试用例。

举例:

//按照指定顺序执行测试用例
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {@Order(1)@Testvoid Test06(){System.out.println("这是测试用例5");}@Order(2)@Testvoid Test05(){System.out.println("这是测试用例4");}@Order(3)@Testvoid Test04(){System.out.println("这是测试用例3");}@Order(4)@Testvoid Test02(){System.out.println("这是测试用例1");}@Order(5)@Testvoid Test03(){System.out.println("这是测试用例2");}
}

结果:
在这里插入图片描述
是按照order里面的顺序执行的。

随机执行

使用@TestMethodOrder(MethodOrderer.Random.class)随机执行测试用例。

举例:

//按照随机顺序执行测试用例
@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest {@Order(1)@Testvoid Test06(){System.out.println("这是测试用例5");}@Order(2)@Testvoid Test05(){System.out.println("这是测试用例4");}@Order(3)@Testvoid Test04(){System.out.println("这是测试用例3");}@Order(4)@Testvoid Test02(){System.out.println("这是测试用例1");}@Order(5)@Testvoid Test03(){System.out.println("这是测试用例2");}
}

2.3 参数化测试

测试方法一般需要传参数。

单参数

使用 @ParameterizedTest + @ValueSource() 配合传递单参数

@ParameterizedTest : 注册参数

!!!注意:这两个注解不能和@Test一起使用,并且只能传一种类型的参数

示例:

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

结果:
在这里插入图片描述

多参数

上面只可以传入一种类型的参数,所以如果我们需要传入多种类型的参数,就可以使用csv 。

CSV

①直接传参数:使用@ParameterizedTest + @CsvSource()配合

举例:

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

结果:
在这里插入图片描述

②传递文件:使用@ParameterizedTest+ @CsvFileSource(resources = "文件名.csv")配合

!!!注意:文件必须是.csv类型

示例:

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

test01.csv文件内容:

1,温温
2,苏苏
3,怜怜

结果:
在这里插入图片描述

方法传参

使用@ParameterizedTest + @MethodSource("方法名") 传入一个方法

示例:

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

Generator方法代码:

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

结果:
在这里插入图片描述

2.4 断言

在软件测试中,断言(Assertion)是一种用于检查程序或系统在执行某些操作或运行某些代码后是否符合预期行为的技术手段。在测试中,断言通常用于验证代码的正确性,确保代码在满足特定条件时会产生预期的结果。

示例:

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

2.5 测试套件

测试套件(test suite)有时也称为验证套件(validation suite),是许多测试用例的集合,测试用例可用来测试一程式是否正确工作,测试套件包括许多测试用例,一般也会有针对测试用例及其测试目的的详细说明,在进行测试时的系统组态资讯以及测试前需进行的步骤。

通过测试套件,将服务于同一个测试目的或同一运行环境下的一系列测试用例有机的组合起来。测试套件是按照测试计划所定义的各个阶段的测试目标决定的,即先有测试计划,后面才有测试套件。

例如:此时有三个类的测试用例都需要测试。
在这里插入图片描述

通过测试套件全部测试:

方法①:在括号中写入测试类

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

方法②:根据指定的包来运行多个测试用例

@Suite
@SelectPackages({"org.example.junit01","org.example.junit"})
public class RunSuit {
}

相关文章:

【软件测试】单元测试工具---Junit详解

1.junit 1.1 junit是什么 JUnit是一个Java语言的单元测试框架。 虽然我们已经学习了selenium测试框架&#xff0c;但是有的时候测试用例很多&#xff0c;我们需要一个测试工具来管理这些测试用例&#xff0c;Junit就是一个很好的管理工具&#xff0c;简单来说Junit是一个针对…...

【算法基础:搜索与图论】3.4 求最短路算法(Dijkstrabellman-fordspfaFloyd)

文章目录 求最短路算法总览Dijkstra朴素 Dijkstra 算法&#xff08;⭐原理讲解&#xff01;⭐重要&#xff01;&#xff09;&#xff08;用于稠密图&#xff09;例题&#xff1a;849. Dijkstra求最短路 I代码1——使用邻接表代码2——使用邻接矩阵 补充&#xff1a;稠密图和稀疏…...

【Matlab】基于卷积神经网络的数据分类预测(Excel可直接替换数据)

【Matlab】基于卷积神经网络的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 基于卷积神经网络(Convolutional Neural Network,CNN)的数据分类预测是一种常见的深度学习方法,广泛应用于图像识…...

【C++ 重要知识点总结】自定义类型-枚举和联合

复杂类型 除了类之外还有Union、Enum连个特殊的类型。 Union 概念 union即为联合&#xff0c;它是一种特殊的类。通过关键字union进行定义&#xff0c;一个union可以有多个数据成员。 union Token{char cval;int ival;double dval; };用法 互斥赋值。在任意时刻&#xff0c…...

Centos MySql安装,手动安装保姆级教程

1.删除原有的mariadb&#xff0c;不然mysql装不进去 查询MAriaDB命令 rpm -qa|grep mariadb 删除 rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64 &#xff08;yum -y remove mysql 如需要清除服务器上以前安装过的MySQL可执行此命令&#xff0c;执行前一…...

电脑C盘空间大小调整 --- 扩容(扩大/缩小)--磁盘分区大小调整/移动

概述&#xff1a; 此方法适合C盘右边没有可分配空间&#xff08;空闲空间&#xff09;的情况&#xff0c;D盘有数据不方便删除D盘分区的情况下&#xff0c;可以使用傲梅分区助手软件进行跨分区调整分区大小&#xff0c;不会损坏数据。反之可直接使用系统的磁盘管理工具进行调整…...

centos7设置网桥网卡

安装bridge-utils yum install bridge-utils修改ens33 网卡 TYPEEthernet BOOTPROTOnone DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FATALno NAMEens33 UUID04b97484-25c8-45c7-8c8c-e335e8080e10 DEVICEens33 ONBOOTye…...

TCP模型和工作沟通方式

我们如何与客户沟通&#xff1f;理科生和技术人员可能在沟通技巧方面有所欠缺。 那么我们如何理解和掌握沟通的原则和技巧呢&#xff1f;我发现TCP网络交互模型很好的描述了沟通的原则和要点。下面我们就从TCP来讲沟通的过程。 TCP的客户端就像客户&#xff08;甲方&#xff…...

Langchain 的 ConversationSummaryBufferMemory

Langchain 的 ConversationSummaryBufferMemory ConversationSummaryBufferMemory 在内存中保留最近交互的缓冲区&#xff0c;但不仅仅是完全刷新旧的交互&#xff0c;而是将它们编译成摘要并使用两者。但与之前的实现不同的是&#xff0c;它使用令牌长度而不是交互次数来确定何…...

【Rust 基础篇】Rust 通道实现单个消费者多个生产者模式

导言 在 Rust 中&#xff0c;我们可以使用通道&#xff08;Channel&#xff09;来实现单个消费者多个生产者模式&#xff0c;简称为 MPMC。MPMC 是一种常见的并发模式&#xff0c;适用于多个线程同时向一个通道发送数据&#xff0c;而另一个线程从通道中消费数据的场景。本篇博…...

HTTP协议各版本介绍

HTTP协议是一种用于传输Web页面和其他资源的协议。 下面详细介绍一下HTTP的各个版本&#xff1a; 1.HTTP/0.9 这是最早的HTTP版本&#xff0c;于1991年发布。它非常简单&#xff0c;只能传输HTML格式的文本&#xff0c;并且不支持其他类型的资源、请求头和状态码。 2.HTTP/1…...

玩转ChatGPT:Custom instructions (vol. 1)

一、写在前面 据说GPT-4又被削了&#xff0c;前几天让TA改代码&#xff0c;来来回回好几次才成功。 可以看到之前3小时25条的限制&#xff0c;现在改成了3小时50条&#xff0c;可不可以理解为&#xff1a;以前一个指令能完成的任务&#xff0c;现在得两条指令&#xff1f; 可…...

黄东旭:The Future of Database,掀开 TiDB Serverless 的引擎盖

在 PingCAP 用户峰会 2023 上&#xff0c; PingCAP 联合创始人兼 CTO 黄东旭 分享了“The Future of Database”为主题的演讲&#xff0c; 介绍了 TiDB Serverless 作为未来一代数据库的核心设计理念。黄东旭 通过分享个人经历和示例&#xff0c;强调了数据库的服务化而非服务化…...

Linux环境搭建(XShell+云服务器)

好久不见啊&#xff0c;放假也有一周左右了&#xff0c;简单休息了下&#xff08;就是玩了几天~~&#xff09;&#xff0c;最近也是在学习Linux&#xff0c;现在正在初步的学习阶段&#xff0c;本篇将会简单的介绍一下Linux操作系统和介绍Linux环境的安装与配置&#xff0c;来帮…...

-bash: /bin/rm: Argument list too long

有套数据库环境&#xff0c;.aud文件太多导致/u01分区使用率过高&#xff0c;rm清理时发现报错如下 [rootdb1 audit]# rm -rf ASM1_ora_*202*.aud -bash: /bin/rm: Argument list too long [rootdb1 audit]# rm -rf ASM1_ora_*20200*.aud -bash: /bin/rm: Argument list too…...

5个步骤完成Linux 搭建Jdk1.8环境

1&#xff1a;首先&#xff0c;在Linux系统中创建一个目录&#xff0c;用于存放JDK文件。可以选择在/opt目录下创建一个新的文件夹&#xff0c;例如/opt/jdk。 sudo mkdir /opt/jdk 2&#xff1a;将下载的jdk-8u381-linux-x64.tar.gz文件复制到新创建的目录中。 sudo cp jdk…...

【JAVASE】运算符

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 运算符 1. 什么是运算符2. 算术运算符3.…...

Emacs之改造搜索文件fd-dired(基于fd命令)(一百二十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…...

字典序排数(力扣)思维 JAVA

给你一个整数 n &#xff0c;按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;[1,10,11,12,13,2,3,4,5,6,7,8,9] 示例 2&#xff1a; 输入&#xff1a;n 2 输…...

NLP 中的pad/padding操作代码分析

今天分析一下NLP中的pad操作代码&#xff1a; 该方法的作用是将输入的序列列表seqs进行填充操作&#xff0c;使其具有相同的长度&#xff0c;以便进行批处理。填充使用指定的pad_token进行&#xff0c;并生成一个对应的mask标志列表&#xff0c;用于标记哪些部分是填充内容&am…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...