1. 按条件执行

  2. 标签(Tag)和自定义注解

  3. 参数化测试(Parameterized Tests)基础

  4. 参数化测试(Parameterized Tests)进阶

  5. 综合进阶(终篇)

本篇概览

本文是《JUnit5学习》系列的第三篇,主要是学习Assertions类(org.junit.jupiter.api.Assertions),Assertions类的一系列静态方法给我们提供了单元测试时常用的断言功能,本篇主要内容如下:

  1. Assertions源码分析

  2. 写一段代码,使用Assertions的常用静态方法

  3. 使用异常断言

  4. 使用超时断言

  5. 了解第三方断言库

源码下载

  1. 如果您不想编码,可以在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协议 |

  1. 这个git项目中有多个文件夹,本章的应用在junitpractice文件夹下,如下图红框所示:

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

Assertions源码分析

  1. 下图是一段最简单最常见的单元测试代码,也就是Assertions.assertEquals方法,及其执行效果:

  1. 将Assertions.assertEquals方法逐层展开,如下图所示,可见入参expected和actual的值如果不相等,就会在AssertionUtils.fail方法中抛出AssertionFailedError异常:

  1. 用类图工具查看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)

  1. 判断两个数组是否相等的逻辑与判断两个对象略有不同,可以重点看看,方法源码如下:

public static void assertArrayEquals(Object[] expected, Object[] actual) {

AssertArrayEquals.assertArrayEquals(expected, actual);

}

  1. 将上述代码逐层展开,在AssertArrayEquals.java中见到了完整的数组比较逻辑,如下图:

  • 接下来,咱们编写一些单元测试代码,把Assertions类常用的方法都熟悉一遍;

编码实战

  1. 打开junitpractice工程的子工程assertassume,新建测试类AssertionsTest.java:

  1. 最简单的判断,两个入参相等就不抛异常(AssertionFailedError):

@Test

@DisplayName(“最普通的判断”)

void standardTest() {

assertEquals(2, Math.addExact(1, 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));

}

  1. assertAll方法可以将多个判断逻辑放在一起处理,只要有一个报错就会导致整体测试不通过,并且执行结果中会给出具体的失败详情:

@Test

@DisplayName(“批量判断(必须全部通过,否则就算失败)”)

void groupedAssertions() {

// 将多个判断放在一起执行,只有全部通过才算通过,如果有未通过的,会有对应的提示

assertAll(“单个测试方法中多个判断”,

() -> assertEquals(1, 1),

() -> assertEquals(2, 1),

() -> assertEquals(3, 1)

);

}

上述代码执行结果如下:

异常断言

  1. Assertions.assertThrows方法,用来测试Executable实例执行execute方法时是否抛出指定类型的异常;

  2. 如果execute方法执行时不抛出异常,或者抛出的异常与期望类型不一致,都会导致测试失败;

  3. 写段代码验证一下,如下,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的常规用法,接下来要重点关注的就是和超时相关的测试方法;

