单元测试JUnit

  前言👀~

上一章我们介绍了自动化测试工具Selenium,今天讲解单元测试工具JUnit

JUnit

JUnit的使用

JUnit注解

BeforeAll和AfterAll注解

BeforeEach和AfterEach注解

参数化

方法获取参数(动态参数)

断言

用例执行顺序

测试套件


如果各位对文章的内容感兴趣的话,请点点小赞,关注一手不迷路,讲解的内容我会搭配我的理解用我自己的话去解释如果有什么问题的话,欢迎各位评论纠正 🤞🤞🤞

12b46cd836b7495695ce3560ea45749c.jpeg

个人主页:N_0050-CSDN博客

相关专栏:java SE_N_0050的博客-CSDN博客  java数据结构_N_0050的博客-CSDN博客  java EE_N_0050的博客-CSDN博客


JUnit

JUnit 是针对 Java 语言的单元测试框架,前面讲的selenium3,我们通过这个工具写出来的一个个自动化测试用例会发现有很多冗余的内容代码看起来不雅观且不好管理,所以就引出了JUnit相当于我们拿着一个技术来对已经编写好的测试用例进行管理

JUnit的使用

首先添加依赖,去中央存储库中搜索

找到对应的依赖,我这边选择的是5.8.2,代码如下

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.2</version><scope>test</scope>
</dependency>

JUnit注解

下面对JUnit中的注解进行演示,默认使用public修饰

首先导入注解的依赖,代码如下

        <dependency><!--注解用到的API--><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.2</version><scope>compile</scope></dependency>

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

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}
}

@Disabled:表示忽略当前这个测试用例,直接跳过测试。方便修改这个测试用例

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@Disabled//表示忽略当前这个测试用例,直接跳过测试void test2() {System.out.println("我是Disabled注解");}
}

输出结果,只输出了上面test1方法的内容


BeforeAll和AfterAll注解

下面两者注意使用static修饰!

@BeforeAll:表示所有测试用例在跑之前,先去执行BeforeAll注解里的代码。所以做UI自动化通常情况把创建驱动打开网页放在BeforeAll里

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@Testvoid test2() {System.out.println("我是test2注解");}@BeforeAll//所有测试用例执行之前 先执行BeforeAll里的代码static void test3() {System.out.println("我是BeforeAll注解");}
}

输出结果

@AfterAll:表示所有测试用例跑完之后,再去跑AfterAll注解里的代码。关闭浏览器放在BeforeAll

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@Testvoid test2() {System.out.println("我是test2注解");}@BeforeAll//所有测试用例执行之前 先执行BeforeAll里的代码static void test3() {System.out.println("我是BeforeAll注解");}@AfterAll//所有测试用例执行之后 再去执行AfterAll里的代码static void test4() {System.out.println("我是AfterAll注解");}
}

输出结果

BeforeEach和AfterEach注解

@BeforeEach:表示每一个测试用例执行之前BeforeEach里面的代码都要执行一遍

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@Testvoid test2() {System.out.println("我是test2注解");}@BeforeEach//表示每一个方法执行前都会执行一遍BeforeEach里的内容void test3() {System.out.println("我是BeforeEach注解");}
}

输出结果

@AfterEach:表示每一个测试用例执行之后AfterEach里面的代码都要执行一遍

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@Testvoid test2() {System.out.println("我是test2注解");}@AfterEach//表示每一个方法执行后都会执行一遍BeforeEach里的内容void test4() {System.out.println("我是AfterEach注解");}
}

输出结果


参数化

使用@ParameterizedTest标注方法类型为参数化,然后搭配下面讲解的注解使用

使用@ParameterizedTest注解前也需要导入对应的依赖,代码如下

        <dependency><!--参数化用到的API--><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.8.2</version></dependency>

注意使用了这个注解就不要再添加@Test注解,加了的话执行的时候会抛异常!

单参数: @ValueSource(类型={参数1,参数2等}})

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@ParameterizedTest@ValueSource(strings = "我是ValueSource注解")void test2(String s) {System.out.println(s);}
}

输出结果

使用CSV注解获取参数:注意和单参数一样只能传同种类型的参数!

