JUnit5学习之二:Assumptions类
欢迎访问我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
关于《JUnit5学习》系列
《JUnit5学习》系列旨在通过实战提升SpringBoot环境下的单元测试技能,一共八篇文章,链接如下:
- 基本操作
- Assumptions类
- Assertions类
- 按条件执行
- 标签(Tag)和自定义注解
- 参数化测试(Parameterized Tests)基础
- 参数化测试(Parameterized Tests)进阶
- 综合进阶(终篇)
本篇概览
本文是《JUnit5学习》系列的第二篇,学习一个重要的知识点:Assumptions类,只有了解了它们,才好继续后面的学习,全篇章节如下:
- Assertions和Assumptions简介
- 写一段代码对比效果
- Assumptions编码
- 查看执行结果
源码下载
- 如果您不想编码,可以在GitHub下载所有源码,地址和链接信息如下表所示:
| 名称 | 链接 | 备注 |
|---|---|---|
| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
- 这个git项目中有多个文件夹,本章的应用在junitpractice文件夹下,如下图红框所示:

- junitpractice是父子结构的工程,本篇的代码在assertassume子工程中,如下图:

Assertions和Assumptions简介
Assumptions和Assertions容易混淆,因此这里通过对比它们来学习:
- Assertions即断言类,里面提供了很多静态方法,例如assertTrue,如果assertTrue的入参为false,就会抛出AssertionFailedError异常,Junit对抛出此异常的方法判定为失败;
- Assumptions即假设类,里面提供了很多静态方法,例如assumeTrue,如果assumeTrue的入参为false,就会抛出TestAbortedException异常,Junit对抛出此异常的方法判定为跳过;
- 简单的说,Assertions的方法抛出异常意味着测试不通过,Assumptions的方法抛出异常意味着测试被跳过(为什么称为"跳过"?因为mvn test的执行结果被标记为Skipped);
写一段代码对比效果
- 用代码来验证的效果最好,如下所示,一共四个方法,assertSuccess不抛出AssertionFailedError异常,assertFail抛出AssertionFailedError异常,assumpSuccess不抛出TestAbortedException异常,assumpFail抛出TestAbortedException异常
package com.bolingcavalry.assertassume.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
@SpringBootTest
@Slf4j
public class AssertAssumpTest {
/**
* 最简单的成功用例
*/
@Test
void assertSuccess() {
assertEquals(2, Math.addExact(1,1));
}
/**
* 最简单的失败用例
*/
@Test
void assertFail() {
assertEquals(3, Math.addExact(1,1));
}
/**
* assumeTrue不抛出异常的用例
*/
@Test
void assumpSuccess() {
// assumeTrue方法的入参如果为true,就不会抛出异常,后面的代码才会继续执行
assumeTrue(true);
// 如果打印出此日志,证明assumeTrue方法没有抛出异常
log.info("assumpSuccess的assumeTrue执行完成");
// 接下来是常规的单元测试逻辑
assertEquals(2, Math.addExact(1,1));
}
/**
* assumeTrue抛出异常的用例
*/
@Test
void assumpFail() {
// assumeTrue方法的入参如果为false,就会抛出TestAbortedException异常,后面就不会执行了
assumeTrue(false, "未通过assumeTrue");
// 如果打印出此日志,证明assumpFail方法没有抛出异常
log.info("assumpFail的assumeTrue执行完成");
// 接下来是常规的单元测试逻辑,但因为前面抛出了异常,就不再执行了
assertEquals(2, Math.addExact(1,1));
}
}
- 点击下图红框位置执行单元测试:

3. 执行结果如下:

4. 另外,在target目录,可以看到surefire插件生成的单元测试报告TEST-com.bolingcavalry.assertassume.service.impl.AssertAssumpTest.xml,如下图所示,testcase节点中出现了skipped节点:

