JUnit5学习之三:Assertions类,字节跳动视频面试分钟
按条件执行
标签(Tag)和自定义注解
参数化测试(Parameterized Tests)基础
参数化测试(Parameterized Tests)进阶
综合进阶(终篇)
本篇概览
本文是《JUnit5学习》系列的第三篇,主要是学习Assertions类(org.junit.jupiter.api.Assertions),Assertions类的一系列静态方法给我们提供了单元测试时常用的断言功能,本篇主要内容如下:
Assertions源码分析
写一段代码,使用Assertions的常用静态方法
使用异常断言
使用超时断言
了解第三方断言库
源码下载
- 如果您不想编码,可以在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源码分析
- 下图是一段最简单最常见的单元测试代码,也就是Assertions.assertEquals方法,及其执行效果:
- 将Assertions.assertEquals方法逐层展开,如下图所示,可见入参expected和actual的值如果不相等,就会在AssertionUtils.fail方法中抛出AssertionFailedError异常:
- 用类图工具查看Assertions类的方法,如下图,大部分是与assertEquals方法类似的判断,例如对象是否为空,数组是否相等,判断失败都会抛出AssertionFailedError异常:
![在这里插入图片描述](https://img-blog.csdnimg.cn/2020100209243
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
2969.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JvbGluZ19jYXZhbHJ5,size_16,color_FFFFFF,t_70#pic_center)
- 判断两个数组是否相等的逻辑与判断两个对象略有不同,可以重点看看,方法源码如下:
public static void assertArrayEquals(Object[] expected, Object[] actual) {
AssertArrayEquals.assertArrayEquals(expected, actual);
}
- 将上述代码逐层展开,在AssertArrayEquals.java中见到了完整的数组比较逻辑,如下图:
- 接下来,咱们编写一些单元测试代码,把Assertions类常用的方法都熟悉一遍;
编码实战
- 打开junitpractice工程的子工程assertassume,新建测试类AssertionsTest.java:
- 最简单的判断,两个入参相等就不抛异常(AssertionFailedError):
@Test
@DisplayName(“最普通的判断”)
void standardTest() {
assertEquals(2, Math.addExact(1, 1));
}
- 还有另一个assertEquals方法,能接受Supplier类型的入参,当判断不通过时才会调用Supplier.get方法获取字符串作为失败提示消息(如果测试通过则Supplier.get方法不会被执行):
@Test
@DisplayName(“带失败提示的判断(拼接消息字符串的代码只有判断失败时才执行)”)
void assertWithLazilyRetrievedMessage() {
int expected = 2;
int actual = 1;
assertEquals(expected,
actual,
// 这个lambda表达式,只有在expected和actual不相等时才执行
()->String.format(“期望值[%d],实际值[%d]”, expected, actual));
}
- assertAll方法可以将多个判断逻辑放在一起处理,只要有一个报错就会导致整体测试不通过,并且执行结果中会给出具体的失败详情:
@Test
@DisplayName(“批量判断(必须全部通过,否则就算失败)”)
void groupedAssertions() {
// 将多个判断放在一起执行,只有全部通过才算通过,如果有未通过的,会有对应的提示
assertAll(“单个测试方法中多个判断”,
() -> assertEquals(1, 1),
() -> assertEquals(2, 1),
() -> assertEquals(3, 1)
);
}
上述代码执行结果如下:
异常断言
Assertions.assertThrows方法,用来测试Executable实例执行execute方法时是否抛出指定类型的异常;
如果execute方法执行时不抛出异常,或者抛出的异常与期望类型不一致,都会导致测试失败;
写段代码验证一下,如下,1除以0会抛出ArithmeticException异常,符合assertThrows指定的异常类型,因此测试可以通过:
@Test
@DisplayName(“判断抛出的异常是否是指定类型”)
void exceptionTesting() {
// assertThrows的第二个参数是Executable,
// 其execute方法执行时,如果抛出了异常,并且异常的类型是assertThrows的第一个参数(这里是ArithmeticException.class),
// 那么测试就通过了,返回值是异常的实例
Exception exception = assertThrows(ArithmeticException.class, () -> Math.floorDiv(1,0));
log.info(“assertThrows通过后,返回的异常实例:{}”, exception.getMessage());
}
- 以上是Assertions的常规用法,接下来要重点关注的就是和超时相关的测试方法;
超时相关的测试
- 超时测试的主要目标是验证指定代码能否在规定时间内执行完,最常用的assertTimeout方法内部实现如下图,可见被测试的代码通过ThrowingSupplier实例传入,被执行后再检查耗时是否超过规定时间,超过就调用fail方法抛AssertionFailedError异常:
- assertTimeout的用法如下,期望时间是1秒,实际上Executable实例的execute用了两秒才完成,因此测试失败:
@Test
@DisplayName(“在指定时间内完成测试”)
void timeoutExceeded() {
// 指定时间是1秒,实际执行用了2秒
assertTimeout(ofSeconds(1), () -> {
try{
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
执行结果如下图:
3. 上面的演示中,assertTimeout的第二个入参类型是Executable,此外还有另一个assertTimeout方法,其第二个入参是ThrowingSupplier类型,该类型入参的get方法必须要有返回值,假设是XXX,而assertTimeout就拿这个XXX作为它自己的返回值,使用方法如下:
@Test
@DisplayName(“在指定时间内完成测试”)
void timeoutNotExceededWithResult() {
// 准备ThrowingSupplier类型的实例,
// 里面的get方法sleep了1秒钟,然后返回一个字符串
ThrowingSupplier supplier = () -> {
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return “我是ThrowingSupplier的get方法的返回值”;
};
// 指定时间是2秒,实际上ThrowingSupplier的get方法只用了1秒
String actualResult = assertTimeout(ofSeconds(2), supplier);
log.info(“assertTimeout的返回值:{}”, actualResult);
}
上述代码执行结果如下,测试通过并且ThrowingSupplier实例的get方法的返回值也被打印出来:
JUnit5学习之三:Assertions类,字节跳动视频面试分钟相关推荐
- 『Flutter-绘制篇』实现炫酷的雨雪特效,15分钟的字节跳动视频面试
下图为主页效果: 开始 项目中很多自定义 widget,今天的主角是 背景层,不同的天气气象有不一样的呈现效果,一共实现了 12 种类别,其中有 晴.多云.阴天.小中大雨.小中大雪.雾.霾.浮尘,而背 ...
- 字节跳动视频编解码面经
引言 本文主要是记录一下面试字节跳动的经历. 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直 ...
- 字节跳动视频架构(一面面经)
字节跳动视频架构(一面面经) 算法:判断是否有环 java基础 String StringBuilder StringBuffer hashmap jvm,多线程 jvm各个部分介绍 threadlo ...
- 字节跳动python面试_字节跳动的面试感受
上周五(2019-02-01)去参加了字节跳动的面试.说起来这是我工作以后第一次参加社招的到面.因为其实也没有特别着急换工作,虽然在智联上写了期望工作地点是南京.杭州.北京,但不报销差旅费的异地到面我 ...
- 字节跳动 python面试_字节跳动数据分析实习岗面试全经历,竟然也会问这样的问题?...
临近年底,又有不少人跃跃欲试想跳槽了. 但跳槽这个事说容易也容易,投简历总是有人要的,但说难也难,要进大厂,不光要看能力,更要看项目,看背景. 就怕辛辛苦苦准备半天,面试的时候没表现好,直接被刷掉,面 ...
- 字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么
字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么 前言: 金九银十过了金三银四还会远嘛,本文后面分享面试题给正准备跳槽,准备找工作的你,这次面试字节跳动也是做了很多的准备,还好顺利拿到了o ...
- 收到字节跳动的面试邀请,我却掉了链子
挖出这个三年前的问题,就为吐槽今天字节跳动的面试.人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的.我一听 呀?那我这岂不是就不优秀了吗,于是毅然决然和女朋友分了手.人们都说,互 ...
- 小米前端面试、字节跳动前端面试、百分点前端面试-面试总结
小米前端开发面试(社招,南京) 小米面试问的问题都会涉及到具体的原理,每个技术点都要求深入的理解.小米的前端社招面试基本会经过四轮技术面试,面试通过之后HR会和你联系询问你的薪资期望,之后小米会有两天 ...
- 字节跳动的面试算法,实在太变态了
点击"开发者技术前线",选择"星标?" 13:21 在看|星标|留言, 真爱 来源公众号:苦逼的码农 前几天我去面试字节跳动,面试官问了一道链表相关的算法题, ...
最新文章
- 多线程并发编程需要注意虚假唤醒Spurious wakeup
- (视频+图文)机器学习入门系列-第10章 人工神经网络
- python pyyaml模块使用示例:读取yaml文件内容
- Flex 3 与 Flex 4 beta 之间的区别
- linux之find命令,Linux基础知识之find命令详解
- 大叔公开课~微服务与持久集成
- 【蓝桥杯】历届试题 错误票据
- Javascript设置对象属性为只读
- 这个统一了238个机器学习模型R包的参考手册推荐给你
- freebsd php mysql_在freebsd和linux下安装mysql+php+apache2
- 一起来学习.net core程序使用中介者模式:MediatR插件
- 陕西西咸新区沣西新城大数据产业发展思考
- 好用的PDF编辑软件有哪些?这几款工具建议收藏
- 完美解决“word无法创建工作文件,请检查临时环境变量”
- 朋友圈刷屏了,Clubhouse为什么这么火?
- android 监听动画过程,Android应用开发之Android动画监听实现方法
- 刀片服务器的机箱显示器,刀片服务器机箱如何配置网络交换器端口
- 什么是Session,Session常用API
- LM2596,LM2576,LM2575的差别
- macOS 13 beta7(22A5342f)With OpenCore 0.8.5 and winPE双引导分区原版镜像