移动端精准测试之跨版本覆盖率合并

news2024/11/17 2:28:02

一,项目简介

     在移动端项目测试过程中,尤其是发版前的回归测试阶段,会遇到这样的情况,在测试过程中测试不断地发现问题,开发就进行修改,然后打包测试。而测试完成后呢,业务测试同学想知道整个回归测试阶段的覆盖率情况,但是针对每次不同的打包,会根据对应的版本生成相应的报告,不同版本的覆盖率执行如何进行合并呢?

       在网上搜索了一下,jacoco本身有jacoco merge功能,但是只针对同一版本的,如果版本变化了,也就意味着类有变化,那这个类在老版本中所有的覆盖率数据就会被丢掉。这样一来,必须会丢失一些版本中的覆盖率数据,同时,如果函数有变化,则这个函数调用链路上的所有功能就要重新测试,原来的覆盖率数据就要丢弃。综合考虑,无法直接使用jacoco merge来进行跨版本的覆盖率数据合并,这就要求我们自己开发一套覆盖率合并方案。

二,覆盖率合并方案介绍

1,网上方案调研  

 通过调研网上现有的jacoco覆盖率合并方案,得到了一些思路,但是没有切实可行的方案。参考文档:

  • 基于 Jacoco 的二次开发【解决不同版本 exec 数据合并问题】:

    https://testerhome.com/topics/30776

  • jacoco的多次代码提交merge分析:

    https://chowdera.com/2022/195/202207130538134324.html

  • 写给android同学的代码覆盖率讲解:

    https://www.jianshu.com/p/97caec282998

  • JaCoCo探针策略原理及案例总结:

    https://bbs.huaweicloud.com/blogs/274224

2,自研合并方案

     针对业务同学的要求,需要对同一分支不同版本的多次打包产生的覆盖率数据进行合并,不同分支的合并起来意义不大。但合并过程中也涉及到众多处理逻辑,现在将整体方案流程介绍如下:

图片

介绍:

1,对比要合并的版本,先按版本合并覆盖率数据文件,找出diff的函数列表;

2,通过diff函数列表,查询调用链路,找到其影响的上游函数列表,组成受影响的函数列表。

3,对受影响的函数列表,找到其在老版本中的行号,去掉对应的行号的覆盖率信息。

4,根据diff函数列表,找到其所在类中的位置没有变化的函数列表,以及位置变化的函数列表。

5,针对位置没有变化的函数列表,将旧版本中的覆盖率信息,写入到合并后的覆盖率文件中;

6,针对位置有变化的函数列表,将旧版本中的覆盖行号校正为新版本中类的对应的行号,写回覆盖率文件中。

7,循环处理所有需要合并的版本覆盖率数据文件,生成最终的覆盖率文件。

三,Android 跨版本覆盖率合并

  针对Android系统的跨版本覆盖率合并,diff函数可以通过git提供的功能来实现,查询类中函数的起始位置,由主站的同学提供的解析kotlin和java文件的功能来解析。而最重要的就是,对覆盖率数据文件EC的处理。主站同学提供的jacoco-parser.jar工具,用来解析覆盖率ec文件覆盖的行号,而无法修改EC文件,而我们的需要对EC文件进行处理。

1,EC文件的处理

图片

    这样的处理没有办法直接通过java代码或是python来处理,只能开发一个单独的工具,来操作EC文件。所以就优化了主站同学的jacoco-parser.jar,引用jacoco插件来处理EC文件,最终生成的工具是jacoco-parser2.0.jar.

2,版本合并时函数处理

合并版本的时候,需要处理的函数信息有如下几类:

  • diff函数及其在调用链路中影响到的函数列表;

  • diff函数所在类,位置没有变化的函数列表;

  • diff函数所在类,位置有变化,需要在新版本中修正行号的函数列表。

具体的处理流程如下:

图片

为了与先前的覆盖率生成功能保持一致,节省相关操作,故将此功能放到了Android  Agent上,以服务的形式对精准测试平台提供服务。

3,精准测试平台合并覆盖率

      为了让测试同学来合并覆盖率操作,需要在精准测试平台上添加合并覆盖率的操作,通过精准测试平台向Agent发送消息,同时借助于原来的生成覆盖率报告的逻辑生成最终的合并后的覆盖率报告。最终的流程如下所示:

图片

    当得到了合并后的最终all-merged.ec文件后,就可以根据项目的其他信息,如当前分支,对比分支,最新的构建号等生成合并后的全量及增量覆盖率报告。

四,iOS 跨版本覆盖率合并

    iOS端的覆盖率合并,相对于Android端容易一些,因为iOS生成报告之前,会生成一个info文件,处理这个文件比EC文件简单多了。整体合并方案就是对比两个版本的info文件,根据diff函数列表,位置变化的函数列表进行处理。

1,iOS跨版本合并流程

图片

    通过上面的处理,以及对比合并后的覆盖率报告,发现一个问题:合并后的覆盖率报告行覆盖率没有问题,但是方法覆盖率不正确,也是不能直接对数据进行处理的。需要一定的逻辑处理才行,经过调研后,可以从下面的方式来进行。

2,iOS Swift跨版本覆盖率合并方法合并

图片

目前的功能暂时不对覆盖率合并后的文件进行校正的,根据业务同学在使用过程中,是否需要这个指标,如果需要,在Agent上添加相应的功能即可。

其中的合并两个info文件的操作,是自研的代码来处理的,主要思路是:

  • 先以最新的版本的info文件为基础,分别使用sed获取其中的文件以覆盖率信息;

  • 再从旧的版本的info文件中,找到相应的文件的覆盖率信息;

  • 按不同的情况,如新文件中有,旧的文件中没有;旧的文件中有,新的文件中没有;两个文件中都有,进行合并行覆盖率数据;

  • 最后将合并后的info文件写入新文件,再拷贝成较大的版本的文件,循环合并所有版本;

这种方法没有错误,但是当info文件中的文件信息过多时,如60多万行数据时,速度就非常慢,差不多要一个多小时才行。

有什么办法可以优化一下吗?

1,通过在网上搜索相关资料,找到lcov的使用文档:https://blog.csdn.net/qq_36614557/article/details/120264262

文档中说可以使用-a参数 合并两个lcov生成的文件,如下所示:

图片

2,通过两次详细搜索,合并方法如下

lcov -a test1.info -a test2.info -o allreport.info

经过验证,合并结果达到了预期,而合并速度快的不是一个数据级,非常开心!

3,在生成iOS覆盖率报告是,生成的info文件命令

xcrun llvm-cov export "+procpath+"Kima --instr-profile="+procpath+"coverage_merged.profdata -use-color --format=lcov > "+procpath+"allreport_"+commitid+".info"

完全符合要求。

 于是合并info文件的函数变成如下所示,比原来的简单了太多了:


def newMergeTwoInfoFile(self,srcinfofile,destinfofile):
    """
    使用llcov -a 合并(归并)多个lcov生成的info文件
    :param srcinfofile:
    :param destinfofile:
    :return:
    """
    newinfofile=destinfofile[0:destinfofile.rindex("/")+1]+"merged_report.info"
    if os.path.exists(srcinfofile) and os.path.exists(destinfofile):
        mergecmd=self.lcovcmd+" -a "+srcinfofile+" -a "+destinfofile+" -o "+newinfofile
        os.system(mergecmd)
        #将删除过覆盖率数据的info文件,更名为老的文件
        rmcmd="rm -rf "+destinfofile
        os.system(rmcmd)
        mvcmd="mv "+newinfofile+" "+destinfofile
        os.system(mvcmd)
    else:
        print("要合并的两个info文件:"+srcinfofile+","+destinfofile+"不存在!")

最终的合并覆盖率报告执行时间,也由原来的一个小时二十多分钟,降低到了二十多分钟!

3,精准测试平台iOS覆盖率合并方案

图片

     由于在容器上无法处理iOS覆盖率报告,所以只能根据keep构建号把覆盖率数据文件profraw上传到Agent上来处理。iOS Agent需要做大量对覆盖率数据处理,生成info文件,合并info文件的操作。其中对函数的过滤和处理使用的是经过二次开发的工具drafter,这个工具可以根据文件来返回文件中的函数列表,包括起始位置。

五,总结