@CsvFileSource:如果参数非常的多我们可以通过这个注解借助文件注入的方式来添加,路径可以指定为当前项目下resource文件中的csv文件(内容使用逗号分割),也可以指定为本地任意文件夹下的csv文件

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@ParameterizedTest@CsvFileSource(resources = "test.csv")void test2(String s) {System.out.println(s);}
}

输出结果


多参数:上面的只能传同种类型的参数,使用多参数注解就可以传递多个不同的参数

@CsvSource:可以传递多个不同类型的参数,参数之间默认的分隔符是逗号,还能手动指定分隔符

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@ParameterizedTest@CsvSource(value = {"1,老六", "2,老八"})void test2(int n, String name) {System.out.println(n + " " + name);}
}

输出结果

还能传入空的字符串!

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}@ParameterizedTest@CsvSource(value = {"1,老六", "2,老八","3,''"})void test2(int n, String name) {System.out.println(n + " " + name);}
}

输出结果

方法获取参数(动态参数)

使用@MethodSource注解,如果没有指定数据来源,则默认找跟用例同名的静态方法

单参数:可以就传同种类型的参数,将方法返回类型改为对应的类型即可

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}public static Stream<String> method() {return Stream.of("坤坤", "坤舞", "坤");}@ParameterizedTest@MethodSource("method")void test2(String name) {System.out.println(name);}
}

输出结果

多参数:可以传不同种类型的参数

public class JUnitTest {@Test//表示当前的这个方法是一个测试用例void test1() {System.out.println("我是Test注解");}public static Stream<Arguments> method() {return Stream.of(Arguments.arguments(1, "签哥"), Arguments.arguments(2, "坤哥"));}@ParameterizedTest@MethodSource("method")void test2(int n, String name) {System.out.println(n + " " + name);}
}

输出结果

断言

写自动化测试,测试的结果就两种要么成功要么失败,我们可以使用断言进行判断,省去那种ifelse语句

使用Assertions类调用assertEquals方法:判断预期值和实际值相等

public class JUnitTest {@ParameterizedTest@ValueSource(ints = 1)void test2(int n) {Assertions.assertEquals(2, n);}
}

输出结果,如果不相等就会报错

使用Assertions类调用assertNotEquals方法:判断预期值和实际值不相等

public class JUnitTest {@ParameterizedTest@ValueSource(ints = 1)void test2(int n) {Assertions.assertNotEquals(1, n);}
}

输出结果,如果相等就会报错

使用Assertions类调用assertNull方法:判断为空

public class JUnitTest {@Testvoid test2() {String s = "s";Assertions.assertNull(s);}
}

输出结果,如果不空就会报错

使用Assertions类调用assertNotNull方法:判断不为空

public class JUnitTest {@Testvoid test2() {String s = null;Assertions.assertNotNull(s);}
}

输出结果,如果为空就会报错


用例执行顺序

junit的默认执行顺序是不确定的 采用的是自己执行顺序对应的算法,但用例执行顺序是固定的。什么意思呢?你可以试试第一次运行的结果和后面运行的结果对比一下,下面进行演示

下面这段代码按道理应该先输出test1方法的内容,再输出A方法的内容,再输出test2方法的内容

public class JUnitTest {@Testvoid test1() {System.out.println("这是junit测试1");}@Testvoid A() {System.out.println("这是junit测试A");}@Testvoid test2() {System.out.println("这是junit测试2");}
}

输出结果

再运行一次输出的结果,还是一样

指定方法执行顺序:使用@TestMethodOrder(MethodOrderer.OrderAnnotation.class)注解搭配@Order注解

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnitTest {@Order(1)@Testvoid test1() {System.out.println("这是junit测试1");}@Order(2)@Testvoid A() {System.out.println("这是junit测试A");}@Order(3)@Testvoid test2() {System.out.println("这是junit测试2");}
}

输出结果

方法随机执行顺序:使用@TestMethodOrder(MethodOrderer.Random.class)注解

@TestMethodOrder(MethodOrderer.Random.class)
public class JUnitTest {@Testvoid test1() {System.out.println("这是junit测试1");}@Testvoid A() {System.out.println("这是junit测试A");}@Testvoid test2() {System.out.println("这是junit测试2");}
}

