JUnit5简介及其Gradle初始化

JUnit5简介

Java的单元测试,最流行的框架当属JUnit。 而JUnit中,使用最广泛、集成最好的,目前还是JUnit4

2017年9月10日(教师节),JUnit5的首个正式版本——5.0.0——发布。 从最简单测试代码的外观来看,JUnit5并没有改变多少,不像从test_*@Test那么明显。 然而,巨大的变革,却已经悄然发生。

JUnit 5 is the next generation of JUnit. The goal is to create an up-to-date foundation for developer-side testing on the JVM. This includes focusing on Java 8 and above, as well as enabling many different styles of testing.

JUnit5已经从一个孤立的jar库,变成了一个平台(一群jar)。 仅支持1.8或以上的Java版本,抛弃历史包袱。 通过支持扩展(Extension),来方便用户定制特殊的测试需求与方式。

以下基于Gradle的4.x版本,介绍JUnit5的初始化配置与使用。 (更深层次的应用,不在本文探讨。)

jar的变化

首先,JUnit5从单个jar,转变成了多个。 原先只要一个junit的jar即可,Gradle配置示例如下:

dependencies {
    testImplementation 'junit:junit:4.12'
}

现在变成了多个组件。

$$ JUnit 5 = Platform + Jupiter + Vintage $$

有一张官方的图,大概展示了组件之间的复杂依赖关系。

Dependency Diagram

JUnit Platform

JUnit Platform是执行测试用的平台。 它包含了一堆jar,拆分得非常细致。 所谓『平台』,就是说这些jar在测试代码编译时都是用不上的,只在运行时起作用。 当前(2018年3月)版本1.1.0,Group ID都是org.junit.platform,而Artifacts ID则有9个。

Artifacts ID Description
junit-platform-commons 内部工具库,外部慎用。
junit-platform-console 支持从命令行启动Platform执行测试,详见Console Launcher
junit-platform-console-standalone 同上,只是打包了所有依赖。
junit-platform-engine 测试引擎的API,详见Plugging in Your Own Test Engine
junit-platform-gradle-plugin 支持Gradle的插件。
junit-platform-launcher 配置与启动测试计划的API,被IDE或构建工具所使用,详见JUnit Platform Launcher API
junit-platform-runner 兼容JUnit4的组件,详见Using JUnit 4 to run the JUnit Platform
junit-platform-suite-api 在Platform上配置测试套件的注解(Annotation)。
junit-platform-surefire-provider 支持Maven Surefire

本文是从配置一个Gradle项目的角度去介绍,因此仅涉及junit-platform-gradle-plugin。 示例配置如下:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.1.0'
    }
}

apply plugin: 'org.junit.platform.gradle.plugin'

JUnit Jupiter

Platform仅仅是外围的一些测试需要的组件,它支持不同的测试引擎(engine)。 Jupiter就是JUnit5的默认测试引擎。 这部分当前版本是5.1.0,Group ID是org.junit.jupiter,jar则有4个。

Artifacts ID Description
junit-jupiter-api 编写测试时的常用API。
junit-jupiter-engine 测试引擎(junit-platform-engine)的Jupiter实现。
junit-jupiter-params 支持参数化测试(parameterized tests)。
junit-jupiter-migrationsupport JUnit4的移植支持。

通常,junit-jupiter-apijunit-jupiter-engine是必须的,另外两个则可选。 前者是在写测试代码的过程中,能实际import进来使用的部分,而后者仅仅是运行时需要。 示例配置如下:

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.0'
    testImplementation 'junit:junit:4.12'
    testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.1.0'
}

JUnit Vintage

由于大量测试代码已经以JUnit4,甚至JUnit3的形式存在,而且很可能不会为JUnit5而重复开发。 Vintage就是为了兼容这部分代码,而特意实现的一个测试引擎。 本质上,它只是一个Group ID为org.junit.vintage、Artifacts ID为junit-vintage-engine的jar,当前版本为5.1.0。 但其实在使用中还隐含了一个组件,那就是传统的junit:junit

示例配置如下:

dependencies {
    testImplementation 'junit:junit:4.12'
    testRuntime 'org.junit.vintage:junit-vintage-engine:5.1.0'
}

因此,从JUnit4迁移到JUnit5的工作,可以很轻易地实现。 当然,迁移之后,就可以在不改变既有JUnit4测试代码的基础上,新增JUnit5代码。

版本说明

JUnit5的大版本是5,所以Jupiter和Vintage都是5.x的版本。 而JUnit Platform属于新鲜事物,并且只出现在buildscript这个作用域(scope),与其它组件不写在一起,所以独立使用1.x版本。 它们会同步更新,所以中、小版本号是一致的,当前(2018年3月)最新是x.1.0。

完整示例

以下为某个纯JUnit5项目的完整示例:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.1.0'
    }
}

apply plugin: 'java'
apply plugin: 'org.junit.platform.gradle.plugin'

import org.junit.platform.console.options.Details

junitPlatform {
    details Details.TREE
}

ext.junitJupiterVersion = '5.1.0'

dependencies {
    testCompile "org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}"
    testCompile "org.junit.jupiter:junit-jupiter-params:${junitJupiterVersion}"
    testRuntime "org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}"
}

repositories {
    jcenter()
}

配置完成后,执行gradle test,即可查看测试结果。

参考


相关笔记