Gradle 如何在 JUnit 平台中进行两组测试
How to have two sets of tests in JUnit Platform in Gradle
我通过 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'
}
}
}
效果很好。但我还需要 运行 集成测试,这需要应用程序在后台构建、dockerized 和 运行。所以我应该有这样的第二个配置,它只会在那时启动......如何实现这一目标?通常我会扩展测试任务来创建 IntegrationTest 任务,但它不适合没有简单任务的 JUnit 平台 运行ning 测试...
我知道我可以这样做
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)
}
但是有没有更简单的方法呢?更一致。
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
和 integrationTestRuntime
函数,用于 dependencies
块:
dependencies {
// .. other stuff snipped out ..
testCompile "org.assertj:assertj-core:${assertjVersion}"
integrationTestCompile("org.springframework.boot:spring-boot-starter-test") {
exclude module: 'junit:junit'
}
}
不错!
将集成测试添加到构建过程中的正确位置
正如您所指出的,您确实需要一项 运行ning 集成测试任务。您可以像示例中那样使用启动器;我只是委托给现有的控制台 运行ner 以利用简单的命令行选项。
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
}
现在您可以像 ./mvnw test
一样使用 ./gradlew test
,像 ./mvnw verify
一样使用 ./gradlew check
。
我通过 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'
}
}
}
效果很好。但我还需要 运行 集成测试,这需要应用程序在后台构建、dockerized 和 运行。所以我应该有这样的第二个配置,它只会在那时启动......如何实现这一目标?通常我会扩展测试任务来创建 IntegrationTest 任务,但它不适合没有简单任务的 JUnit 平台 运行ning 测试...
我知道我可以这样做
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)
}
但是有没有更简单的方法呢?更一致。
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
和 integrationTestRuntime
函数,用于 dependencies
块:
dependencies {
// .. other stuff snipped out ..
testCompile "org.assertj:assertj-core:${assertjVersion}"
integrationTestCompile("org.springframework.boot:spring-boot-starter-test") {
exclude module: 'junit:junit'
}
}
不错!
将集成测试添加到构建过程中的正确位置
正如您所指出的,您确实需要一项 运行ning 集成测试任务。您可以像示例中那样使用启动器;我只是委托给现有的控制台 运行ner 以利用简单的命令行选项。
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
}
现在您可以像 ./mvnw test
一样使用 ./gradlew test
,像 ./mvnw verify
一样使用 ./gradlew check
。