4

我正在通过 Gradle 使用 JUnit 5 平台。

我当前的构建文件有配置子句

junitPlatform {
    platformVersion '1.0.0-M5'
    logManager 'java.util.logging.LogManager'
    enableStandardTestTask true

    filters {
        tags {
            exclude 'integration-test'
        }
        packages {
            include 'com.scherule.calendaring'
        }
    }
}

这很好用。但我还需要运行集成测试,这需要构建、docker 化并在后台运行应用程序。所以我应该有这样的第二个配置,然后才会启动......如何实现这个?通常我会扩展创建 IntegrationTest 任务的测试任务,但它不适合没有简单任务运行测试的 JUnit 平台......

我知道我可以这样做

task integrationTests(dependsOn: "startMyAppContainer") {
    doLast {
        def request = LauncherDiscoveryRequestBuilder.request()
                .selectors(selectPackage("com.scherule.calendaring"))
                .filters(includeClassNamePatterns(".*IntegrationTest"))
                .build()

        def launcher = LauncherFactory.create()

        def listener = new SummaryGeneratingListener()
        launcher.registerTestExecutionListeners(listener)
        launcher.execute(request)
    }

    finalizedBy(stopMyAppContainer)
}

但有更简单的方法吗?更一致。

4

1 回答 1

9

Gradle 中的 JUnit5 插件还没有完全支持这一点(尽管它越来越接近)。有几种解决方法。这是我使用的一个:它有点冗长,但它与 maven 的测试与验证做同样的事情。

区分(单元)测试和集成测试类。

Gradle 的主要和测试源集都很好。添加一个新的 integrationTest sourceSet,它只描述您的集成测试。您可以使用文件名,但这可能意味着您必须调整测试 sourceSet 以跳过它当前包含的文件(在您的示例中,您希望从测试 sourceSet 中删除“.*IntegrationTest”并将其仅保留在 integrationTest源集)。所以我更喜欢使用与测试源集不同的根目录名称。

sourceSets {
  integrationTest {
    java {
      compileClasspath += main.output + test.output
      runtimeClasspath += main.output + test.output
      srcDir file('src/integrationTest/java')
    }
    resources.srcDir file('src/integrationTest/resources')
  }
}

由于我们有 java 插件,这很好地创建了用于块的integrationTestCompile和函数:integrationTestRuntimedependencies

dependencies {
    // .. other stuff snipped out ..
    testCompile "org.assertj:assertj-core:${assertjVersion}"

    integrationTestCompile("org.springframework.boot:spring-boot-starter-test") {
        exclude module: 'junit:junit'
    }
}

好的!

将集成测试添加到构建过程中的正确位置

正如您所指出的,您确实需要有一项任务来运行集成测试。您可以像在示例中一样使用启动器;我只是委托给现有的控制台运行程序,以便利用简单的命令行选项。

def integrationTest = task('integrationTest',
                           type: JavaExec,
                           group: 'Verification') {
    description = 'Runs integration tests.'
    dependsOn testClasses
    shouldRunAfter test
    classpath = sourceSets.integrationTest.runtimeClasspath

    main = 'org.junit.platform.console.ConsoleLauncher'
    args = ['--scan-class-path',
            sourceSets.integrationTest.output.classesDir.absolutePath,
            '--reports-dir', "${buildDir}/test-results/junit-integrationTest"]
}

该任务定义包括一个dependsOn 和shouldRunAfter,以确保在您运行集成测试时,首先运行单元测试。为确保您的集成测试在您运行时运行./gradlew check,您需要更新检查任务:

check {
  dependsOn integrationTest
}

现在你使用./gradlew testlike./mvnw test./gradlew checklike ./mvnw verify

于 2017-07-28T01:00:46.153 回答