基于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

相关文章

在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的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易

使用Spring Boot集成Spring Data JPA和单例模式构建库存管理系统

引言 在企业级应用开发中,数据库操作是非常重要的一环。Spring Data JPA提供了一种简化的方式来进行数据库交互,它使得开发者无需编写复杂的JPA代码就可以完成常见的CRUD操作。此外,设计模式如单例模式可以帮助我们更好地管理和控制对象的创建过程,从而提高系统的性能和可维护性。本文将展示如何结合Spring Boot、Spring Data JPA以及单例模式来构建一个基本的库存管理系统