彙總gradle多模組測試結果和彙總Gradle多模組程式碼覆蓋率報告
阿新 • • 發佈:2022-04-04
1、Gradle如果測試失敗,如何繼續構建
預設情況下,如果任何單元測試失敗,則Gradle構建過程將停止並失敗。 即使測試過程失敗,也可以繼續構建過程的幾種方法。
1.1、忽略測試失敗
build.gradle
test {
ignoreFailures = true
}
1.2、排除失敗的測試
test {
exclude '**/ThisIsFailedTestExample.class'
exclude '**/*FailedTestExample*'
}
1.3、跳過了整個測試過程
gradle build -x test
2、彙總gradle多模組測試結果
預設java外掛的test指令生成的測試報告儲存在各個子模組build目錄的位置
設定不生成測試結果報告
// Disable the test report for the individual test task
test {
reports.html.enabled = false
reports.junitXml.enabled = false
}
彙總 Gradle 多模組測試結果,結果儲存在 專案根目錄\build\reports\allTests
subprojects { apply plugin: 'java' sourceCompatibility = 1.8 // Disable the test report for the individual test task test { reports.html.enabled = false reports.junitXml.enabled = false } repositories { mavenCentral() } dependencies { testImplementation 'junit:junit:4.13.2' } } // 彙總 Gradle 多模組測試結果 task testReport(type: TestReport) { destinationDir = file("$buildDir/reports/allTests") // Include the results from the `test` task in all subprojects reportOn subprojects*.test { ignoreFailures = true // 忽略測試失敗 } }
testReport指令整合
執行testReport指令,結果儲存在專案根目錄\build\reports\allTests
3、彙總 Gradle 多模組程式碼覆蓋率報告
引入 jacoco 外掛後,在verification就會整合 jacocoTestReport 指令
執行jacocoTestReport 指令會在各個子模組build目錄下生成該子模組的程式碼覆蓋率報告
彙總 Gradle 多模組程式碼覆蓋率報告,結果儲存在 專案根目錄\build\reports\jacoco\jacocoRootReport\html
plugins { id 'java' id 'jacoco' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } subprojects { apply plugin: 'java' apply plugin: 'jacoco' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { testImplementation 'junit:junit:4.13.2' } } // 彙總 Gradle 多模組程式碼覆蓋率報告 task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') { description = 'Generates an aggregate report from all subprojects' dependsOn(subprojects.test) additionalSourceDirs.from = files(subprojects.sourceSets.main.allSource.srcDirs) sourceDirectories.from = files(subprojects.sourceSets.main.allSource.srcDirs) classDirectories.from = files(subprojects.sourceSets.main.output) executionData.from = files(subprojects.jacocoTestReport.executionData) reports { html.enabled true } }
參考案例
根目錄的build.gradle
plugins { id 'java' id 'jacoco' } group 'org.example' version '1.0-SNAPSHOT' repositories { mavenCentral() } subprojects { apply plugin: 'java' apply plugin: 'jacoco' sourceCompatibility = 1.8 // Disable the test report for the individual test task test { reports.html.enabled = false reports.junitXml.enabled = false } repositories { mavenCentral() } dependencies { testImplementation 'junit:junit:4.13.2' } } // 彙總 Gradle 多模組程式碼覆蓋率報告 task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') { description = 'Generates an aggregate report from all subprojects' dependsOn(subprojects.test) additionalSourceDirs.from = files(subprojects.sourceSets.main.allSource.srcDirs) sourceDirectories.from = files(subprojects.sourceSets.main.allSource.srcDirs) classDirectories.from = files(subprojects.sourceSets.main.output) executionData.from = files(subprojects.jacocoTestReport.executionData) reports { html.enabled true } } // 彙總 Gradle 多模組測試結果 task testRootReport(type: TestReport) { destinationDir = file("$buildDir/reports/allTests") // Include the results from the `test` task in all subprojects reportOn subprojects*.test { ignoreFailures = true // 忽略測試失敗 } }View Code
如果某個子模組不生成 jacoco/test.exec會報錯,參考下面配置
buildscript {
repositories {
mavenLocal()
}
dependencies {
//spring-boot外掛
classpath("org.springframework.boot:org.springframework.boot.gradle.plugin:2.6.3")
}
}
plugins {
id 'java'
id 'jacoco'
}
apply from: "./config.gradle"
group = 'xxx'
version = '1.0-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
maven {
url "http://xxx/nexus/content/groups/public/"
}
}
dependencies {
implementation ('org.springframework.boot:spring-boot-starter-web:2.6.3')
}
tasks.withType(Jar) {
destinationDir = file("../build/libs") //$rootDir 取專案的頂級目錄
}
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
subprojects {
apply plugin: 'java'
apply plugin: 'jacoco'
sourceCompatibility = 1.8
repositories {
maven {
url "http://xxx/nexus/content/groups/public/"
}
}
dependencies {
testImplementation 'junit:junit:4.13.1'
}
}
def printProjectName = {
project ->
println '需要進行jacoco聚合的子工程: ' + project.name
}
/*
// 聚合各個子模組的build/jacoco/test.exec
// 構建jacoco程式碼覆蓋率的步驟
gradle clean
gradle test --continue // 執行test用例,--continue 用例報錯繼續執行
//gradle jacocoTestReport // 在子模組下面生成該子模組的單測覆蓋率
gradle jacocoRootReport // 聚合各個子模組,生成整個工程的單測覆蓋率
// 一步生成jacoco程式碼覆蓋率的指令
gradle clean test --continue jacocoRootReport
*/
task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') {
description = 'Generates an aggregate report from all subprojects'
//dependsOn(subprojects.test)
// 需要生成test.exec的子模組(如果不排除不生成單測的模組,執行gradle jacocoRootReport會報找不到該模組的test.exec)
def projects = ['xxx', 'yyy']
def jacocoProjects = subprojects.findAll{ projects.contains(it.getName()) }
doFirst {
jacocoProjects.forEach(printProjectName)
}
additionalSourceDirs.from = files(jacocoProjects.sourceSets.main.allSource.srcDirs)
sourceDirectories.from = files(jacocoProjects.sourceSets.main.allSource.srcDirs)
classDirectories.from = files(jacocoProjects.sourceSets.main.output)
executionData.from = files(jacocoProjects.jacocoTestReport.executionData)
reports {
html.enabled true
}
}
// 忽略測試失敗
test {
ignoreFailures = true
}
// 彙總 Gradle 多模組測試結果
task testRootReport(type: TestReport) {
destinationDir = file("$buildDir/reports/allTests")
// Include the results from the `test` task in all subprojects
reportOn subprojects*.test {
ignoreFailures = true // 忽略測試失敗
}
}
// 一步生成測試結果和程式碼覆蓋率報告
// gradle clean test --continue jacocoRootReport testRootReport
View Code
4、利用 jacococli 生成覆蓋率
當已經生成jacoco/test.exec,結合原始碼和編譯classes生成jacoco覆蓋率報告
java -jar jacococli.jar report ./test.exec --classfiles ../classes --sourcefiles ../../src/main/java --encoding utf-8 --html jacoReport