【软件测试】JUnit详解
文章目录
- 一. Junit是什么?
- 二.Junit中常见的注解
- 1. @Test
- 2. @BeforeAll & @AfterAll
- 3. @BeforeEach & @AfterEach
- 4. @ParameterizedTest参数化
- 5. @Disabled
- 6. @Order
- 三. 测试套件
- 1. 通过class运行测试用例
- 2. 通过包运行测试用例
- 四. 断言
一. Junit是什么?
JUnit是一个用于编写和运行Java程序单元测试的开源框架。
它提供了一组注解和断言方法,以及用于执行测试的测试运行器。通过使用JUnit,开发人员可以轻松地编写自动化测试用例,验证代码的正确性,并且能够快速地发现和修复bug。JUnit的使用可以提高代码的质量和可维护性,同时也有助于进行持续集成和持续测试。它被广泛应用在Java开发领域中,成为了标准的单元测试框架之一。
为什么学了Selenium还需要学习Junit?
Selenium是自动化测试框架;Junit是单元测试框架.
拿着一个技术写自动化测试用例(Selenium3)
拿着一个技术管理已经编写好的测试用例(Junit5)
二.Junit中常见的注解
我们本节博客所学习的是Junit5,Junit5中的注解如下:
| 注解 | 说明 |
|---|---|
| @Test | 标识单元测试方法。 |
| @ParameterizedTest | 标识参数化测试方法。 |
| @RepeatedTest | 标识可重复执行的测试方法。 |
| @TestFactory | 标识动态测试方法,用于生成测试用例。 |
| @BeforeEach | 在每个测试方法之前执行。 |
| @AfterEach | 在每个测试方法之后执行。 |
| @BeforeAll | 在所有测试方法之前执行,只会执行一次。 |
| @AfterAll | 在所有测试方法之后执行,只会执行一次。 |
| @DisplayName | 设置测试类或测试方法的显示名称。 |
| @Disabled | 标识禁用的测试类或测试方法。 |
| @Nested | 声明内部测试类。 |
| @Tag | 为测试类或测试方法添加标签,用于分组和过滤。 |
| @Timeout | 设置测试方法执行超时时间。 |
| @ExtendWith | 注册扩展,用于扩展JUnit的功能。 |
| @RegisterExtension | 注册扩展实例,用于扩展JUnit的功能。 |
上述表格中,其中黑体为常用的注解,也是接下来主要介绍说明的注解.
想要使用Junit5的框架,我们首先要从中央仓库中引入Maven依赖.代码如下所示:
<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.9.1</version></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.1</version></dependency><!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-params</artifactId><version>5.9.1</version></dependency><dependency><groupId>org.junit.platform</groupId><artifactId>junit-platform-suite</artifactId><version>1.9.1</version><scope>test</scope></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>
1. @Test
@Test:用于标识单元测试方法。
@Testvoid Test01() {System.out.println("这是JunitTest里面的Test01");}

2. @BeforeAll & @AfterAll
@BeforeAll:在所有测试方法之前执行,只会执行一次。
@AfterAll:在所有测试方法之后执行,只会执行一次。
@Testvoid Test01() {System.out.println("这是JunitTest里面的Test01");}@Testvoid Test02() {System.out.println("这是JunitTest里面的Test02");}@BeforeAllstatic void SetUp() {System.out.println("这是BeforeAll里面的语句");}@AfterAllstatic void TearDown() {System.out.println("这是AfterAll的语句");}

3. @BeforeEach & @AfterEach
@BeforeEach: 在每个测试方法之前执行。
@AfterEach: 在每个测试方法之后执行。
@Testvoid Test01() {System.out.println("这是JunitTest里面的Test01");}@Testvoid Test02() {System.out.println("这是JunitTest里面的Test02");}@BeforeEachvoid BeforeEachTest() {System.out.println("这是BeforeEach里面的语句");}@AfterEachvoid AfterEachTest() {System.out.println("这是AfterEach里面的语句");}

4. @ParameterizedTest参数化
@ParameterizedTest: 标识参数化测试方法。
-
单参数
@ParameterizedTest@ValueSource(ints = {1, 2, 3})void Test04(int num) {System.out.print(num);}
@ParameterizedTest@ValueSource(strings = {"1", "2", "3"," "})void Test05(String number) {System.out.println(number);System.out.println("=============");}如果想要打印空格可以用空字符串