覆盖率跨版本合并,正常情况下是不允许的,这也是为什么jacoco就不支持的原因。因为类一旦变化了,类中函数的位置,函数内容都会变化,同时其调用函数也会受到影响。极端的情况,就是函数中的逻辑变化了,先前与这个函数相关的所有操作都要重新测试。

1,Android中的覆盖率数据是通过探针来控制覆盖情况的,如果多个探针同时控制一个覆盖逻辑的话,上面的覆盖率行号的修改就会出错;由于探针和行号不是一一对应的,所以很难根据探针准确地修改行号的覆盖情况。现在的合并方案虽然比直接jacoco merge更加准确一些,但是也不完全准确。

2,iOS覆盖率的合并,其实是对Info文件做了处理,针对覆盖的行号的后面的数字做了处理,如原行号覆盖为0,改成1还好理解。如果原来行号覆盖数据是2,要合并的是3,合并后改成了5。这个5在报告中如何渲染的呢?其实没有太搞明白。现在info文件信息解读,网上也不多。

六,常见问题

     在实际使用过程中,增加了对项目Module模块的覆盖率的收集,生成的测试报告显然比原来的更加全面了,但出现了两个问题:

1,覆盖率收集的Pod相关的文件,生成报告的时候找不到文件?

      由于项目和Module的调用,会出现一些Pod中的头文件信息,这是因为主代码与pod module交互的接口或是过度等。但是生成覆盖率报告的时候,在源项目中是找不到对应的文件的,所以genhtml报告时会因文件找不到出错。

解决方案:在生成覆盖率报告info文件后,过滤掉info文件中与pod相关的文件及其覆盖率信息,以保证生成html报告时不会出错文件找不到的问题。

2,iOS覆盖率合并的时候,合并版本与项目分支对应的版本不同,会出现文件找不到?

      在进行覆盖率的合并的时候,由于创建覆盖率任务与生成报告时间间隔内,如果开发有提交代码,早期的更新项目的逻辑是拉出对应分支最新 的版本,可能造成新版本修改了文件,老版本的覆盖率报告找不到文件。

解决方案:在生成合并覆盖率合并报告时,先获取要合并覆盖率报告任务的最新版本号,将项目切到这个版本再生成报告。生成完成后,再切回分支的最新版本,防止影响其他的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1501705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xcode升级到Xcode15.1或15.2之后,无法新建Category和Extension文件,如何解决?

项目场景: Xcode升级到15.1或15.2之后,无法新建Category和Extension文件,并且Xcode不报任何错误 问题描述 Xcode升级到15.1或15.2之后,无法新建Category和Extension文件,并且Xcode不报任何错误。 具体的操作步骤如下…

UDP实现文件的发送、UDP实现全双工的聊天、TCP通信协议

我要成为嵌入式高手之3月7日Linux高编第十七天!! ———————————————————————————— 回顾 重要程序 1、UDP实现文件的发送 发端: #include "head.h"int main(void) {int sockfd 0;struct sockaddr_i…

缩放算法优化步骤详解

添加链接描述 背景 假设数据存放在在unsigned char* m_pData 里面,宽和高分别是:m_nDataWidth m_nDataHeight 给定缩放比例:fXZoom fYZoom,返回缩放后的unsigned char* dataZoom 这里采用最简单的缩放算法即: 根据比…

【C语言】数据类型和变量

前言💞💞 啦啦啦~这里是土土数据结构学习笔记🥳🥳 💥个人主页:大耳朵土土垚的博客 💥 所属专栏:C语言笔记 💥欢迎大家🥳🥳点赞✨收藏&#x1f49…

【Node.js从基础到高级运用】二、搭建开发环境

Node.js入门:搭建开发环境 在上一篇文章中,我们介绍了Node.js的基础概念。现在,我们将进入一个更实际的阶段——搭建Node.js的开发环境。这是每个Node.js开发者旅程中的第一步。接下来,我们将详细讨论如何安装Node.js和npm&#…

将python编写的网站制作成docker镜像并上传到Github Packages上

