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 testRootReportView 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。