输出结果

为什么需要用到junit里的排序方法呢?

如果用例之间存在关联关系的话就需要手动指定用例的执行顺序


测试套件

首先也要导入对应的依赖,代码如下

        <dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.8.2</version><scope>test</scope></dependency>

使用@Suite注解:表示当前类是个测试套件,搭配下面的注解使用

 使用@SelectClasses可以通过指定类的方式 添加到套件中并执行里面的所有测试用例

@Suite
@SelectClasses({Test01.class, Test02.class})
public class JUnitTest {}

输出结果

使用@SelectPackages可以通过指定包的方式 添加到套件中并执行测试用例

@Suite
@SelectPackages(value = {"Test1", "Test2"})
public class JUnitTest {}

输出结果

以上便是本章内容关于JUnit一些概念和使用,在自动化测试中还是尤为重要的一部分,我们下一章再见💕

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

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

相关文章

MATLAB优化模型(3)

一、前言 在MATLAB中处理各种优化问题&#xff0c;如背包问题、指派问题&#xff08;也称为分配问题&#xff09;、抽屉原理应用、旅行商问题&#xff08;TSP&#xff09;以及排队论模型&#xff0c;通常需要结合MATLAB的优化工具箱&#xff08;如Optimization Toolbox&#xf…

MTK Android12 分析system_app允许vendor_mtk_audiohal_prop SELinux 权限问题

本文将尝试分析&#xff0c;在开发 Android 12 MTK 平台时遇到了 vendor_mtk_audiohal_prop 属性相关的 SELinux 权限问题。包括如何修改 SELinux 策略以允许 system_app 设置 vendor_mtk_audiohal_prop 属性。 问题描述 希望允许 system_app 设置 vendor_mtk_audiohal_prop 属…

C# Unity 面向对象补全计划 之 初识继承方法与多态

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列旨在通过补全学习之后&#xff0c;给出任意类图都能实现并做到逻辑上严丝合缝 1.继承方法 C# & Unity 面向对象补全计划 之 继承&#xff08;字段与属性&…

如何在立创EDA的PCB电路板导入logo图案

1、首先制作好logo图案&#xff0c;一般为公司logo图标&#xff0c;如下图 2、打开立创EDA的PCB文件&#xff0c;如下图 3、将PCB的图层切换到丝印层&#xff1a; 4、然后选择EDA菜单栏的放置---图片&#xff1a; 5、进入后点击选择图片&#xff0c;将logo图片导入&#xff0c;…

Depth Anything——强大的单目深度估计模型

概述 单目深度估计&#xff08;Monocular Depth Estimation, MDE&#xff09;是一项在计算机视觉领域中非常重要的技术&#xff0c;它旨在从单张图像中恢复出场景的三维结构。这项技术对于机器人导航、自动驾驶汽车、增强现实&#xff08;AR&#xff09;和虚拟现实&#xff08…

在vscode中远程连接linux进行开发

目录 引言 配置过程 1.本机安装OpenSSH 2.本机生成RSA公钥和私钥 3.将rsa公钥添加到远程linux的authorized_keys文件中 4.vscode安装Remote - SSH插件 5.在vscode中ssh连接服务器 6.在本地vscode操作远程linux文件进行开发 7.在vscode上给远程linux机器需安装插件 常…

设计模式 之 —— 抽象工厂模式

目录 什么是抽象工厂模式&#xff1f; 定义 特点 抽象工厂模式&#xff08;java代码示例&#xff09; 首先定义第一个接口 实现第一个接口的类 定义第二个接口 实现第二个接口的类 * 创建抽象工厂类 创建扩展了 AbstractFactory 的工厂类 饮料工厂 食物工厂 * 创建一个…

[Meachines] [Easy] Sense PFSense防火墙RCE

信息收集 IP AddressOpening Ports10.10.10.60TCP:80,443 $ nmap -p- 10.10.10.60 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 80/tcp open http lighttpd 1.4.35 |_http-title: Did not follow redirect to https://10.10.10.60/ |_http-server-header…

