如何创建 Gradle 任务以 运行 仅 Spring 中的特定测试
How to create a Gradle Task to run only a specific Tests in Spring
我有一个 Spring 项目,我在其中编写了一些单元和集成测试。现在我想为 运行 所有单元测试、所有集成测试和一个 运行 两者创建自定义任务。但是我该怎么做呢?
我建议将集成测试分离到单独的源集中。默认情况下,您已经有 2 个源代码集,一个用于生产代码,一个用于测试。创建新的源集(在 src/integrationTest/java
下创建新目录)并使用 Junit5 添加以下配置:
test {
useJUnitPlatform()
}
sourceSets {
integrationTest {
java.srcDir file("src/integrationTest/java")
resources.srcDir file("src/integrationTest/resources")
compileClasspath += sourceSets.main.output + configurations.testRuntime
runtimeClasspath += output + compileClasspath
}
}
对于单独的任务:
task integrationTest(type: Test) {
description = 'Runs the integration tests.'
group = 'verification'
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
useJUnitPlatform()
reports {
html.enabled true
junitXml.enabled = true
}
}
现在您有 3 个任务可用:
gradlew test
gradlew integrationTest
gradlew check
- 运行s 两者都取决于测试任务,它们都扩展了
如果您也在使用 jacoco 并想合并测试结果,那么您可以执行以下任务:
task coverageMerge(type: JacocoMerge) {
destinationFile file("${rootProject.buildDir}/jacoco/test.exec")
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
}
// aggregate all coverage data at root level
if (tasks.findByName("test")) {
tasks.findByName("test").finalizedBy coverageMerge
}
if (tasks.findByName("integrationTest")) {
tasks.findByName("integrationTest").finalizedBy coverageMerge
}
task codeCoverageReport(type: JacocoReport) {
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
subprojects.each {
if (!it.name.contains('generated')) {
sourceSets it.sourceSets.main
}
}
reports {
xml.enabled true
html.enabled true
html.setDestination(new File("${buildDir}/reports/jacoco"))
csv.enabled false
}
}
到运行覆盖率报告只需执行
gradlew codeCoverageReport
我有一个 Spring 项目,我在其中编写了一些单元和集成测试。现在我想为 运行 所有单元测试、所有集成测试和一个 运行 两者创建自定义任务。但是我该怎么做呢?
我建议将集成测试分离到单独的源集中。默认情况下,您已经有 2 个源代码集,一个用于生产代码,一个用于测试。创建新的源集(在 src/integrationTest/java
下创建新目录)并使用 Junit5 添加以下配置:
test {
useJUnitPlatform()
}
sourceSets {
integrationTest {
java.srcDir file("src/integrationTest/java")
resources.srcDir file("src/integrationTest/resources")
compileClasspath += sourceSets.main.output + configurations.testRuntime
runtimeClasspath += output + compileClasspath
}
}
对于单独的任务:
task integrationTest(type: Test) {
description = 'Runs the integration tests.'
group = 'verification'
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
useJUnitPlatform()
reports {
html.enabled true
junitXml.enabled = true
}
}
现在您有 3 个任务可用:
gradlew test
gradlew integrationTest
gradlew check
- 运行s 两者都取决于测试任务,它们都扩展了
如果您也在使用 jacoco 并想合并测试结果,那么您可以执行以下任务:
task coverageMerge(type: JacocoMerge) {
destinationFile file("${rootProject.buildDir}/jacoco/test.exec")
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
}
// aggregate all coverage data at root level
if (tasks.findByName("test")) {
tasks.findByName("test").finalizedBy coverageMerge
}
if (tasks.findByName("integrationTest")) {
tasks.findByName("integrationTest").finalizedBy coverageMerge
}
task codeCoverageReport(type: JacocoReport) {
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")
subprojects.each {
if (!it.name.contains('generated')) {
sourceSets it.sourceSets.main
}
}
reports {
xml.enabled true
html.enabled true
html.setDestination(new File("${buildDir}/reports/jacoco"))
csv.enabled false
}
}
到运行覆盖率报告只需执行
gradlew codeCoverageReport