超时相关的测试

  1. 超时测试的主要目标是验证指定代码能否在规定时间内执行完,最常用的assertTimeout方法内部实现如下图,可见被测试的代码通过ThrowingSupplier实例传入,被执行后再检查耗时是否超过规定时间,超过就调用fail方法抛AssertionFailedError异常:

  1. 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类,字节跳动视频面试分钟相关推荐

  1. 『Flutter-绘制篇』实现炫酷的雨雪特效,15分钟的字节跳动视频面试

    下图为主页效果: 开始 项目中很多自定义 widget,今天的主角是 背景层,不同的天气气象有不一样的呈现效果,一共实现了 12 种类别,其中有 晴.多云.阴天.小中大雨.小中大雪.雾.霾.浮尘,而背 ...

  2. 字节跳动视频编解码面经

    引言 本文主要是记录一下面试字节跳动的经历. 三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直 ...

  3. 字节跳动视频架构(一面面经)

    字节跳动视频架构(一面面经) 算法:判断是否有环 java基础 String StringBuilder StringBuffer hashmap jvm,多线程 jvm各个部分介绍 threadlo ...

  4. 字节跳动python面试_字节跳动的面试感受

    上周五(2019-02-01)去参加了字节跳动的面试.说起来这是我工作以后第一次参加社招的到面.因为其实也没有特别着急换工作,虽然在智联上写了期望工作地点是南京.杭州.北京,但不报销差旅费的异地到面我 ...

  5. 字节跳动 python面试_字节跳动数据分析实习岗面试全经历,竟然也会问这样的问题?...

    临近年底,又有不少人跃跃欲试想跳槽了. 但跳槽这个事说容易也容易,投简历总是有人要的,但说难也难,要进大厂,不光要看能力,更要看项目,看背景. 就怕辛辛苦苦准备半天,面试的时候没表现好,直接被刷掉,面 ...

  6. 字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么

    字节跳动的面试分享,为了拿下这个offer鬼知道我经历了什么 前言: 金九银十过了金三银四还会远嘛,本文后面分享面试题给正准备跳槽,准备找工作的你,这次面试字节跳动也是做了很多的准备,还好顺利拿到了o ...

  7. 收到字节跳动的面试邀请,我却掉了链子

    挖出这个三年前的问题,就为吐槽今天字节跳动的面试.人们都说,这个世界上有两种人注定单身,一种是太优秀的,另一种是太平凡的.我一听 呀?那我这岂不是就不优秀了吗,于是毅然决然和女朋友分了手.人们都说,互 ...

  8. 小米前端面试、字节跳动前端面试、百分点前端面试-面试总结

    小米前端开发面试(社招,南京) 小米面试问的问题都会涉及到具体的原理,每个技术点都要求深入的理解.小米的前端社招面试基本会经过四轮技术面试,面试通过之后HR会和你联系询问你的薪资期望,之后小米会有两天 ...

  9. 字节跳动的面试算法,实在太变态了

    点击"开发者技术前线",选择"星标?" 13:21 在看|星标|留言,  真爱 来源公众号:苦逼的码农 前几天我去面试字节跳动,面试官问了一道链表相关的算法题, ...

最新文章

  1. 多线程并发编程需要注意虚假唤醒Spurious wakeup
  2. (视频+图文)机器学习入门系列-第10章 人工神经网络
  3. python pyyaml模块使用示例:读取yaml文件内容
  4. Flex 3 与 Flex 4 beta 之间的区别
  5. linux之find命令,Linux基础知识之find命令详解
  6. 大叔公开课~微服务与持久集成
  7. 【蓝桥杯】历届试题 错误票据
  8. Javascript设置对象属性为只读
  9. 这个统一了238个机器学习模型R包的参考手册推荐给你
  10. freebsd php mysql_在freebsd和linux下安装mysql+php+apache2
  11. 一起来学习.net core程序使用中介者模式:MediatR插件
  12. 陕西西咸新区沣西新城大数据产业发展思考
  13. 好用的PDF编辑软件有哪些?这几款工具建议收藏
  14. 完美解决“word无法创建工作文件,请检查临时环境变量”
  15. 朋友圈刷屏了,Clubhouse为什么这么火?
  16. android 监听动画过程,Android应用开发之Android动画监听实现方法
  17. 刀片服务器的机箱显示器,刀片服务器机箱如何配置网络交换器端口
  18. 什么是Session,Session常用API
  19. LM2596,LM2576,LM2575的差别
  20. macOS 13 beta7(22A5342f)With OpenCore 0.8.5 and winPE双引导分区原版镜像

热门文章

  1. jquery点击加class再次点击移除添加的class
  2. wince注册表介绍
  3. 污水,中水处理plc控制系统
  4. CAN FD 协议联网和测试
  5. 【Unity插件】最多的插件合集
  6. js记录用户行为浏览记录和停留时间(转)
  7. 互联网金融之我要理财
  8. NetSuite知识会第4谈 - CSV导入串讲
  9. datepart函数用法及其与sqlserver depart函数、Mysql week函数的差异
  10. 搜索-Lucene学习笔记