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

news/2024/5/19 16:40:28

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 {
}

http://www.mrgr.cn/p/25155361

相关文章

Spring Cloud Gateway - 新一代微服务API网关

Spring Cloud Gateway - 新一代微服务API网关 文章目录 Spring Cloud Gateway - 新一代微服务API网关1.网关介绍2.Spring Cloud Gateway介绍3.Spring Cloud Gateway的特性4.Spring Cloud Gateway的三大核心概念5.Gateway工作流程6.Gateway核心配置7.动态路由8.Predicate自定义P…

uniapp实现预约时间选择弹窗组件

做了个组件&#xff0c;实现出当日预约时间组件&#xff0c;效果图如下 废话不多说&#xff0c;直接上代码&#xff0c;代码简单&#xff0c;参数自己任意改 <template><view class"inventory"><u-popup :show"show" :round"10"…

windows环境安装elasticsearch+kibana并完成JAVA客户端查询

下载elasticsearch和kibana安装包 原文连接&#xff1a;https://juejin.cn/post/7261262567304298554 elasticsearch官网下载比较慢&#xff0c;有时还打不开&#xff0c;可以通过https://elasticsearch.cn/download/下载&#xff0c;先找到对应的版本&#xff0c;最好使用迅…

Docker 入门终极指南[详细]

前言 富 Web 时代&#xff0c;应用变得越来越强大&#xff0c;与此同时也越来越复杂。集群部署、隔离环境、灰度发布以及动态扩容缺一不可&#xff0c;而容器化则成为中间的必要桥梁。 本节我们就来探索一下 Docker 的神秘世界&#xff0c;从零到一掌握 Docker 的基本原理与实…

【Java】零基础上手SpringBoot学习日记(day1)

前言 此帖为本人学习Springboot时的笔记&#xff0c;由于是个接触计算机一年左右的新手&#xff0c;也没有网站开发经验&#xff0c;所以有些地方的理解会比较浅显并且可能会出现错误&#xff0c;望大佬们多多包涵和指正。 Web应用开发 在我的理解中&#xff0c;Web应用的开发…

opencv-28 自适应阈值处理-cv2.adaptiveThreshold()

什么是自适应阈值处理? 对于色彩均衡的图像&#xff0c;直接使用一个阈值就能完成对图像的阈值化处理。但是&#xff0c;有时图像的色彩是不均衡的&#xff0c;此时如果只使用一个阈值&#xff0c;就无法得到清晰有效的阈值分割结果图像。 有一种改进的阈值处理技术&#xff…

基础概念:图片的卷积可视化结果

1. 前言 之前介绍过卷积的基本概念&#xff0c;具体的可以参考图片的卷积和池化操作&#xff0c;这里给出可视化的操作&#xff0c;因为卷积在初学的时候比较抽象&#xff0c;现在有时间就写写看&#xff0c;希望可以给初学的同学一点启发吧(这里前提是学过pytorch和相关的图像…

【C++入门到精通】C++入门 —— 类和对象(初始化列表、Static成员、友元、内部类、匿名对象)

目录 一、初始化列表 ⭕初始化列表概念 ⭕初始化列表的优点 ⭕使用场景 ⭕explicit关键字 二、Static成员 ⭕Static成员概念 &#x1f534;静态数据成员&#xff1a; &#x1f534;静态函数成员&#xff1a; ⭕使用静态成员的优点 ⭕使用静态成员的注意事项 三、友…

大数据面试题之Elasticsearch:每日三题(七)

大数据面试题之Elasticsearch:每日三题 1.Elasticsearch索引文档的流程&#xff1f;2.Elasticsearch更新和删除文档的流程&#xff1f;3.Elasticsearch搜索的流程&#xff1f; 1.Elasticsearch索引文档的流程&#xff1f; 协调节点默认使用文档ID参与计算(也支持通过routing)&a…

微服务项目,maven无法加载其他服务依赖