Nginx进阶-常见配置(二)

一、nginx 日志配置 nginx 日志介绍 nginx 有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志, 所需日志模块 ngx_http_log_module 的支持&#xff0c;日志格式通过 log_format 命令来定义&#xff0c;日志对于统计和排错是非常有利的&#xff0c;下面总…

Java语言程序设计——篇十一(3)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

[激光原理与应用-118]:电源系统的接地详解:小信号的噪声干扰优化,从良好外壳接地开始

目录 一、电路的基本原理&#xff1a;电流回路 1、电流回路的基本概念 2、电流回路的特性 3、电流回路的类型 4、电流回路的应用 五、电流回路的注意事项 二、交流设备的接地 1.1 概述 1、交流工作接地的定义 2、交流工作接地的作用 3、交流工作接地的规范要求 4、…

C# Unity 面向对象补全计划 之 单例模式

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 了解我的专栏C#面向对象与进阶:http://t.csdnimg.cn/mIitr&#xff0c;尤其是关于类的那篇文章即…

jupyter支持跨机器远程访问

1. 远程访问场景 本地往往缺少GPU设备&#xff0c;为了让我们的代码能在有GPU设备的机器上运行&#xff0c;就需要在远程机器上启动jupyter notebook, 这意味着我们要在本地机器的浏览器上访问远程机器上的jupyter notebook。但是直接按ip访问会报如下错误&#xff1a; 因为ju…

ctfshow-web入门-sql注入(web176-web180)

目录 1、web176 2、web177 3、web178 4、web179 5、web180 1、web176 1 order by 4-- 闭合后简单判断了下字段数是 3 测试联合查询注入&#xff0c;存在关键字的过滤&#xff0c;包括 select 和 union &#xff08;后面经过测试实际只过滤了 select&#xff09; 大小写绕…

Star-CCM+负体积网格检查与出现原因

要使网格可用于有限体积计算&#xff0c;每个网格单元必须具有正体积&#xff0c;否则初始化过程将失败&#xff0c;且模拟计算无法运行。 负体积网格单元可能会以多种不同的方式出现&#xff0c;但必须修复或从网格中移除&#xff0c;才能继续执行任何后续操作。 要检查体网…

力扣hot100-二叉树

文章目录 概要二叉树的基本概念常见的二叉树类型常用的二叉树遍历二叉树的常用技巧 题目&#xff1a;二叉树的中序遍历方法1--递归遍历方法2--使用栈 概要 二叉树&#xff08;Binary Tree&#xff09;是一种树形数据结构&#xff0c;其中每个节点最多有两个子节点&#xff0c;…

docker安装与container基本使用

安装 Homebrew 的 Cask 已经支持 Docker for Mac, mac用户狂喜 brew install --cask --appdir/Applications docker其他入门用法可参考 Docker Hello World- 菜鸟教程 或网上自行搜索博客学习。本文主要记录我运行go-zero-mall用到的一些注意点。当然&#xff0c;gonivinck项…

本地项目提交到Gitee

在项目目录 右键 git bash here 可以在黑屏输入命令 也可以在项目里面 命令都是一样的 要排除哪些 git add . 添加所有文件 git commit -m "Initial commit" 提交到本地 git remote add origin https://gitee.com/xxxx/xxxx.git 添加远程仓库 …

【多线程】线程的五种创建方法

文章目录 线程在 Java 代码中编写多线程程序Thread 标准库 创建线程的写法1 . 继承 Thread 类代码回调函数休眠操作&#xff1a;sleep()抢占式执行观察线程jconsoleIDEA 内置调试器 2 . 实现 Runnable 接口代码 3. 匿名内部类创建 Thread ⼦类对象代码匿名内部类 4.匿名内部类创…

PCB设计经验——布线原则

1.连线精简——避免直角布线 导线也应看作一种元器件&#xff0c;有自己的电阻&#xff0c;电感&#xff0c;电容 PCB走线在直角转弯的地方&#xff0c;信号前后部分相互影响&#xff0c;导致分布电容增加&#xff0c;对信号上升沿和下降沿有延缓影响。从阻抗的角度来说&#…