原文地址:http://blog.codefx.org/libraries/junit-5-setup/
原文日期:15, Feb, 2016
譯文首發: Linesh 的博客:環境搭建
我的 Github:http://github.com/linesh-simplicity
2015年11月,Junit Lambda 團隊發布了該項目的 第一版原型 。此后,該項目把名稱改成了 JUnit 5 並獨立了出來,隨后在2016年2月份的時候發布了一個 alpha 版本。本篇打算以一系列文章,簡短地探索一下以下幾個方面:
(如果不喜歡看文章,你可以戳這里看我的演講,或者看一下最近的 vJUG 講座,或者我在 DevoxxPL 上的 PPT。
本篇將介紹 JUnit 5 的環境搭建,看完之后你應該能夠使用新的 API 來撰寫測試,並且使用你喜歡的 IDE 或構建工具來跑這些測試了。
概述
本系列文章都基於 Junit 5發布的先行版 Milestone 2。它可能會有變化。如果有新的里程碑(milestone)版本發布,或者試用版正式發行時,我會再來更新這篇文章。
這里要介紹的多數知識你都可以在 JUnit 5 用戶指南 中找到(這個鏈接指向的是先行版 Milestone 2,想看的最新版本文檔的話請戳這里),並且指南還有更多的內容等待你發掘。下面的所有代碼都可以在 我的 Github 上找到。
目錄
- 第一個測試
- 運行測試
- 使用 JUnit 4 runner
- IDE 的支持
- 構建工具的支持
- 命令行支持也不賴
- 向下兼容性
- 回顧
- 分享&關注
第一個測試
支持測試撰寫的 API 包含在 junit-jupiter-api
包中。在構建工具中引入這個包,就行了。這就是全部,你就可以開始寫測試了。
- Group ID:
org.junit.jupiter
- Artifact ID:
junit-jupiter-api
- Version:
5.0.0-M2
我們來寫第一個測試吧,此處簡單最好:
package org.codefx.demo.junit5;
import org.junit.jupiter.api.Test;
class HelloWorldTest {
@Test
void helloJUnit5() {
System.out.println("Hello, JUnit 5.");
}
}
看起來怎樣?沒 public
,感覺帥氣不?這里我不會太深入細節講解,不過下一篇我會深入討論下這個(以及其他的一些基礎)。請別急,接着往下看。
運行測試
JUnit 5 是一代全新的測試框架,不過工具內置的支持則還未完全跟上。好在目前已有簡易的方法來運行 JUnit 5 及其測試。
使用 JUnit 4 runner
JUnit 團隊提供了一個 JunitPlatform
runner,可以使用它在 Junit 4 上運行 JUnit 5 的測試。這個 runner 在另一個包下,因此你也必須將它加入到你的項目中:
- Group ID:
org.junit.platform
- Artifact ID:
junit-platform-runner
- Version:
1.0.0-M2
這個 runner 最終會調用 Junit 引擎,后者才是真正運行 Junit 5 測試的部分。引擎也是在不同的包下,你也必須將它加入到項目中:
- Group ID:
org.junit.jupiter
- Artifact ID:
junit-jupiter-engine
- Version:
5.0.0-M2
要運行項目中所有的測試,為它們創建一個測試套件是最簡單的做法:
package org.codefx.demo.junit5;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.runner.SelectPackages;
import org.junit.runner.RunWith;
@RunWith(JUnitPlatform.class)
@SelectPackages({ "org.codefx.demo.junit5" })
public class TestWithJUnit5 { }
不過請注意,這個類必須是一個 JUnit 4 的測試類,也即是說它必須遵循 一般的命名規范,並且必須是 public
的。@SelectPackages
注解會把包當做一個有層級的結構,因此它會負責跑 org.codefx.demo.junit5
開頭的包下的所有測試。
至此所有工作都完成了!你的 IDE 和構建工具應該都能運行這個 @RunWith(JUnitPlatform.class)
注解的測試類了,它會負責跑所有的 JUnit 5 的新測試。
不過在 JUnit 5 被完全支持之前,一些特性可能還不能工作,比如 IDE 無法運行單獨的測試等。不過目前為止,這是我發現的最簡單並且在多平台下均工作良好的方案了。
IDE 的支持
Intellij IDEA 2016.2 開始 對 JUnit 5 有了基本的支持。盡管支持還不是很完美,並且還需時刻關注 JUnit 5 的發展,不過畢竟最基本的支持有了,現在使用 JUnit 5 已經簡單得多了。
Eclipse 方面團隊 仍在着手於內置支持的開發。
構建工具的支持
JUnit 團隊在為構建工具提供 JUnit 5 支持的基礎上已經做了大量的工作,比如提供與 JUnit 4 的兼容等。目前,我們已經有了一個可以工作的 Gradle 插件和 Maven Surefire 插件。這兩個項目都計划在接下來的時間里交給各自的社區去開發和維護。
在如何集成這兩個構建工具(Gradle和Maven)的插件上,已經各有一個示例代碼庫。更多細節請前往 官方用戶指南 。
命令行支持也不賴
如果你覺得你就想靜靜地跑個測試,上面介紹的 IDE 和構建工具都太復雜了,那么建議你試下這個 控制台 launcher,它支持你直接在命令行運行測試。要使用它,請 下載這個 zip 包。
遺憾的是,它 還需要你做些配置,而非拿來即用的。你需要將上面提到的兩個包 junit-jupiter-api
和 junit-jupiter-engine
移動到 lib
目錄下,並編輯 bin
下執行腳本的 classpath 使其指向你的 lib
目錄:CLASSPATH=$APP_HOEM/lib/*
。這樣該 launcher 才能運行。
不考慮其他依賴的話,這個執行腳本大概長得像這樣:
# run all tests
junit-platform-console -p ${path_to_compiled_test_classes} -a
# run a specific test
junit-platform-console
-p ${path_to_compiled_test_classes}
org.codefx.demo.junit5.HelloWorldTest
向下兼容性
你可能注意到了,JUnit 5 啟用了新的包名:org.junit.jupiter
、org.junit.platform
和 org.junit.vintage
(這個包我們尚未談到)。我們待會再討論它們的含義,現在我們只需知道,這意味着你可以在一個項目中使用不同的 JUnit 版本,這就夠了。
允許在同個項目中使用多個版本的 JUnit 來進行測試,這使得你能緩緩遷移到 JUnit 5上。關於遷移,我們在探討 JUnit 新的架構 時會再回顧這個話題。
通過異常(exceptions)於 JUnit 交互的測試庫,諸如 Hamcrest 和 AssertJ 等,易燃可以在 JUnit 的新版本下工作。這里有個使用 Mockito 和 AssertJ 寫的 HelloWorldTest
測試,有興趣的同學可以看下。
回顧
在這篇 JUnit 5 環境搭建的文章中,我們介紹了 junit-jupiter-api
和 junit-jupiter-engine
兩個包,在項目中使用了 junit-platform-runner
,寫了第一個最簡單的測試用例,並將它作為 JUnit 4 測試套件的一部分運行了起來。
下篇文章 我會討論使用 JUnit 5 撰寫測試的一些基礎知識。