微服务项目&#xff0c;导入了工具类工程&#xff0c;但是一直报错&#xff0c;没有该类&#xff0c; 检查maven 这里的Maven的版本与idea版本不匹配可能是导致依赖加载失败的最重要原因 检查maven配置&#xff0c;我这是原来的maven&#xff0c;home 修改之后,就不报错了

秒级体验本地调试远程 k8s 中的服务

点击上方蓝色字体&#xff0c;选择“设为星标” 回复”云原生“获取基础架构实践 背景 在这个以k8s为云os的时代&#xff0c;程序员在日常的开发过程中&#xff0c;肯定会遇到各种问题&#xff0c;比如&#xff1a;本地开发完&#xff0c;需要部署到远程k8s集群&#xff0c;本地…

TCP/IP协议详解(二)

目录内容 TCP协议的可靠性 TCP的三次握手 TCP的四次挥手 C#中&#xff0c;TCP/IP建立 三次握手和四次挥手常见面试题 在上一篇文章中讲解了TCP/IP的由来以及报文格式&#xff0c;详情请见上一篇文章&#xff0c;现在接着来讲讲TCP/IP的可靠性以及通过代码的实现。 在TCP首部的…

算法通过村第二关-链表白银笔记|指定区间反转

文章目录 前言链表反转|指定区间内头插法&#xff1a;穿针引线法&#xff1a; 总结 前言 提示&#xff1a;人啊&#xff0c;果然跟花一样&#xff0c;开花前的等待无比漫长&#xff0c;绽放的魅力却转瞬即逝。 链表反转|指定区间内 参考题目&#xff1a;92. 反转链表 II - 力…

Vue(待续)

概念 一套用于构建用户界面的渐进式JavaScript框架 Vue可以自底向上逐层的应用&#xff1a; 简单应用:只需一个轻量小巧的核心库。 复杂应用:可以引入各式各样的Vue插件。 1.采用组件化模式&#xff0c;提高代码复用率、且让代码更好维护。 2.声明式编码&#xff0c;让编码人员…

【iOS】—— 持久化

文章目录 数据持久化的目的iOS中数据持久化方案数据持久化方式分类内存缓存磁盘缓存 沙盒机制获取应用程序的沙盒路径沙盒目录的获取方式 持久化数据存储方式XML属性列表Preferences偏好设置&#xff08;UserDefaults&#xff09;数据库存储什么是序列化和反序列化&#xff0c;…

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…

TCP/IP协议

TCP/IP 是一类协议系统&#xff0c;它是用于网络通信的一套协议集合 物理层 所谓的物理层&#xff0c;是指光纤、电缆或者电磁波等真实存在的物理媒介。这些媒介可以传送物理信号&#xff0c;比如亮度、电压或者振幅。对于数字应用来说&#xff0c;我们只需要两种物理信号来分别…

分冶算法 剑指 07 重建二叉树 排序算法:剑指45 把数组排成最小的数 10-I 斐波那契数列

来记录几个注意事项 1.vector容器里利用find&#xff08;&#xff09;函数 不同于map&#xff08;map有find方法&#xff09;&#xff0c;vector本身是没有find这一方法&#xff0c;其find是依靠algorithm来实现的。 所以要包含头文件 #include <iostream> #include <…

特定Adreno GPU的Android设备发生冻屏问题

1&#xff09;特定Adreno GPU的Android设备发生冻屏问题 ​2&#xff09;Unity版本升级后&#xff0c;iOS加载UnityFramework bundle闪退 3&#xff09;关于RectTransfrom.rect在屏幕空间中表示的相关问题 4&#xff09;Unity Mesh泄露问题 这是第345篇UWA技术知识分享的推送&a…

计算机网络——应用层

文章目录 **1 网络应用模型****2 域名系统DNS****3 文件传输协议FTP****4 电子邮件****4.1 电子邮件系统的组成结构****4.2 电子邮件格式与MIME****4.3 SMTP和POP3** **5 万维网WWW****5.1 HTTP** 1 网络应用模型 客户/服务器模型 C/S 服务器服务于许多来自其他称为客户机的主…