-
CSV获取参数
@ParameterizedTest@CsvFileSource(resources = "test01.csv")void Test06(String name) {System.out.println(name);}resource:test01.csv:张三1,李四1,王五1 张三2,李四2,王五2 张三3,李四3,1
-
方法获取参数
public static Stream<Arguments> Generator() {return Stream.of(Arguments.arguments(1, "张三"),Arguments.arguments(2, "李四"),Arguments.arguments(3, "王五"));} @ParameterizedTest@MethodSource("Generator")void Test07(int num, String name) {System.out.println(num + ":" + name);}
5. @Disabled
@Disabled: 标识禁用的测试类或测试方法。
@Disabledvoid Test03() {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(6)"));}
执行所有测试用例发现:

Test03未被执行.
6. @Order
@Order 注解是 JUnit 5 中用来指定测试方法执行的顺序的注解。通过给测试方法添加 @Order 注解并指定一个整数值,可以确保测试方法按照指定的顺序执行。
import org.junit.jupiter.api.*;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
//@TestMethodOrder(MethodOrderer.Random.class)
public class JunitTest01 {@Order(2)@Testvoid B() {System.out.println("B测试用例");}@Order(3)@Testvoid Test01() {System.out.println("这是Test01测试用例");}@Order(1)@Testvoid A() {System.out.println("A测试用例");}@Order(4)@Testvoid Test02() {System.out.println("被忽略的测试用例");}}

可以看到,执行顺序使我们所手动指定的顺序.
上述例子中,@TestMethodOrder(MethodOrderer.OrderAnnotation.class) 注解指定了使用 OrderAnnotation 来排序测试方法。然后,每个测试方法都使用 @Order 注解指定了它们应该执行的顺序。
需要注意的是:测试方法的默认执行顺序是不确定的.因此使用 @Order 注解可以提供一致和可预测的执行顺序。
三. 测试套件
测试套件是一种组织和执行一组测试的方式。在JUnit中,可以使用 @RunWith 注解和 Suite 类来创建测试套件。
1. 通过class运行测试用例
@Suite//通过class测试用例运行@SelectClasses({JunitTest03.class, JunitTest.class, JunitTest01.class})public class RunSuite {}

2. 通过包运行测试用例
import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.Suite;@Suite
@SelectPackages(value = {"Test09", "Test08"})
public class RunSuite {
}
package Test08;import org.junit.jupiter.api.Test;public class Test07 {@Testvoid Test007() {System.out.println("Test08 pacage Test007");}
}
package Test09;import org.junit.jupiter.api.Test;public class Test09 {@Testvoid Test01() {System.out.println("package test09 test01");}
}

四. 断言
在 JUnit 5 中,断言方法位于 org.junit.jupiter.api.Assertions 类中。
使用断言可以在测试中验证预期结果是否与实际结果相符。如果断言失败,则测试将被标记为失败,并提供有关错误的详细信息。这有助于快速定位和修复问题。
| 断言方法 | 说明 |
|---|---|
| assertEquals(expected, actual) | 验证两个对象是否相等。可以用于比较基本数据类型、对象和数组。 |
| assertTrue(condition) | 验证条件是否为真。如果条件为真,则测试通过;否则,测试失败。 |
| assertFalse(condition) | 验证条件是否为假。如果条件为假,则测试通过;否则,测试失败。 |
| assertNull(actual) | 验证对象是否为 null。如果对象为 null,则测试通过;否则,测试失败。 |
| assertNotNull(actual) | 验证对象是否不为 null。如果对象不为 null,则测试通过;否则,测试失败。 |
| assertSame(expected, actual) | 验证两个对象引用是否相同。即判断两个对象是否指向同一个内存地址。 |
| assertNotSame(unexpected, actual) | 验证两个对象引用是否不相同。 |
| assertArrayEquals(expectedArray, actualArray) | 验证两个数组是否相等。用于比较数组的元素是否相等。 |
| assertThrows(expectedType, executable) | 验证代码块是否抛出了特定类型的异常。 |
| assertTimeout(duration, executable) | 验证代码块是否在指定的时间内执行完成,超过指定时间则测试失败。 |
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class MyTest {@Testpublic void test() {String str = "Hello, World!";int number = 42;boolean condition = true;assertEquals("Hello, World!", str);assertTrue(number > 0);assertFalse(condition);assertNull(null);assertNotNull(str);}
}
上述例子中.assertFalse(condition);即测试中验证预期结果与实际结果不相符.

相关文章:
【软件测试】JUnit详解
文章目录 一. Junit是什么?二.Junit中常见的注解1. Test2. BeforeAll & AfterAll3. BeforeEach & AfterEach4. ParameterizedTest参数化5. Disabled6. Order 三. 测试套件1. 通过class运行测试用例2. 通过包运行测试用例 四. 断言 一. Junit是什么? JUnit是一个用于…...
hive统计页面停留时间
1、背景:通过业务埋点数据,统计用户在页面的停留时间 样例数据,样例数据存入表tmp, 有如下字段用户uid、动作时间戳time、页面名称pn、动作名称action SELECT 12345 AS uid, 1695613731020 AS time, 搜索 AS pn, click AS acti…...
LeetCode 24.两两交换链表中的结点
题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 题目解析 首先可以特判一下,如果结点数目小于等于1,则直接返回即可,因为数目小于等于1就不需要交换了。 然后我们可以创建一个虚拟的头结点,然…...
【每日一记】OSPF区域划分详讲、划分区域的优点好处
个人名片: 🐼作者简介:一名大二在校生,喜欢编程🎋 🐻❄️个人主页🥇:小新爱学习. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼…...
复旦管院启动科创战略,培养科技研发人才,引领未来发展!
今年夏天,600多位优秀的企业家成为复旦大学EMBA 2023级新生。在疫情结束后,他们选择百战归来再读书,重新回到久违的课堂,共同探索科创大时代下企业的商业本质,开启新的学习与人生旅程。复旦大学管理学院院长陆雄文教授…...
Infinity同步
...
C语言:转义字符
目录 话不多说,先上表 \n \? \ \" \\ \t \a \ddd 附一张ASCII表 \xdd 练习 话不多说,先上表 一一举例解释下哈 \n 读取到结尾标识符\0 printf("demo\n\0Zh"); // demo \? 在书写连续多个问号时使用,防止…...
为什么 0.1 + 0.1 !== 0.2
为什么 0.1 0.1 ! 0.2 总结了几个很有意思的基础题目,分享一下。 为什么 0.1 0.1 ! 0.2 看到这个问题,不得不想到计算机中的数据类型,其中浮点数表示有限的精度。那么它就无法精确的表示所有的十进制小数,所以在在某些情况下…...
超详细!主流大语言模型的技术原理细节汇总!
1.比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节:tokenizer、位置编码、Layer Normalization、激活函数等。 2. 大语言模型的分布式训练技术:数据并行、张量模型并行、流水线并行、3D 并行、零冗余优化器 ZeRO、CPU 卸载技术 ZeRo-offload、混合精度训…...
本人4年测试经验,211 本科计算机专业,由于互联网裁员,然后谈谈我最近测试面试的总结
本人4年测试经验,211 本科计算机专业,由于互联网裁员,最近在 bosss 上投了些简历,测试开发岗,看看目前市场情况。 虽然都在说大环境不好,失业的人很多,我最近约面试的还是比较多的,…...
Android中级——Activity数据恢复过程
Activity数据恢复 onSaveInstanceState()onRestoreInstanceState()扩展 onSaveInstanceState() 在Activity调用onStop()之前调用会onSaveInstanceState(),如下 final void performStopActivity(IBinder token, boolean saveState, String reason) {ActivityClient…...
国内就能使用的chatgpt网页版,包含AIGC应用工具
Chatgpt的出现在多个领域带来了重要的影响。它能够显著提高我们的工作效率,无论是编写文案代码还是回答常见问题,都能在短时间内完成任务。通过Chatgpt,我们能够迅速获取所需答案。随着人工智能技术的不断发展,相信在未来AI能够带…...
Fast DDS之RTPS
目录 RTPS的使用 RTPS层实现了RTPS标准。DDS层概念映射关系如下: DDS LayerRTPS LayerDomainRTPSDomainDomainParticipantRTPSParticipantDataWriterRTPSWriterDataReaderRTPSReader RTPS的使用...
【算法|动态规划No.16】leetcode931. 下降路径最小和
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…...
Jenkins 构建时动态获取参数
文章目录 问题简介Groovy 脚本配置进阶 问题 在做jenkins项目时,有些参数不是固定写死的,而是动态变化的,这时我们可以用 Active Choices 插件来远程调用参数 问题解决方案:执行构建前使用Groovy Scrip调用本地脚本,…...
android app开机自启动
参考文章: Android APP开机启动,安卓APP开发自启动,安卓启动后APP自动启动 Android让程序开机自动运行APP_安卓应用开机启动并打开软件_weijia3624的博客-CSDN博客...
XSS CSRF
XSS & CSRF xss:跨站脚本攻击:注入一些非法的脚本 csrf:冒充身份 XSS 反射型 /welcome:res.send(req.query.type) 输入什么就输出什么(httpOnly:false,但不是解决方案) 比如:?&…...
新加坡星银行项目组笔试题面试题
Java/Fullstack___开发常见问题收集:(根据个人面试岗位进行参考) 项目介绍部分 介绍最近做过的项目,项目中遇到的印象深刻的问题,如何解决?就项目用到的技术,自己的技术以及如何使用࿱…...
基于SpringBoot的智能物流管理系统
目录 前言 一、技术栈 二、系统功能介绍 顾客信息管理 员工信息管理 员工信息管理 门店信息管理 门店信息管理 订单信息管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施…...
【开源电商网站】(2),使用docker-compose和dockerfile进行配置,设置自定义的镜像,安装插件,增加汉化包,支持中文界面汉化。
项目相关代代码地址 相关内容: https://blog.csdn.net/freewebsys/category_12461196.html 原文地址: https://blog.csdn.net/freewebsys/article/details/133666433 包括以下运行的详细代码: https://gitee.com/study-demo-all/oscommerc…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
