1. 程式人生 > 其它 >彙總gradle多模組測試結果和彙總Gradle多模組程式碼覆蓋率報告

彙總gradle多模組測試結果和彙總Gradle多模組程式碼覆蓋率報告

Gradle 使用者指南中文版

Gradle官網使用者指南

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