木心

毕竟几人真得鹿,不知终日梦为鱼

导航

汇总gradle多模块测试结果和汇总Gradle多模块代码覆盖率jacoco报告

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 生成覆盖率

  利用 jacococli 生成覆盖率:仅供参考,根据前面的配置不仅可以生成单个模块的覆盖率,而且可以聚合生成整体项目的覆盖率。

  当已经生成jacoco/test.exec,结合源代码和编译classes生成jacoco覆盖率报告

java -jar jacococli.jar report ./test.exec --classfiles ../classes --sourcefiles ../../src/main/java --encoding utf-8 --html jacoReport

posted on 2022-04-04 13:52  wenbin_ouyang  阅读(2006)  评论(0编辑  收藏  举报