欢送拜访我的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/blo... | 该我的项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blo... | 该我的项目源码的仓库地址,https协定 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该我的项目源码的仓库地址,ssh协定 |
- 这个git我的项目中有多个文件夹,本章的利用在<font color="blue">junitpractice</font>文件夹下,如下图红框所示:
- <font color="blue">junitpractice</font>是父子构造的工程,本篇的代码在<font color="red">assertassume</font>子工程中,如下图:
Assertions和Assumptions简介
Assumptions和Assertions容易混同,因而这里通过比照它们来学习:
- Assertions即断言类,外面提供了很多静态方法,例如assertTrue,如果assertTrue的入参为false,就会抛出AssertionFailedError异样,Junit对抛出此异样的办法断定为失败;
- Assumptions即假如类,外面提供了很多静态方法,例如assumeTrue,如果assumeTrue的入参为false,就会抛出TestAbortedException异样,Junit对抛出此异样的办法断定为跳过;
- 简略的说,Assertions的办法抛出异样意味着测试不通过,Assumptions的办法抛出异样意味着测试被跳过(为什么称为"跳过"?因为<font color="blue">mvn test</font>的执行后果被标记为<font color="red">Skipped</font>);
写一段代码比照成果
- 用代码来验证的成果最好,如下所示,一共四个办法,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@Slf4jpublic 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)); }}
- 点击下图红框地位执行单元测试:
- 执行后果如下:
- 另外,在target目录,能够看到surefire插件生成的单元测试报告<font color="blue">TEST-com.bolingcavalry.assertassume.service.impl.AssertAssumpTest.xml</font>,如下图所示,testcase节点中呈现了<font color="blue">skipped</font>节点:
- 上述比照验证再次阐明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"); }
成果如下图:
- 还有个<font color="blue">assumingThat</font>办法,能够承受Executable类型作为第二个入参,如果第一个入参为true就会执行Executable的execute办法,留神assumingThat办法的特点:<font color="red">不抛出异样</font>,因而其所在的办法不会被跳过,这是和assumeTrue相比最大的区别(assumeTrue一旦入参为false就会抛出异样,其所在办法就被标记为跳过):
@Test @DisplayName("assume胜利时执行指定逻辑") void tryAssumingThat() { // 第二个入参是Executable实现, // 当第一个参数为true时,执行第二个参数的execute办法 assumingThat("CI".equals(envType), () -> { log.info("这一行内容只有在CI环境才会打印"); }); log.info("无论什么环境都会打印的tryAssumingThat"); }
- 接下来咱们执行上述代码,看看成果;
执行Assumptions代码
- 先做筹备工作,本次实战的springboot工程名为<font color="blue">assertassume</font>,咱们在工程的resources目录下增加两个配置文件:application.properties和application-test.properties,地位如下图:
- application-test.properties内容如下:
envType:CI
- application.properties内容如下:
envType:PRODUCTION
- 残缺的单元测试类如下,通过注解ActiveProfiles,指定了应用application-test.properties的配置,因而envType的值为<font color="red">CI</font>:
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系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列
欢送关注公众号:程序员欣宸
微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游Java世界...
https://github.com/zq2599/blog_demos