文章目录 前言Docker安装docker注意事项 创建Dockerfile注意事项 构建 Docker 镜像运行 Docker 镜像 发布到Github Packages坑坑到位申请token的坑docker登录的坑给镜像添加标签的坑docker推送的坑 在Github Packages上查看总结 前言 还记得上一篇《借助ChatGPT使用Python搭建…

借助Aspose.html控件,在 Java 中将 URL 转换为 PDF

如果您正在寻找一种将实时 URL 中的网页另存为 PDF文档的方法,那么您来对地方了。在这篇博文中,我们将学习如何使用 Java 将 URL 转换为 PDF。从实时 URL转换HTML网页可以像任何其他文档一样保存所需的网页以供离线访问。将网页保存为 PDF 格式可以轻松突…

PandasAI—让AI做数据分析

安装 pip install pandasai !pip install --upgrade pandas pandasai 导入依赖项 import pandas as pdfrom pandasai import PandasAIfrom pandasai.llm.openai import OpenAI使用pandas创建一个数据框 df pd.DataFrame({"country": ["United States",…

MKS Type 631C 真空计说明详细内容查看图中目录

MKS Type 631C 真空计说明详细内容查看图中目录

【sw网络监控】通过snmp协议相关的snmp-exporter(收集交换机网络监控数据)+ promethus + grafana

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…

C++异常处理机制

目录 一,传统C语言处理异常 二,C异常概念 三,使用 1. 自定义异常体系 2. 在函数调用链中异常栈展开匹配原则 3. 异常的重新抛出 四,异常规范 五,异常安全 六,C标准库的异常体系 七,异…

【开源】JAVA+Vue.js实现高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

liteIDE 解决go root报错 go: cannot find GOROOT directory: c:\go

liteIDE环境配置 我使用的liteIDE为 x36 5.9.5版本 。在查看–>选项 中可以看到 LiteEnv,双击LiteEnv ,在右侧选择对应系统的env文件,我的是win64系统,所以文件名为win64.env 再双击 win64.env ,关闭当前窗口&…

python淘宝网页爬虫数据保存到 csv和mysql(selenium)

数据库连接设置(表和字段要提前在数据库中建好) # 数据库中要插入的表 MYSQL_TABLE goods# MySQL 数据库连接配置,根据自己的本地数据库修改 db_config {host: localhost,port: 3306,user: root,password: ma*****6,database: may2024,charset: utf8mb…

TCP包头、TCP为什么安全可靠、UDP和TCP的区别、http协议

我要成为嵌入式高手之3月8日Linux高编第十八天!! __________________________________________________ 学习笔记 TPC包头 1、序号 发送端发送数据包的编号 2、确认号 已经确认接收到的数据的编号,只有当ACK为1时,该位才有用 …

简介maven核心:pom项目对象模型

Maven Maven 意思是知识的积累者,最初是为了简化 Jakarta Turbine 项目中的构建过程。有几个项目,每个项目都有自己的 Ant 构建文件,它们都略有不同。JAR 被检入 CVS。我们想要一种标准的方式来构建项目,清楚地定义项目的组成&am…

Jmeter 测试使用基本组件结构

JMeter简介 Apache组织开发的开源免费压测工具纯Java程序,跨平台性强源程序可以从网上下载高扩展性可对服务器、网络或对象模拟巨大的负载,进行压力测试可以用于接口测试支持分布式、多节点部署 JMeter安装 下载位置 官网https://jmeter.apache.org/ …

基于单片机的灭火机器人设计

目 录 摘 要 I Abstract II 引 言 1 1 系统方案设计 4 1.1 方案论证 4 1.2 灭火机器人系统工作原理 4 2 系统硬件设计 6 2.1 单片机 6 2.2 火焰探测系统设计 8 2.3 灭火系统设计 8 2.4 循迹模块设计 9 2.5 电机驱动模块 10 3 系统软件设计 12 3.1 系统软件开发环境 12 3.2 系统…

防御保护 IPSEC VPPN实验

实验背景:FW1和FW2是双机热备 主备备份模式。 实验要求:在FW5和FW3之间建立一条IPSEC通道,保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置(由于是双机热备状态,所以FW1和FW2只需要配置FW1主设…

STM32标准库——(20)WDG看门狗

1.WDG简介 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作 2.IWDG框图 它的结构和定时器是非常相似的&#xf…