19

単体テストを JUnit5 に移植しました。これはまだかなり初期の採用であり、Google でのヒントはほとんどないことを認識しています。

最も困難だったのは、jenkins で使用する Junit5 テストの jacoco コード カバレッジを取得することでした。これを理解するのにほぼ1日かかったので、共有したいと思いました。それにもかかわらず、より良い解決策を知っているなら、私は知りたいです!

buildscript {

    dependencies {
       // dependency needed to run junit 5 tests
       classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0-M2'
   }
}

// include the jacoco plugin
plugins {
    id 'jacoco'
}

dependencies {
    testCompile "org.junit.jupiter:junit-jupiter-api:5.0.0-M2"
    runtime "org.junit.jupiter:junit-jupiter-engine:5.0.0-M2"
    runtime "org.junit.vintage:junit-vintage-engine:4.12.0-M2"
}

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

次に、org.junit.platform.gradle.plugin で定義されている junitPlatformTest が gradle ライフサイクル フェーズで遅すぎて定義されているため、スクリプトが解析されるときに不明であることが問題のようです。

junitPlatformTest タスクを監視する jacoco タスクを定義できるようにするには、次のハックが必要です。

tasks.whenTaskAdded { task ->
    if (task.name.equals('junitPlatformTest')) {
        System.out.println("ADDING TASK " + task.getName() + " to the project!")

    // configure jacoco to analyze the junitPlatformTest task
    jacoco {
        // this tool version is compatible with
        toolVersion = "0.7.6.201602180812"
        applyTo task
    }

    // create junit platform jacoco task
    project.task(type: JacocoReport, "junitPlatformJacocoReport",
            {
                sourceDirectories = files("./src/main")
                classDirectories = files("$buildDir/classes/main")
                executionData task
            })
    }
}

最後に、junitPlatform プラグインを構成する必要があります。次のコードは、どのjunit 5タグを実行するかのコマンドライン構成を可能にします: 以下を実行することで、「ユニット」タグですべてのテストを実行できます:

gradle clean junitPlatformTest -PincludeTags=unit

unit タグと integ タグの両方が欠落しているすべてのテストを実行できます。

gradle clean junitPlatformTest -PexcludeTags=unit,integ

タグが指定されていない場合、すべてのテストが実行されます (デフォルト)。

junitPlatform {

    engines {
        include 'junit-jupiter'
        include 'junit-vintage'
    }

    reportsDir = file("$buildDir/test-results")

    tags {
        if (project.hasProperty('includeTags')) {
            for (String t : includeTags.split(',')) {
                include t
            }
        }

        if (project.hasProperty('excludeTags')) {
            for (String t : excludeTags.split(',')) {
                exclude t
            }
        }
    }

    enableStandardTestTask false
}
4

4 に答える 4

1

タスクへの参照を取得するjunitPlatformTest別のオプションは、afterEvaluate次のようにプロジェクトにブロックを実装することです。

afterEvaluate {
  def junitPlatformTestTask = tasks.getByName('junitPlatformTest')

  // do something with the junitPlatformTestTask
}

その他の例については、JUnit 5 の GitHub に関する私のコメントを参照してください。

于 2016-09-07T12:22:34.970 に答える