JUnit 4テストの実行に成功した後、JUnit 5をGradleで使用しようとしています。
期待される結果:JUnit 4テストでは、出力でNice 'passed'が、build/reports/tests
でhtmlレポートが生成されました。
実際の結果:以下のJUnit 5テストでは、(...) build succesful
以外に何も出力されませんが、テストログの出力は成功/スキップ/失敗しなかったため、テストにfail
を指定すると、ビルドが成功します。
gradle test --info
を実行すると、ほとんど無関係な出力の多くの中でSkipping task ':testClasses' as it has no actions.
が生成されます。驚くべきことに、それはExecuting task ':test'
とGenerating HTML test report... Finished generating test html results
およびbuild/test-results/test
のxmlについても同様であり、xmlは生成されず、htmlにはテストもエラーも表示されず、テストは実際に走りません。
私が非常に興味深いと思うのは、gradle test --debug
[TestEventLogger] Gradle Test Run :test STARTED
[org.gradle.api.internal.tasks.testing.junit.JUnitDetector] test-class-
scan : failed to scan parent class Java/lang/Object, could not find the class file
[TestEventLogger]
[TestEventLogger] Gradle Test Run :test PASSED
私の唯一のテストには
fail("test fails");
とても奇妙だと思います!
私のビルドファイルは
apply plugin: 'Java'
test {
dependsOn 'cleanTest' // run tests every time
}
sourceSets {
main {
Java {
srcDirs 'src'
}
}
test {
Java {
srcDirs 'test'
}
}
}
repositories {
mavenCentral()
}
dependencies {
// when using this, it worked with a junit 4 test
// testCompile 'junit:junit:4.10'
// this should be needed for junit 5 (using M4 is required since IJ 2017.1.2
testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4")
}
test {
testLogging {
events "passed", "skipped", "failed"
}
}
私のテストは
package mypackage;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class HelloWorldTest {
@Test
public void testHelloWorld(){
assertEquals(2, 1+1, "message");
}
}
私のフォルダー構造は、パッケージmypackage
を使用して、
Java-template-project
--- src
--- mypackage
--- HelloWorld.Java
--- test
--- mypackage
--- HelloWorldTest.Java
そして、私が使用しているIntelliJ 2017.1.3では、モジュール構造は次のようになります
Java-template-project
--- Java-template-project_main
--- src/mypackage
--- HelloWorld(.Java)
--- Java-template-project_test
--- test/mypackage
--- HelloWorldTest(.Java)
現在、Gradleはソースとテストを独自のパッケージで必要としているためです。
試したこと
明らかにこれはこのトピックに関する最初の質問ではなく、私が見つけた関連する質問はすべて
IntelliJでjUnit 5テストを実行するGradleプロジェクト
しかし、ご覧のとおり、これは古いバージョンのIntelliJであり、1つのJUnit依存関係行で回答の1つに従ってIJ 2016.3.3以降の構文を既に使用しているので、大丈夫です。
gradleを使用したintellijでのJUnit 4からJUnit 5へのアップグレード
上記の質問へのリンク、およびこれへのリンク Jetbrains blog 上記の質問と同じ行を使用します。次へのリンク:
IntellijテストレポートでJUnit 5テスト結果を統合する これは、質問で依存関係としても示しています
testRuntime("org.junit.vintage:junit-vintage-engine:5.0.0-M1")
IntelliJでTestCaseを実行しているときにJUnit JupiterとJUnit Vintageが分離されたのはなぜですか? まあ、それを実行すると、出力はこのバージョンを見つけることができませんでしたが、 Mavenリポジトリ これはJUnit 5用です:
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")
答えは、後のバージョンがJUnit 5をサポートしているため、IntelliJ内でテストを実行できることを示しています。私は知っていますし、IntelliJ内から実行するとテストは正常に実行されます。しかし、Gradle(および依存関係管理が必要なTravis)を使用したいと思います。
junit 5 gradleテストレポートでstdout/stderrをキャプチャする方法?
使ってみた
testCompile("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M3")
testCompile("org.junit.jupiter:junit-jupiter-engine:5.0.0-M3")
しかし、結果は変わりませんでした。
私のテンプレートプロジェクトは https://github.com/PHPirates/Java-template-project にありますが、この質問には必要な情報がすべて含まれている必要があります。
両方のJUnitバージョンのエンジンが必要であり、JUnitプラットフォームgradleプラグインを適用する必要があります。私はあなたのgradleファイルにそれを見ません。 JUnit 4と5の両方を実行する作業用のgradleビルドを次に示します。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath ("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M4")
}
}
apply plugin: 'org.junit.platform.gradle.plugin'
...
dependencies {
...
testCompile("junit:junit:4.12")
testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")
testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4")
testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0-M4")
// Enable use of the JUnitPlatform Runner within the IDE
testCompile("org.junit.platform:junit-platform-runner:1.0.0-M4")
}
junitPlatform {
details 'tree'
}
JUnit doc フォームの詳細を参照してください。
指摘したとおり このGitHubの問題で Gradle 4.6以降では、JUnit 5がサポートされています! 4.6の公式リリースノート(最新版を編集する瞬間ですが、 GitHubリリースページ で最新バージョンを使用していることを確認してください) at docs.gradle.org 古いセットアップは引き続き機能しますが、これを使用するとビルドファイルが非常にきれいになります。
[2019年5月編集] @deFreitasが answer で指摘したように、JUnitのドキュメントは改善され、今では https://github.com/junit-team/で完全な例を提供しています。 junit5-samples/tree/r5.4.0/junit5-jupiter-starter-gradle 、特に build.gradle
を参照してください。幸いなことに、この答えからのものと事実上同じであることがわかりました。
Gradleを更新する
まず、最新のGradleバージョンを使用していることを確認し、最新のリリースを確認します GitHubリリースで 。たとえば4.6の場合は、プロジェクトの場所gradlew wrapper --gradle-version=4.6
のターミナルで実行するか、gradle/wrapper/gradle-wrapper.properties
ファイルのこの行を更新してください:distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.Zip
。
ビルトインJUnit 5の使用方法
その後、質問からのJavaファイル、ディレクトリ構造などにより、build.gradle
ファイルが作成されます(新しいplugins
ブロックを使用)
plugins {
id 'Java'
}
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.0.3'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.0.3'
}
// These lines can be removed when you use the default directories src/main/kotlin and src/test/kotlin
sourceSets {
main.Java.srcDirs += 'src'
main.resources.srcDirs += 'src'
test.Java.srcDirs += 'test'
test.resources.srcDirs += 'test'
}
// Java target version
sourceCompatibility = 1.8
test {
// Enable JUnit 5 (Gradle 4.6+).
useJUnitPlatform()
// Always run tests, even when nothing changed.
dependsOn 'cleanTest'
// Show test results.
testLogging {
events "passed", "skipped", "failed"
}
}
PS絶対最小バージョンについては、 Ray's answer を参照してください。
Androidで、アプリモジュールビルドファイルに以下を追加して、質問からJUnit 5テストを実行しました。ご覧のとおり、依存関係は同じですが、useJUnitPlatform()
は必要ありませんでした。テスト構成ブロックは少し異なります。
apply plugin: 'com.Android.application'
// In fact I am not sure you need this, but I had it included to run Spek tests anyway
apply plugin: 'de.mannodermaus.Android-junit5'
repositories {
mavenCentral()
jcenter()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}
Android {
// I'm omitting your other configurations like compileSdkVersion, buildTypes etc.
testOptions {
unitTests.all {
// Always run tests, even when nothing changed.
dependsOn 'clean'
// Show test results.
testLogging {
events "passed", "skipped", "failed"
}
}
}
}
しかし(Gradle test
タスクを実行する場合にのみ機能します、notcheck
タスクを実行します。通常どおり、失敗したテストを作成してこれをテストし、Gradleタスクが成功するか失敗するかを試します。
ナレッジベースに追加するだけで、Gradle 4.7で動作するように次のようになりました。
apply plugin: 'Java'
repositories {
jcenter()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.1'
}
test {
useJUnitPlatform()
}
Github issue により、Gradle 4.6で予定されているJUnit 5の組み込みサポート
したがって、gradle 4.6以降では、期待される結果は実際の結果と同じである必要があります。
期待される結果:JUnit 4テストでは、出力でNice 'passed'が得られ、
build/reports/tests
でhtmlレポートが生成されました。
UPD:
gradle 4.6-rc-1は2018年2月16日にリリースされ、このバージョンはjunit 5の組み込みサポートを提供します。
Junit 5サポートを有効にするには、gradleラッパーを更新する必要があります。
gradle wrapper --gradle-version=4.6-rc-1
build.gradleに1行だけ追加します。
test {
useJUnitPlatform()
}
チェックアウト junit公式ドキュメント junit 5をgradleで使用する方法。
build.gradle
plugins {
id 'Java'
}
repositories {
mavenCentral()
}
dependencies {
testImplementation('org.junit.jupiter:junit-jupiter:5.4.0')
}
test {
useJUnitPlatform()
testLogging {
events "passed", "skipped", "failed"
}
}
JUnit5とgradleバージョン4.1を統合しようとしたときに、この問題に見舞われた人々にとって何か役に立つかもしれません。
Could not find method test() for arguments [build_dzas89s5z18l3bfyn6b3q0dxv$_run_closure2$_closure9@8e60c6] on project ':app' of type org.gradle.api.Project.
実際、4.10では、このテスト構成ブロックをbuild.gradleに追加してJUnit5を有効にする必要はありません。
test {
useJUnitPlatform()
}
Jupitor-apiとjupitor-engineの必要な依存関係を追加するだけで正常に動作するはずです。
4.10のリリースノートを調べてみましたが、この変更については何も見つかりませんでした。誰かがその背後にある「なぜ」についてもっと知っているなら、私も啓発してください。