Специальная задача gradle для JUnit5

Я использую следующую аннотацию, чтобы пометить мои интеграционные тесты:

@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, которая специально запускает мои интеграционные тесты - какой рекомендуемый подход?

Ответ 1

Основано на 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 check запустит test последующим integrationTest test
  • gradlew integrationTest test запустит test последующим integrationTest test
    примечание: заказ поменялся из-за 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
}

Ответ 2

Я зарегистрировал проблему: https://github.com/junit-team/junit5/issues/579 (как предложено Sam Brannen).

Между тем, я использую свойство проекта в качестве обходного пути:

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

Следовательно, тесты интеграции будут пропущены с помощью:

gradle test

но будет включен:

gradle test -PrunIntegrationTests