web-dev-qa-db-ja.com

GradleでJUnit 5を使用する方法は?

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はソースとテストを独自のパッケージで必要としているためです。

試したこと

明らかにこれはこのトピックに関する最初の質問ではなく、私が見つけた関連する質問はすべて

31
PHPirate

両方の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 フォームの詳細を参照してください。

21
Ralf Stuckert

New:Gradle 4.6でのJUnit 5のサポート

指摘したとおり この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

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タスクが成功するか失敗するかを試します。

35
PHPirate

ナレッジベースに追加するだけで、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()
}
8
Ray Tayek

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()
}
4
fbokovikov

チェックアウト 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"
    }
}
1
deFreitas

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のリリースノートを調べてみましたが、この変更については何も見つかりませんでした。誰かがその背後にある「なぜ」についてもっと知っているなら、私も啓発してください。

0
Wahib Ul Haq