基于gradle的jacoco offline模式

2024-01-02 15:04
文章标签 模式 offline gradle jacoco

本文主要是介绍基于gradle的jacoco offline模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jacoco的官网:EclEmma - JaCoCo Java Code Coverage Library

gradle语法:任务依赖 - Gradle 用户指南官方文档中文版 - UDN开源文档

在使用jacoco的时候,有时候需要将当前待测试的java类,添加到@PrepareForTest() 中,这会导致生成的行覆盖html中,当前类的覆盖率是为0,网上说比较好的解决办法是,使用jacoco offline模式,但是网上给的参考大部分都是maven文件,或者给的gradle文件使用不了。

github上提供了两个比较好的示例:

示例一:GitHub - MohammadAlavi1986/gradle-jacoo-offline-instrumentation

该示例是基于java程序的gradle配置,不使用android程序

示例二:https://github.com/h8MyJob/PowerMockJacocoDemo

该示例比较老了,运行起来有很多问题。

下面是我运行成功的配置(摸索了好久。。。)

其中,gradle版本是:gradle-7.5-bin.zip

顶层的build.gradle文件:

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {id 'com.android.application' version '7.4.1' apply falseid 'com.android.library' version '7.4.1' apply false
}

module的build.gradle文件:

    //单元测试相关依赖testImplementation("org.powermock:powermock-module-junit4:2.0.7")testImplementation("org.powermock:powermock-module-junit4-rule:1.7.4")testImplementation("org.powermock:powermock-api-mockito2:2.0.7")testImplementation("org.powermock:powermock-core:2.0.7")testImplementation("org.mockito:mockito-core:3.11.2")testImplementation("junit:junit:4.13.2")testImplementation("android.arch.core:core-testing:1.1.1")testImplementation("org.mockito:mockito-inline:3.11.2")

最后 jacoco_offline.gradle 文件如下:

apply plugin: 'jacoco'configurations {jacocoAntjacocoRuntime
}// 设置 jacoco offline 模式的Report目录
def jacocoOfflineDir = layout.buildDirectory.dir('jacocoOfflineReport')jacoco {toolVersion = "0.8.11"  // 升级最新的版本reportsDirectory = jacocoOfflineDir
}def offline_instrumented_outputDir = "$buildDir.path/intermediates/classes-instrumented/debugCoverage"tasks.withType(Test) {jacoco.includeNoLocationClasses = truejacoco.excludes = ['jdk.internal.*']
}// 设置原java文件的目录
def coverageSourceDirs = ['src/main/java'
]// 设置生成覆盖率报告时,需要排除的文件
def excludeFiles = ['**/R.class','**/R$*.class','**/Manifest*.*','**/*Test*.*','android/**/*.*','**/BuildConfig.*','**/**Bean.class','**/inputmethod/*','**/config/*.*','**/flex/*.*','**/AssetsUtils.class'
]// 设置生成覆盖率报告时,仅仅支持的文件
def includeFiles = ['**/BuildConfig.*','**/HCInfoUtil.*'
]def classFileDir = fileTree(dir: 'build/intermediates/javac/debug/classes',excludes: excludeFiles
//        includes: includeFiles
)// (1)生成jacoco动态覆盖率报告(jacoco属于动态检查)
task jacocoTestReport(type: JacocoReport, dependsOn: "test") {group = "Reporting"description = "Generate Jacoco coverage reports"classDirectories.from = classFileDirgetSourceDirectories().setFrom(files(coverageSourceDirs))getExecutionData().setFrom(files('./build/jacoco/testDebugUnitTest.exec'))}jacocoTestReport {reports {xml.enabled  falsehtml.enabled  truehtml.destination file("build/test-results/jacocoHtml")}
}/*** jacoco offline instrumentation jacoco离线检查* 先生成原始的预检测的*.class,然后在此基础上生成.exec文件,而不是在运行中生成检测的class文件*/
task createOfflineTestCoverageReport(dependsOn: ['clean', 'instrument', 'testDebugUnitTest']) {group = "Reporting"doLast {ant.taskdef(name: 'report',classname: 'org.jacoco.ant.ReportTask',classpath: configurations.jacocoAnt.asPath)ant.report() {executiondata {ant.file(file: "$buildDir.path/jacoco/testDebugUnitTest.exec")}structure(name: 'Example') {classfiles {fileset(dir: "$project.buildDir/intermediates/javac/debug/classes")}sourcefiles {fileset(dir: 'src/main/java')}}// offline模式生成的报告路径,此报告不能排除文件,一般不用,而是在之后的task中生成 html 报告
//            html(destdir: "$buildDir.path/reports/jacocoHtml")}}
}gradle.taskGraph.whenReady { graph ->if (graph.hasTask(instrument)) {tasks.withType(Test) {doFirst {systemProperty 'jacoco-agent.destfile', buildDir.path + '/jacoco/testDebugUnitTest.exec'classpath = files(offline_instrumented_outputDir) + classpath + configurations.jacocoRuntime}}}
}/**  Instruments the classes per se*/
task instrument(dependsOn:'compileDebugUnitTestSources') {doLast {println 'Instrumenting classes'ant.taskdef(name: 'instrument',classname: 'org.jacoco.ant.InstrumentTask',classpath: configurations.jacocoAnt.asPath)ant.instrument(destdir: offline_instrumented_outputDir) {fileset(dir: "$buildDir.path/intermediates/javac/debug/classes")}}
}// 将 offline 模式生成的exec文件拷贝到另一个目录,与jacoco动态生成区分
task copyTask(dependsOn:['createOfflineTestCoverageReport']) {doLast{copy {from './build/jacoco/testDebugUnitTest.exec'into './build/jacoco/offline'}}
}// 删除 offline 生成的html报告,防止执行当前生成报告未更新
task deleteReportTask(type: Delete) {doLast {delete jacocoOfflineDir.get().toString()+'/jacocoTestReportOffline'}
}// 使用 offline 模式下的 exec 文件,生成html报告
task jacocoTestReportOffline(type: JacocoReport, dependsOn:['copyTask', 'deleteReportTask']) {group = "Reporting"description = "Generate Jacoco coverage reports"classDirectories.from = classFileDirgetSourceDirectories().setFrom(files(coverageSourceDirs))getExecutionData().setFrom(files('./build/jacoco/offline/testDebugUnitTest.exec'))
}// (2)生成 jacoco offline 模式的覆盖率报告
task GenerateJacocoOfflineCoverageReports(dependsOn:'jacocoTestReportOffline') {group = "Reporting"doLast {println '生成 jacoco offline 报告的路径:'println jacocoOfflineDir.get().toString() + '/jacocoTestReportOffline'}
}

这篇关于基于gradle的jacoco offline模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/562809

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

Java实现状态模式的示例代码

《Java实现状态模式的示例代码》状态模式是一种行为型设计模式,允许对象根据其内部状态改变行为,本文主要介绍了Java实现状态模式的示例代码,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来... 目录一、简介1、定义2、状态模式的结构二、Java实现案例1、电灯开关状态案例2、番茄工作法状态案例

gradle安装和环境配置全过程

《gradle安装和环境配置全过程》本文介绍了如何安装和配置Gradle环境,包括下载Gradle、配置环境变量、测试Gradle以及在IntelliJIDEA中配置Gradle... 目录gradle安装和环境配置1 下载GRADLE2 环境变量配置3 测试gradle4 设置gradle初始化文件5 i

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序