欢送拜访我的GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,波及Java、Docker、Kubernetes、DevOPS等;

对于《JUnit5学习》系列

《JUnit5学习》系列旨在通过实战晋升SpringBoot环境下的单元测试技能,一共八篇文章,链接如下:

  1. 基本操作
  2. Assumptions类
  3. Assertions类
  4. 按条件执行
  5. 标签(Tag)和自定义注解
  6. 参数化测试(Parameterized Tests)根底
  7. 参数化测试(Parameterized Tests)进阶
  8. 综合进阶(终篇)

本篇概览

本文是《JUnit5学习》系列的第二篇,学习一个重要的知识点:Assumptions类,只有理解了它们,才好持续前面的学习,全篇章节如下:

  1. Assertions和Assumptions简介
  2. 写一段代码比照成果
  3. Assumptions编码
  4. 查看执行后果

源码下载

  1. 如果您不想编码,能够在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协定
  1. 这个git我的项目中有多个文件夹,本章的利用在<font color="blue">junitpractice</font>文件夹下,如下图红框所示:

  1. <font color="blue">junitpractice</font>是父子构造的工程,本篇的代码在<font color="red">assertassume</font>子工程中,如下图:

Assertions和Assumptions简介

Assumptions和Assertions容易混同,因而这里通过比照它们来学习:

  1. Assertions即断言类,外面提供了很多静态方法,例如assertTrue,如果assertTrue的入参为false,就会抛出AssertionFailedError异样,Junit对抛出此异样的办法断定为失败;
  2. Assumptions即假如类,外面提供了很多静态方法,例如assumeTrue,如果assumeTrue的入参为false,就会抛出TestAbortedException异样,Junit对抛出此异样的办法断定为跳过;
  3. 简略的说,Assertions的办法抛出异样意味着测试不通过,Assumptions的办法抛出异样意味着测试被跳过(为什么称为"跳过"?因为<font color="blue">mvn test</font>的执行后果被标记为<font color="red">Skipped</font>);

写一段代码比照成果

  1. 用代码来验证的成果最好,如下所示,一共四个办法,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));    }}
  1. 点击下图红框地位执行单元测试:

  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

  1. 最简略的用法如下,可见只有assumeTrue不抛出异样,前面的log.info才会执行:
    @Test    @DisplayName("最一般的assume用法")    void tryAssumeTrue() {        assumeTrue("CI".equals(envType));        log.info("CI环境才会打印的assumeTrue");    }
  1. assumeTrue能够承受Supplier类型作为第二个入参,如果assumeTrue失败就会将第二个参数的内容作为失败提醒:
@Test    @DisplayName("assume失败时带自定义错误信息")    void tryAssumeTrueWithMessage() {        // 第二个入参是Supplier实现,返回的内容用作跳过用例时的提示信息        assumeTrue("CI".equals(envType),                () -> "环境不匹配而跳过,以后环境:" + envType);        log.info("CI环境才会打印的tryAssumeTrueWithMessage");    }

成果如下图:

  1. 还有个<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代码

  1. 先做筹备工作,本次实战的springboot工程名为<font color="blue">assertassume</font>,咱们在工程的resources目录下增加两个配置文件:application.properties和application-test.properties,地位如下图:

  1. application-test.properties内容如下:
envType:CI
  1. application.properties内容如下:
envType:PRODUCTION
  1. 残缺的单元测试类如下,通过注解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");    }}
  1. 执行后果如下图,可见assume通过,所有信息都被打印进去了:

  1. 接下来把代码中的ActiveProfiles注解那一行正文掉,如下图红框:

  1. 执行后果如下,可见tryAssumingThat办法被标记为胜利,不过从日志可见assumingThat的第二个入参executable没有被执行:

  • 至此,Assumptions类的罕用办法体验实现,接下来的章节会持续学习其余罕用类;

你不孤独,欣宸原创一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 数据库+中间件系列
  6. DevOps系列

欢送关注公众号:程序员欣宸

微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游Java世界...
https://github.com/zq2599/blog_demos