web-dev-qa-db-ja.com

JUnit5タグ固有のGradleタスク

次の注釈を使用して、統合テストにタグを付けます。

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("integration-test")
public @interface IntegrationTest {
}

これは、build.gradleからこれらのテストを除外するためにgradle buildで使用するフィルターです。

junitPlatform {
    filters {
        tags {
            exclude 'integration-test'
        }
    }
}

ここまでは順調ですね。

次に、統合テストを具体的に実行するGradleタスクを提供したいと思います。推奨されるアプローチは何ですか?

19
Rahel Lüthy

に基づく https://github.com/gradle/gradle/issues/6172#issuecomment-409883128

test {
    useJUnitPlatform {
        excludeTags 'integration'
    }
}

task integrationTest(type: Test) {
    useJUnitPlatform {
        includeTags 'integration'
    }
    check.dependsOn it
    shouldRunAfter test
}

ランニング

  • gradlew testは統合なしでテストを実行します
  • gradlew integrationTestは統合テストのみを実行します
  • gradlew checktestに続いてintegrationTestを実行します
  • gradlew integrationTest testtestに続いてintegrationTestを実行します
    注:shouldRunAfterが原因で注文が入れ替わります

歴史

ヒント

注:上記は機能しますが、IntelliJ IDEAは何かを推測するのが難しいため、すべてを入力してコード補完を行うこのより明示的なバージョンを使用することをお勧めします完全にサポートされています

tasks.withType(Test) { Test task ->
    task.useJUnitPlatform { org.gradle.api.tasks.testing.junitplatform.JUnitPlatformOptions options ->
        options.excludeTags 'integration'
    }
}

task integrationTest(type: Test) { Test task ->
    task.useJUnitPlatform { org.gradle.api.tasks.testing.junitplatform.JUnitPlatformOptions options ->
        options.includeTags 'integration'
    }
    tasks.check.dependsOn task
    task.shouldRunAfter tasks.test
}
24
TWiStErRob

私は問題を提出しました: https://github.com/junit-team/junit5/issues/579Sam Brannen の提案に従います)。

一方、回避策としてプロジェクトプロパティを使用しています。

junitPlatform {
    filters {
        tags {
            exclude project.hasProperty('runIntegrationTests') ? '' : 'integration-test'
        }
    }
}

その結果、統合テストはスキップされます

gradle test

に含まれます

gradle test -PrunIntegrationTests

7
Rahel Lüthy