JUnit5简介及其Gradle初始化
2018-03-30 15:03:43 +08 字数:1872 标签: Java TestJUnit5简介 ¶
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 $$
有一张官方的图,大概展示了组件之间的复杂依赖关系。
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-api
和junit-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
,即可查看测试结果。
参考 ¶
- 最重要的官网文档:《JUnit 5 User Guide》
- 官网文档的中文翻译(注意滞后性):《JUnit 5 用户指南》
- 《The Java Plugin - Gradle User Manual》