27

我使用以下注释来标记我的集成测试:

@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 任务——推荐的方法是什么?

4

4 回答 4

56

基于https://github.com/gradle/gradle/issues/6172#issuecomment-409883128

2020 年进行了修订,将惰性任务配置和 Gradle 5 考虑在内。请参阅旧版本的答案历史记录。

plugins {
    id "java"
}

def test = tasks.named("test") {
    useJUnitPlatform {
        excludeTags "integration"
    }
}

def integrationTest = tasks.register("integrationTest2", Test) {
    useJUnitPlatform {
        includeTags "integration"
    }
    shouldRunAfter test
}

tasks.named("check") {
    dependsOn integrationTest
}

跑步

  • gradlew test将在没有集成的情况下运行测试
  • gradlew integrationTest将只运行集成测试
  • gradlew checktest随后运行integrationTest
  • gradlew integrationTest test将运行test后跟integrationTest
    注意:订单被交换是因为shouldRunAfter

历史

小费

注意:虽然上述方法有效,但 IntelliJ IDEA 很难推断出一些东西,所以我建议使用这个更明确的版本,其中所有内容都已键入并且完全支持代码完成

... { Test task ->
    task.useJUnitPlatform { org.gradle.api.tasks.testing.junitplatform.JUnitPlatformOptions options ->
        options.includeTags 'integration'
    }
}

构建.gradle.kts

根项目 Kotlin DSL 插件,用于在 Gradle 5.6.4 中的所有模块中配置集成测试

allprojects {
    plugins.withId("java") {
        @Suppress("UnstableApiUsage")
        this@allprojects.tasks {
            val test = "test"(Test::class) {
                useJUnitPlatform {
                    excludeTags("integration")
                }
            }
            val integrationTest = register<Test>("integrationTest") {
                useJUnitPlatform {
                    includeTags("integration")
                }
                shouldRunAfter(test)
            }
            "check" {
                dependsOn(integrationTest)
            }
        }
    }
}
于 2018-09-09T13:34:15.603 回答
11

我提出了一个问题:https ://github.com/junit-team/junit5/issues/579 (由Sam Brannen建议)。

同时,我使用项目属性作为解决方法:

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

因此,集成测试将被跳过

gradle test

但将包含在:

gradle test -PrunIntegrationTests

于 2016-12-01T13:46:53.197 回答
1

摇篮 6

我不确定是不是因为 Gradle 的行为发生了变化,但最高投票的答案在 Gradle 中对我不起作用。6.8.3. 我看到 integrationTests 任务与主要测试任务一起运行。这个简化版本对我有用:

test {
    useJUnitPlatform {
        excludeTags "integration"
    }
}

tasks.register("integrationTests", Test) {
    useJUnitPlatform {
        includeTags "integration"
    }
    mustRunAfter check
}

命令:

  • ./gradlew test./gradlew clean build- 运行没有 “集成”标签的测试。
  • ./gradlew integrationTests- 仅使用 “集成”标签运行测试。
于 2021-05-18T08:44:04.397 回答
0

据我说,目前解决这个问题的最好的工作代码是由以下人员提供的:TWiStErRob found here

请注意,在下面的示例中,必须使用 ui 标记测试(Junit5 标记):

task uiTest(type: Test) {
    useJUnitPlatform {
        includeTags 'ui'
        excludeTags 'integration'
    }
}

然而,我没有设法让 J unit5 测试服直接从 gradle 运行,我认为这将是一个更好的解决方案。但我认为购买 TWiStErRob 的解决方案已经足够好了。不利的一面是 gradle.build 文件现在也将因 test-suit-things 而变得臃肿。

请注意,可以像这样在 gradle 文件中创建多个测试套件:

task firstTestSuite(type: Test) {
    useJUnitPlatform {
        includeTags 'test-for-first-test-suite'
    }
}

task secondTestSuite(type: Test) {
    useJUnitPlatform {
        includeTags 'test-for-second-test-suite'
    }
}

然后所有的都可以像这样单独运行:

gradlew firstTestSuite
gradlew secondTestSuite
gradlew ui

使用 Gradle 6.6.1 运行的解决方案

于 2021-06-10T14:41:11.730 回答