在 Gradle 多项目中应用 Jacoco
Applying Jacoco in Gradle Multiproject
我在我的一些 Gradle 实现中使用 Jacoco,并决定改进它在多项目中的使用。
我创建了一个类似于
的结构
parent-project
- model-project
- service-project
在我的 build.gradle 父项目中,我定义了:
allprojects {
apply plugin: 'jacoco'
//apply other plugins
repositories {...}
test.finalizedBy(project.tasks.jacocoTestReport)
jacocoTestReport {
reports {
csv.enabled false
html{
enabled true
destination "${buildDir}/reports/jacoco"
}
xml.enabled false
}
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
}
//other configurations
buildscript {
repositories {
jcenter()
mavenCentral()
mavenLocal()
}
dependencies {
classpath 'org.ajoberstar:gradle-jacoco:0.2.0'
}
}
}
当我一直执行这段代码时,我收到:
jacocoTestReport SKIPPED
所以我发现 this discussion 我意识到
jacocoRootReport doesn't work if some subprojects don't have any tests at all because this causes the onlyIf of JacocoReport to be false
我试过在最后插入下面的代码但是还是不行
task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {
dependsOn = subprojects.test
additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
classDirectories = files(subprojects.sourceSets.main.output)
executionData = files(subprojects.jacocoTestReport.executionData)
reports {
html.enabled = true
xml.enabled = true
csv.enabled = false
}
onlyIf = {
true
}
doFirst {
executionData = files(executionData.findAll {
it.exists()
})
}
}
我也试过在服务项目中创建一个测试...仍然没有用,跳过的消息仍然存在
我该如何解决这个问题?
配置不正确。至于我使用 TestNG 而不是 JUnit,我需要在 build.gradle
中指定它
所以我的父配置更改为:
subprojects {
apply plugin: 'jacoco'
//apply other plugins
def coverageSourceDirs = [
'src/main/java'
]
repositories {...}
jacoco {
toolVersion = '0.7.5+'
}
jacocoTestReport {
additionalSourceDirs = files(sourceSets.main.allSource.srcDirs)
classDirectories = files(sourceSets.main.output)
sourceDirectories = files(sourceSets.main.allSource.srcDirs)
reports {
csv.enabled false
html{
enabled true
destination "${buildDir}/reports/jacoco"
}
xml.enabled false
}
}
test {
useTestNG()
}
test.finalizedBy(project.tasks.jacocoTestReport)
dependencies {
testCompile "org.testng:testng:$testNGVersion"
testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion"
testCompile "org.springframework:spring-test:$springVersion"
}
task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {
additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
classDirectories = files(subprojects.sourceSets.main.output)
dependsOn = subprojects.test
executionData = files(subprojects.jacocoTestReport.executionData)
sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
reports {
csv.enabled false
html{
enabled true
destination "${buildDir}/reports/jacoco"
}
xml.enabled false
}
onlyIf = {
true
}
doFirst {
executionData = files(executionData.findAll {
it.exists()
})
}
}
}
JaCoCo Report Aggregation 插件在 gradle 7.4.2 中引入。
它将多个 JaCoCo 代码覆盖率报告的结果聚合到一个报告中。
使用testCodeCoverageReport
任务并且不要忘记声明jacocoAggregation
dependencies.
我在我的一些 Gradle 实现中使用 Jacoco,并决定改进它在多项目中的使用。
我创建了一个类似于
的结构parent-project
- model-project
- service-project
在我的 build.gradle 父项目中,我定义了:
allprojects {
apply plugin: 'jacoco'
//apply other plugins
repositories {...}
test.finalizedBy(project.tasks.jacocoTestReport)
jacocoTestReport {
reports {
csv.enabled false
html{
enabled true
destination "${buildDir}/reports/jacoco"
}
xml.enabled false
}
additionalSourceDirs = files(sourceSets.main.allJava.srcDirs)
}
//other configurations
buildscript {
repositories {
jcenter()
mavenCentral()
mavenLocal()
}
dependencies {
classpath 'org.ajoberstar:gradle-jacoco:0.2.0'
}
}
}
当我一直执行这段代码时,我收到:
jacocoTestReport SKIPPED
所以我发现 this discussion 我意识到
jacocoRootReport doesn't work if some subprojects don't have any tests at all because this causes the onlyIf of JacocoReport to be false
我试过在最后插入下面的代码但是还是不行
task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {
dependsOn = subprojects.test
additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
classDirectories = files(subprojects.sourceSets.main.output)
executionData = files(subprojects.jacocoTestReport.executionData)
reports {
html.enabled = true
xml.enabled = true
csv.enabled = false
}
onlyIf = {
true
}
doFirst {
executionData = files(executionData.findAll {
it.exists()
})
}
}
我也试过在服务项目中创建一个测试...仍然没有用,跳过的消息仍然存在
我该如何解决这个问题?
配置不正确。至于我使用 TestNG 而不是 JUnit,我需要在 build.gradle
中指定它所以我的父配置更改为:
subprojects {
apply plugin: 'jacoco'
//apply other plugins
def coverageSourceDirs = [
'src/main/java'
]
repositories {...}
jacoco {
toolVersion = '0.7.5+'
}
jacocoTestReport {
additionalSourceDirs = files(sourceSets.main.allSource.srcDirs)
classDirectories = files(sourceSets.main.output)
sourceDirectories = files(sourceSets.main.allSource.srcDirs)
reports {
csv.enabled false
html{
enabled true
destination "${buildDir}/reports/jacoco"
}
xml.enabled false
}
}
test {
useTestNG()
}
test.finalizedBy(project.tasks.jacocoTestReport)
dependencies {
testCompile "org.testng:testng:$testNGVersion"
testCompile "org.hamcrest:hamcrest-all:$hamcrestVersion"
testCompile "org.springframework:spring-test:$springVersion"
}
task jacocoRootReport(type: org.gradle.testing.jacoco.tasks.JacocoReport) {
additionalSourceDirs = files(subprojects.sourceSets.main.allSource.srcDirs)
classDirectories = files(subprojects.sourceSets.main.output)
dependsOn = subprojects.test
executionData = files(subprojects.jacocoTestReport.executionData)
sourceDirectories = files(subprojects.sourceSets.main.allSource.srcDirs)
reports {
csv.enabled false
html{
enabled true
destination "${buildDir}/reports/jacoco"
}
xml.enabled false
}
onlyIf = {
true
}
doFirst {
executionData = files(executionData.findAll {
it.exists()
})
}
}
}
JaCoCo Report Aggregation 插件在 gradle 7.4.2 中引入。
它将多个 JaCoCo 代码覆盖率报告的结果聚合到一个报告中。
使用testCodeCoverageReport
任务并且不要忘记声明jacocoAggregation
dependencies.