带你探索JUnit 5.4

马邈
• 阅读 2065
Java最受欢迎的测试库JUnit发布了一个新版本5.4。自上一次5.3.2发布以来,这个版本带来了一些值得我们去尝试的地方,本文中,我将介绍最重要的内容,并在适用的地方提供代码示例。

你可能知道,JUnit 5.x(Jupiter)是对JUnit 4.x(Vintage)的巨大改进。JUnit 5是一个更优秀的版本,包括Lambda支持,JUnit 5扩展,测试方法参数注入以及许多其他功能。JUnit 5.4是JUnit 5的演变,进一步改善了测试体验。

什么是Junit 5?

官方使用说明

JUnit 5 = JUnit平台 + JUnit Jupiter + JUnit Vintage

以下是原文就不翻译了。

The JUnit Platform serves as a foundation for launching testing frameworks on the JVM. It also defines the [TestEngine](https://junit.org/junit5/docs/current/api/org/junit/platform/engine/TestEngine.html)API for developing a testing framework that runs on the platform. Furthermore, the platform provides a Console Launcher to launch the platform from the command line and a JUnit 4 based Runner for running any TestEngine on the platform in a JUnit 4 based environment. First-class support for the JUnit Platform also exists in popular IDEs (see IntelliJ IDEAEclipseNetBeans, and Visual Studio Code) and build tools (see GradleMaven, and Ant).

JUnit Jupiter is the combination of the new programming model and extension model for writing tests and extensions in JUnit 5. The Jupiter sub-project provides a TestEngine for running Jupiter based tests on the platform.

JUnit Vintage provides a TestEngine for running JUnit 3 and JUnit 4 based tests on the platform.

Junit 5 对应的JDK版本一定要是1.8以上

JUnit 5.4入门

带你探索JUnit 5.4

要开始使用JUnit 5.4,通过Maven引入。使用JUnit 5.4已经简化了。而在先前版本的JUnit 5中,需要分别导入几个Jar包(例如,jupiter-api,jupiter-params,jupiter-engine),新版本允许你通过包括仅仅单一的使用JUnit 5.4 junit-jupiter依赖性聚集工件。

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.4.1</version>
    <scope>test</scope>
</dependency>

项目代码结构

带你探索JUnit 5.4

@TempDir支持临时目录

在测试时,有时你需要访问临时文件。JUnit 5现在提供了一个创建和清理临时文件的扩展,而不是自己处理这样一个文件的创建。您可以使用它来放置@TempDirectory注释Path或File测试输入参数或字段。一个例子:


@Test
void writeItemsToFile(@TempDir Path tempDir) throws IOException {
        Path file = tempDir.resolve("test.txt");
        new ListWriter(file).write("a", "b", "c");
        assertEquals(singletonList("a,b,c"), Files.readAllLines(file));
    }

参数化测试null和空支持

参数化测试是为了测试的时候提供好的入参,比如下面的的Limit就会直接打印Limit的所有枚举列表

public enum Limit {
    IN(1,"包含"),
    NOT_IN(0,"不包含");
    public final int value;
    public final String alias;
    Limit(int value, String k) {
        this.value = value;
        this.alias = k;
    }
}

@ParameterizedTest
@EnumSource(Limit.class)
void checkLimit(Limit limit) {
   assertTrue(limitCheck.isValid(limit));
}

但是,在这样的设置中,假如我们需要去测试极端场景下,代码的健壮性,模拟提供null元素有点困难,或者在其他情况下,提供空元素。@NullSource(并@EmptySource加@NullAndEmptySource)就可以帮助到我们。
@NullSource相当于Mock了一个Null值做为入参,以此我们可以去测试代码

@ParameterizedTest
@NullSource // now also null is tested
@EnumSource(Limit.class)
void checkLimit(Limit limit) {
   assertTrue(limitCheck.isValid(limit));
}

设置单元测试名称

通常,在使用测试类时,可以使用@DisplayName注释覆盖测试方法名称或类。例如,见下文

@Test
@DisplayName("计算加法的一个单元测试")
public void add() { }

虽然上面提供了更易读的格式,但它非常静态。您现在可以做的是根据例如嵌套类或方法名称生成显示名称。可以在文档中找到一个好的DisplayNameGeneration示例

如何排序JUnit 5测试方法?

虽然通常将测试方法相互依赖并不是一个好主意,但对于某些情况,在测试执行中有一定的顺序是很方便的。例如,一个测试可能在REST端点中创建资源,而其他测试则验证此资源的某些属性。

在以前版本的JUnit中,这很难做到,但是从5.4开始,你可以使用一个新TestMethodOrder命名的OrderAnnotation。你可以以此来结合使用,Order以强制按特定顺序执行测试方法。


@TestMethodOrder(OrderAnnotation.class)
class SequenceTest {

    @Test
    @Order(1)
    void createResource() {
        // Create a resource first...
    }

    @Test
    @Order(2)
    void verify() {
        // ...then verify some attributes.
    }
}

下一步?

新的JUnit 5版本中还有许多其他功能,可以在官网找到。除了框架之外,JUnit 5的一大优点是文档很好。有很多可用的文档,其中的概念用非常简单的代码示例进行了解释,这一点我觉得和Spring的官网说明一样具有高质量,简单清晰。

如果您尚未升级到JUnit 5,那么最新版本提供了许多强大的功能,这些功能将使迁移变得有价值。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java单元测试工具
前言随着DevOp的不断流行,自动化测试慢慢成为Java开发者的关注点。因此,本文将分享10款优秀的单元测试框架和库,它们可以帮助Java开发人员在其Java项目上编写单元测试和集成测试。1\.JUnit我绝对JUnit不需要太多的介绍了。即使您是Java初学者,也可能听说过它。它可以帮助您为Java代码编写单元测试。几
Wesley13 Wesley13
3年前
java之Junit
Java之Junit的使用法则第一,Junit是指单元测试,用来对java程序的测试。以后可用来对代码的测试第二,Junit使用方法命名规范:publicvoid方法名(){}第三,具体实现步奏1.创建java类 !(https://oscimg.oschina.net/oscnet/d4a6428c8c4116
Wesley13 Wesley13
3年前
Java基础学习总结(24)——Java单元测试之JUnit4详解
Java单元测试之JUnit4详解与JUnit3不同,JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有:@BeforeClass 全局只会执行一次,而且是第一个运行@Before 在测试方法运行之前运行@Test(http://my.oschina.net/azibug) 测试方法
Stella981 Stella981
3年前
Android Studio Junit 无法解析
刚开始做Android就碰到困难,笔者直接创建AS自带的小示例,里面有用到junit4.12版本,但控制台错误显示:Failedtoresolve:junit:junit:4.12,虽然找到解决方法,但是并不完美,其中也有不懂的地方,算是先做个笔记吧,希望论坛高手看到能解答一下,非常感谢。遗留问题整理:1.新建或导入项目后,发现依赖j
Wesley13 Wesley13
3年前
IDEA
IDEA解决“idea环境:junit:4.11测试mybatis代码,无法导入org.junit.Test包”问题参考文章:(1)IDEA解决“idea环境:junit:4.11测试mybatis代码,无法导入org.junit.Test包”问题(https://www.oschina.net/act
Stella981 Stella981
3年前
JUnit的各种断言
JUnit为我们提供了一些辅助函数,他们用来帮助我们确定被测试的方法是否按照预期的效果正常工作,通常,把这些辅助函数称为断言。下面我们来介绍一下JUnit的各种断言。   1、assertEquals   函数原型1:assertEquals(\Stringmessage\,expected,actual) 参数说
Stella981 Stella981
3年前
JUnit
一、会用Spring测试套件的好处在开发基于Spring的应用时,如果你还直接使用Junit进行单元测试,那你就错过了Spring为我们所提供的饕餮大餐了。使用Junit直接进行单元测试有以下四大不足:1)导致多次Spring容器初始化问题根据JUnit测试方法的调用流程,每执行一个测试方法都会创建一个测试用例的实例并调用setUp()方法。由于
Wesley13 Wesley13
3年前
Python单元测试框架unittest简介
Python单元测试框架,其中的有些部分参照PyUnit。PyUnit是JUnit的python语言版本,它是由KentBeck和ErichGamma创建。JUnit是Kent的Smalltalk测试框架的Java版本。JUnit的每部分都是标准的单元测试框架,很多语言都受他启发而开发自身的单元测试框架。        unittest支持自动化测
Stella981 Stella981
3年前
JFinal的junit单元测试支持
在jfinal开发中不能直接使用junit单元测试,所以写了以下工具。原理是在运行junit测试方法之前启动jfinal的插件,运行完成后关闭插件。importorg.junit.After;importorg.junit.Before;importcom.jfinal.config.Constants;
Stella981 Stella981
3年前
Junit
junit4.x(1)、使用junit4.x版本进行单元测试时,不用测试类继承TestCase父类,因为,junit4.x全面引入了Annotation来执行我们编写的测试。\4\(2)、junit4.x版本,引用了注解的方式,进行单元测试;(3)、junit4.x版本我们常用的注解:A、@Before注解:与junit3.
Stella981 Stella981
3年前
Spring Boot(十二)单元测试JUnit
一、介绍JUnit是一款优秀的开源Java单元测试框架,也是目前使用率最高最流行的测试框架,开发工具Eclipse和IDEA对JUnit都有很好的支持,JUnit主要用于白盒测试和回归测试。<!more白盒测试:把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的;回归测试
马邈
马邈
Lv1
春眠不觉晓,处处闻啼鸟。夜来风雨声,花落知多少!
文章
7
粉丝
0
获赞
0