- 上述对比验证再次说明Assertions和Assumptions的区别:都用来对比预期值和实际值,当预期值和实际值不一致时,Assertions的测试结果是执行失败,Assumptions的测试结果是跳过(或者忽略);
Assumptions实战
弄清楚的Assertions和Assumptions的区别,接下来趁热打铁,学习Assumptions类中几个重要的静态方法:assumeTrue、assumingThat
- 最简单的用法如下,可见只有assumeTrue不抛出异常,后面的log.info才会执行:
@Test
@DisplayName("最普通的assume用法")
void tryAssumeTrue() {
assumeTrue("CI".equals(envType));
log.info("CI环境才会打印的assumeTrue");
}
- assumeTrue可以接受Supplier类型作为第二个入参,如果assumeTrue失败就会将第二个参数的内容作为失败提示:
@Test
@DisplayName("assume失败时带自定义错误信息")
void tryAssumeTrueWithMessage() {
// 第二个入参是Supplier实现,返回的内容用作跳过用例时的提示信息
assumeTrue("CI".equals(envType),
() -> "环境不匹配而跳过,当前环境:" + envType);
log.info("CI环境才会打印的tryAssumeTrueWithMessage");
}
效果如下图:

3. 还有个assumingThat方法,可以接受Executable类型作为第二个入参,如果第一个入参为true就会执行Executable的execute方法,注意assumingThat方法的特点:不抛出异常,因此其所在的方法不会被跳过,这是和assumeTrue相比最大的区别(assumeTrue一旦入参为false就会抛出异常,其所在方法就被标记为跳过):
@Test
@DisplayName("assume成功时执行指定逻辑")
void tryAssumingThat() {
// 第二个入参是Executable实现,
// 当第一个参数为true时,执行第二个参数的execute方法
assumingThat("CI".equals(envType),
() -> {
log.info("这一行内容只有在CI环境才会打印");
});
log.info("无论什么环境都会打印的tryAssumingThat");
}
- 接下来咱们执行上述代码,看看效果;
执行Assumptions代码
- 先做准备工作,本次实战的springboot工程名为assertassume,咱们在工程的resources目录下添加两个配置文件:application.properties和application-test.properties,位置如下图:

2. application-test.properties内容如下:
envType:CI
- application.properties内容如下:
envType:PRODUCTION
- 完整的单元测试类如下,通过注解ActiveProfiles,指定了使用application-test.properties的配置,因此envType的值为CI:
package com.bolingcavalry.assertassume.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
@SpringBootTest
@Slf4j
@ActiveProfiles("test")
public class AssumptionsTest {
@Value("${envType}")
private String envType;
@Test
@DisplayName("最普通的assume用法")
void tryAssumeTrue() {
assumeTrue("CI".equals(envType));
log.info("CI环境才会打印的assumeTrue");
}
@Test
@DisplayName("assume失败时带自定义错误信息")
void tryAssumeTrueWithMessage() {
// 第二个入参是Supplier实现,返回的内容用作跳过用例时的提示信息
assumeTrue("CI".equals(envType),
() -> "环境不匹配而跳过,当前环境:" + envType);
log.info("CI环境才会打印的tryAssumeTrueWithMessage");
}
@Test
@DisplayName("assume成功时执行指定逻辑")
void tryAssumingThat() {
// 第二个入参是Executable实现,
// 当第一个参数为true时,执行第二个参数的execute方法
assumingThat("CI".equals(envType),
() -> {
log.info("这一行内容只有在CI环境才会打印");
});
log.info("无论什么环境都会打印的tryAssumingThat");
}
}
- 执行结果如下图,可见assume通过,所有信息都被打印出来了:

- 接下来把代码中的ActiveProfiles注解那一行注释掉,如下图红框:

- 执行结果如下,可见tryAssumingThat方法被标记为成功,不过从日志可见assumingThat的第二个入参executable没有被执行:

- 至此,Assumptions类的常用方法体验完成,接下来的章节会继续学习其他常用类;
你不孤单,欣宸原创一路相伴
欢迎关注公众号:程序员欣宸
微信搜索「程序员欣宸」,我是欣宸,期待与您一同畅游Java世界...
https://github.com/zq2599/blog_demos
JUnit5学习之二:Assumptions类的更多相关文章
- UML学习(二)-----类图
UML学习(二)-----类图 http://www.cnblogs.com/silent2012/archive/2011/09/07/2169946.html http://www.cnblogs ...
- JUnit5学习之三:Assertions类
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- kotlin学习(二)——类
Kotlin中的类遵循一个简单的结构.尽管与Java有一点细微的差别.你可以使用try.kotlinlang.org在不需要一个真正的项目和不需要部署到机器的前提下来测试一些简单的代码范例. 1. 怎 ...
- 转载:UML学习(二)-----类图(silent)
原文:http://www.cnblogs.com/huiy/p/8552607.html 1.什么是类图 类图(Class diagram)主要用于描述系统的结构化设计.类图也是最常用的UML图,用 ...
- 转:C#制作ORM映射学习笔记二 配置类及Sql语句生成类
在正式开始实现ORM之前还有一点准备工作需要完成,第一是实现一个配置类,这个很简单的就是通过静态变量来保存数据库的一些连接信息,等同于.net项目中的web.config的功能:第二需要设计实现一个s ...
- Python学习日记(二十三) 类命名空间和组合
类命名空间 在一个类中它的函数(方法)属于动态属性,直接定义的变量属于静态属性 首先先定义一个类,并在这个类里面加入静态变量.属性等然后将一个对象实例化 class Fighter: #定义一个战机的 ...
- Django学习笔记二
Django学习笔记二 模型类,字段,选项,查询,关联,聚合函数,管理器, 一 字段属性和选项 1.1 模型类属性命名限制 1)不能是python的保留关键字. 2)不允许使用连续的下划线,这是由dj ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...
- PHP中的MySQLi扩展学习(二)mysqli类的一些少见的属性方法
虽说是少见的一些属性方法,但是可能还是有不少同学在日常的开发中使用过,这里只是学习了可能相对来说我们用得比较少的一些 mysqli 的属性或方法.就当是扩展一下自己的知识体系. 切换用户 首先就是切换 ...
随机推荐
- 关于项目中Spring版本与jdk1.8兼容问题解决
问题描述: 在用公司的工具搭建项目时,由于使用Spring框架,同时要求jdk版本为1.8:当部署完成以后,项目总是无法运行,会报错: Context namespace element 'annot ...
- Spark练习之wordcount,基于排序机制的wordcount
Spark练习之wordcount 一.原理及其剖析 二.pom.xml 三.使用Java进行spark的wordcount练习 四.使用scala进行spark的wordcount练习 五.基于排序 ...
- PHP-表单提交(form)
PHP-表单提交 一 form表单 GET 将表单内容附加到URL地址后面,提交的信息长度有限制,不可以超过8192个字节,同时不具有保密性,而且只能传送ASCII字符(一般传送的不保密性数据 ...
- 小白搭建WNMP详细教程---NGINX、MYSQL、PHP的整合配置
我自定义安装后的目录结构如下: 安装在D盘的WNMP下,其中WWW是网站的目录.ZIPS是放压缩包文件. 一.配置环境变量 在桌面右击我的电脑,选择属性,出现窗口后,按下图所示操作: 点击编辑后,会出 ...
- linux(8)Linux 查看端口占用情况
前言 平常使用linux,我们经常需要查看哪个服务占用了哪个端口,接下来就为大家介绍了2种 Linux 查看端口占用情况可以使用 lsof 和 netstat 命令. 1. lsof -i:端口号 用 ...
- 数据结构-kmp算法
定义 改进字符串的匹配算法 关键:通过实现一个包含了模式串的局部匹配信息的next()函数,利用匹配失败的信息,减少匹配次数. 1.BF算法 暴力匹配 给定 文本串S "BBC ABCDAB ...
- 用Python修改本机适配器信息
主要参考来自[用Python干实事(一)自动修改Windows的IP.网关和DNS设置]. 使用_winreg模块来操作注册表实现相关信息的修改,它是python的内置模块.也可以通过Win32 Ex ...
- hdu2049 不容易系列之(4)——考新郎(组合,错排)
题意: n 个数中 m 个数错排的情况个数. 思路: 先从 n 个数中选出 m 个,即 $C_n^m$, 再算出 m 个数的错排数,即 ${f_{\left( m \right)}}$. 错排: 当n ...
- Buy the Ticket HDU - 1133 大数dp
题意: 演唱会门票售票处,那里最开始没有零钱.每一张门票是50元,人们只会拿着100元和50元去买票,有n个人是拿着50元买票,m个人拿着100元去买票. n+m个人按照某个顺序按序买票,如果一个人拿 ...
- 洛谷 P1525 关押罪犯 (贪心,扩展域并查集)
题意:有\(n\)个罪犯,\(m\)对罪犯之间有仇,现在将这些罪犯分到两个监狱里去,问两个监狱里有仇罪犯之间的最大权值最小为多少. 题解:先按边权从大到小排序,然后贪心,边权大的两个罪犯,我们一定要先 ...