第2.6节 iOS生成全量和增量报告

news2025/7/15 7:30:40

2.6.1 简介

     在采集了覆盖率数据后,就需要生成对应需求的全量和增量覆盖率报告,以便对测试进行查漏补缺。IOS系统有两种开发语言,所以生成报告的方式也不相同,下面就分别介绍一下Object C和Swift语言如何生成覆盖率报告。

2.6.2 Object C项目生成全量报告

提取覆盖率数据

1. 打开Xcode -> window -> Devices and Simulaters, 选择运行测试的真机

2. 在Installed Apps中选择测试的应用,然后点击底部的齿轮按钮选择Download Container

3. 会得到一个xxxx.xcappdata文件

4. 右键点击xcappdata文件 -> 显示包内容, 进入AppData/Documents/arm64/, 拷贝里面的所有.gcda文件。这些数据文件都是覆盖率数据,针对每个类会有一个覆盖率数据文件,项目大的时候数据会非常多。

5. 进入项目目录/Pods/XcodeCoverage, 打开env.sh, 找到 OBJECT_FILE_DIR_normal属性和CURRENT_ARCH属性的值, 这里要注意下如果CURRENT_ARCH的值是undefined就改成arm64(关键)

6. 打开Finder,使用shift+command+G按钮输入/,其中 OBJECT_FILE_DIR_normal 及 CURRENT_ARCH 是上一步找到的值,(尖括号注意去掉)

7. 把上面第4步拷贝的所有.gcda文件拷贝到第六步打开的目录中

8,生成覆盖率报告

打开终端, cd进入项目目录/Pods/XcodeCoverage, 运行命令:

./getcov --show

即可自动生成覆盖率报告

测试报告文件在路径:/Users/*****/Xcode/DerivedData/GHDropMenuDemo-fyxjnfwoowzqbhefbawkfehlqwlt/Build/Products/Debug-iphoneos/lcov下

这个报告就是针对整个项目的全量报告,生成过程手动操作较多, 可以继续研究下如果实现自动化。

2.6.3 Object C项目生成增量报告

由于iOS没有生成增量报告的工具,我们经过调研与尝试,可以通过以下方案进行处理:

1,通过lcov命令生成info报告数据

lcov -b <测试代码路径> -d <gcda目录位置> -c -o result.info --rc lcov_branch_coverage=1

注意:测试代码路径中包含构建生成的类文件 gcno。

2,生成的info格式的报告文件就可以解读,通过git diff拿到增量信息,然后再处理报告,处理方法和Swift是一样的,后面我们统一介绍。

3,处理后的数据为diffreport.info文件,通过genhtml生成报告即可:

genhtml -o diffreport diffreport.info

2.6.4 Swift项目生成全量报告

1,收集生成覆盖率数据文件

(1)拷贝第二步生成的覆盖率数据文件,如:test.profraw;

(2)拷贝应用构建生成的可执行文件

路径:

~/Library/Developer/Xcode/DerivedData/shoppingCart-efmklxddypsuvfgiumzoyfnmnudr/Build/Products/Debug-iphoneos/shoppingCart.app/shoppingcart

当然也可以解压ipa文件或是app文件拿到可执行文件。

2,生成覆盖率报告

(1)合并及转换覆盖率数据
 

xcrun llvm-profdata merge coverage_file1657885040728.profraw coverage_file1657885829980.profraw test.profraw -output merged.profraw

xcrun llvm-profdata merge -sparse test.profraw -o test.profdata

(2)查看覆盖情况命令

xcrun llvm-cov show ./shoppingCart --instr-profile=test.profdata

(3)生成汇总报告

xcrun llvm-cov report ./shoppingCart -instr-profile=test.profdata

(4)生成HTML报告

xcrun llvm-cov show ./shoppingCart 
--instr-profile=test.profdata --format=html
-use-color --output-dir ./coverage_report

(5) 生成XcodeCoverage报告

A, 生成info文件

xcrun llvm-cov export ./shoppingCart 
--instr-profile=test.profdata -use-color 
--format=lcov > ./newreport.info

B, 生成xcodecoverage报告

./lcov-1.14/bin/genhtml -o html ./newreport.info

C, 报告样式如下:

2.6.5 Swift项目生成增量报告

在网络上查了一下iOS增量报告的生成,几乎没有现成的方案,通过分析allreport.info文件,发现这个文件的信息如下所示:

一个Swift 项目的覆盖率报告Info文件,具体的内容如下:

SF:/Users/sxf/Documents/精准测试/KimCode/iOSSDKInject/kim-ios/packages/kim-ios/Kim/DataHelper/KImPinYin.swift
FN:16,$s4Kima9KimPinYinC7preloadyyFZ
FN:20,$s4Kima9KimPinYinCACycfc
FN:24,$s4Kima9KimPinYinCfD
FN:28,$s4Kima9KimPinYinC12pinyinLoadedyyF
FN:33,$s4Kima9KimPinYinC7convertyS2SF
FN:42,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FN:49,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:52,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:60,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FN:67,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:70,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:78,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FN:85,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FN:88,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ
FNDA:0,$s4Kima9KimPinYinCACycfc
FNDA:0,$s4Kima9KimPinYinCfD
FNDA:0,$s4Kima9KimPinYinC12pinyinLoadedyyF
FNDA:0,$s4Kima9KimPinYinC7convertyS2SF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
FNF:14
FNH:1
DA:16,2
DA:17,2
DA:18,2
DA:20,0
DA:21,0
DA:22,0
DA:23,0
DA:24,0
DA:25,0
DA:26,0
DA:28,0
DA:29,0
DA:30,0
DA:31,0
DA:33,0
DA:34,0
DA:35,0
DA:36,0
DA:37,0
DA:38,0
DA:42,0
DA:43,0
DA:44,0
DA:45,0
DA:46,0
DA:47,0
DA:48,0
DA:49,0
DA:50,0
DA:51,0
DA:52,0
DA:53,0
DA:54,0
DA:55,0
DA:56,0
DA:60,0
DA:61,0
DA:62,0
DA:63,0
DA:64,0
DA:65,0
DA:66,0
DA:67,0
DA:68,0
DA:69,0
DA:70,0
DA:71,0
DA:72,0
DA:73,0
DA:74,0
DA:78,0
DA:79,0
DA:80,0
DA:81,0
DA:82,0
DA:83,0
DA:84,0
DA:85,0
DA:86,0
DA:87,0
DA:88,0
DA:89,0
DA:90,0
DA:91,0
DA:92,0
DA:93,0
DA:94,0
DA:95,0
DA:96,0
DA:97,0
DA:98,0
DA:99,0
DA:100,0
BRF:0
BRH:0
LF:91
LH:3
end_of_record

文件中有多个这样的数据块组成,现在需要对这个数据块进行分析,以便进行跨版本的覆盖率合并。但是,从网上搜索相关介绍的时候,几乎是没有的。于是我们只能借助于其他的数据进行比对,比如说,生成html报告,使用如下命令:

xcrun llvm-cov show ./binapp --instr-profile=./commitA/coverage_mergedA.profdata --format=html -use-color --output-dir=./commitA/checkreport

打开报告,内容如下:

然后对照着这两份数据,就可以大概了解一下相关的内容了:

1,类下的信息

SF:/Users/sxf/Documents/精准测试/KimCode/iOSSDKInject/kim-ios/packages/kim-ios/Kim/DataHelper/KImPinYin.swift
FN:16,$s4Kima9KimPinYinC7preloadyyFZ
FN:20,$s4Kima9KimPinYinCACycfc
FN:24,$s4Kima9KimPinYinCfD
FN:28,$s4Kima9KimPinYinC12pinyinLoadedyyF
FN:33,$s4Kima9KimPinYinC7convertyS2SF
FN:42,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FN:49,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:52,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:60,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FN:67,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FN:70,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FN:78,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FN:85,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FN:88,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU0_
FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ
FNDA:0,$s4Kima9KimPinYinCACycfc
FNDA:0,$s4Kima9KimPinYinCfD
FNDA:0,$s4Kima9KimPinYinC12pinyinLoadedyyF
FNDA:0,$s4Kima9KimPinYinC7convertyS2SF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B12SelectMemberCRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyF
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0B4UserVRszlE23sortByDisplayNamePinyinSayADGyFADSgSS_SitXEfU0_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tF
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFSbSS_Sit_SS_SittXEfU_
FNDA:0,$sSa4Kima8KimModel0b18GroupMemberContactC0CRszlE23sortByDisplayNamePinyin15moveAdminToFistSayADGSb_tFADSgSS_SitXEfU

类中的函数信息:

FN:16,$s4Kima9KimPinYinC7preloadyyFZ

  • FN:代表方法
  • 16:代表开始行号
  • 后面的是方法名以及模块相关的信息。

FNDA:2,$s4Kima9KimPinYinC7preloadyyFZ

  • FNDA:代码方法的覆盖情况
  • 2:代表方法中的代码可能执行的次数,但不一定是所有的行都执行了,需要具体分析;
  • 后面的是方法信息,与FN相照应。

2,方法覆盖率信息

FNF:14 FNH:1

通过对比html报告,可以看出:

FNF:代码这个文件中的总方法数;

FNH:为覆盖的方法数

而我们合并覆盖率报告的时候,可以先对比一下总方法数是否一样,如果相同,再去考虑如何处理覆盖的方法数;如果不同,则选择最新版本的方法数;在生成增量报告的时候,无需要修改此处内容,生成的报告会根据函数信息,直接展示函数覆盖情况。

3,行覆盖率信息

LF:91 LH:3

LF: 代码这个文件的总行数,总行数以最新的版本为准;

LH:为覆盖的行数,合并覆盖率后,需要统计一下合并后的覆盖行号,更新一下这个数;

DA:84,0

DA:XX 代表文件中的第几行

0:最后的数字代码此行执行了多少次,如果为0则表示没有执行到,也就是没有覆盖。

4,分支覆盖

BRF:0 BRH:0

BRF:为总分支数

BRH:为覆盖的分支数,一般的Swift文件都是0

2.6.6 iOS增量报告生成

通过分析info文件,再结合获取一个需求的diff信息,就能生成对应的增量覆盖率。具体逻辑如下所示:

1,根据一定的diff策略,拿到对应需求的diff文件以及diff的行号。

由于git diff得到的信息,再计算相应的diff行号,可能存在有些行不是开发修改的行号;虽然情况不多,但也是有存在的机率。

2,根据diff信息,再过滤全量报告的allreport.info文件

3,遍历完所有的diff文件,生成增量报告diffreport.info文件;

4,通过genhtml命令,将diffreport.info文件,生成增量覆盖率报告。

genhtml -o diffreport diffreport.info

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

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

相关文章

应用分享 | AWG技术突破:操控钻石氮空位色心,开启量子计算新篇章!

利用AWG操作钻石中的氮空位色彩中心 金刚石中的颜色中心是晶格中的缺陷&#xff0c;其中碳原子被不同种类的原子取代&#xff0c;而相邻的晶格位点则是空的。由于色心具有明亮的单光子发射和光学可触及的自旋&#xff0c;因此有望成为未来量子信息处理和量子网络的固态量子发射…

【视觉与语言模型参数解耦】为什么?方案?

一些无编码器的MLLMs统一架构如Fuyu&#xff0c;直接在LLM内处理原始像素&#xff0c;消除了对外部视觉模型的依赖。但是面临视觉与语言模态冲突的挑战&#xff0c;导致训练不稳定和灾难性遗忘等问题。解决方案则是通过参数解耦方法解决模态冲突。 在多模态大语言模型&#xf…

重建二叉树(C++)

目录 1 问题描述 1.1 示例1 1.2 示例2 1.3 示例3 2 解题思路 3 代码实现 4 代码解析 4.1 初始化 4.2 递归部分 4.3 主逻辑 5 总结 1 问题描述 给定节点数为 n 的二叉树的前序遍历和中序遍历结果&#xff0c;请重建出该二叉树并返回它的头结点。 例如输入前序遍历序…

10乱码问题的解释(1)

在计算机中,一个汉字,占几个字节? 针对这个问题,只要你回答出一个具体的数字,就一定是错的!! 前提条件: 当前中文编码使用的是哪种方式(字符集) 计算机存的其实是二进制数字~~ 英文字母,怎么表示的?? ASCII 码表~~ 规定了每个字符,都有一个对应的数字来表示~~ 只是表示英文,…

短视频文案--钓鱼女和滑板女

短视频文案 第一个文案&#xff1a; 1标题&#xff1a;风萧萧兮易水寒&#xff0c;美女钓鱼兮不复还 2内容&#xff1a; 我站在池边的微风中&#xff0c;再也看不到曾经快乐的少女了。 风很凉&#xff0c;凉得心不知前往何处。 水很清&#xff0c;清得深知这里没鱼群。 芦苇…

nginx的自动跳转https

mkdir /usr/local/nginx/certs/ 创建一个目录 然后用openssl生成证书 编辑nginx的配置文件 自动跳转成功 做一个优化&#xff0c;如果访问的时候后面加了其他的uri也一起自动跳转了

python-leetcode 62.搜索插入位置

题目&#xff1a; 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置 方法一&#xff1a;二分查找 假设题意是在排序数组中寻找是否存在一个目标值&#xff0c;则可以…

2. ollama下载及安装deepseek模型

ollamam 1. ollama2. ollama常用命令3. Windows配置Ollama与DeepSeek自定义目录环境3.1 自定义安装3.3 添加到系统变量 1. ollama 官网地址 下载地址 测试安装 deepseek模型下载地址 根据电脑性能下载对应版本 2. ollama常用命令 # 运行模型 ollama run 模型 # 查看模型…

Qt基本框架(1)

本篇主要介绍Qt的基本框架&#xff0c;并实现简单的按钮事件 本文部分ppt、视频截图原链接&#xff1a;[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1. Qt基本框架介绍 Qt基本框架主要分为两部分&#xff1a;Qt实例对象和Qt窗口。Qt实例对象负责初始化Qt运行时…

动手学深度学习:AlexNet

前言 从这个模型开始&#xff0c;我的数据集主阵地就将从装甲板转移到手语视频数据集&#xff0c;模型开始变得更加复杂&#xff0c;数据集当然也要更复杂啦&#xff0c;我将记录在这个过程中遇到的问题和解决后续。 数据读取 由于是视频数据集&#xff0c;我采取的方法是将…

MySql之binlog与数据恢复(Binlog and Data Recovery in MySQL)

MySql之binlog与数据恢复 什么是binlog binlog我们一般叫做归档日志&#xff0c;他是mysql服务器层的日志&#xff0c;跟存储引擎无关&#xff0c;他记录的是所有DDL和DML的语句&#xff0c;不包含查询语句&#xff0c;binlog是一种逻辑日志&#xff0c;他记录的是sql语句的原…

JDK1.8和Maven、Git安装教程自用成功

一.JDK安装 JRK&#xff1a;java运行环境 JDK&#xff1a;java语言的软件开发工具包&#xff1b;JDK里包含了java开发工具&#xff0c;也包含了JRE 1.下载JDK1.8并安装 Java Downloads | Oracle 进入官网后往下翻&#xff0c;找到JAVA8&#xff1b; 然后选择对应的版本&am…

数据采集助力AI大模型训练

引言使用抓取浏览器采集ebay商品页面选购亮数据AI训练数据总结 引言 AI技术在今天已经是我们工作生活中不可或缺的工具&#xff0c;很多小伙伴也在致力于训练AI模型。高质量的数据是训练强大AI模型的核心驱动力&#xff0c;无论是自然语言处理、计算机视觉还是推荐系统&#xf…

Rust 为什么不适合开发 GUI

前言 在当今科技蓬勃发展的时代&#xff0c;Rust 编程语言正崭露头角&#xff0c;逐步为世界上诸多重要基础设施提供动力支持。从存储海量信息到应用于 Linux 内核&#xff0c;Rust 展现出强大的实力。然而&#xff0c;当涉及构建 GUI&#xff08;图形用户界面&#xff09;时&…

消息队列篇--通信协议篇--理解HTTP、TLS和TCP如何协同工作

前面介绍了HTTP/HTTPS&#xff0c;SSL/TLS以及TCP和UDP&#xff0c;这些在网络传输上分别有着自己的作用。为了深入理解下这些概念&#xff0c;本篇重点介绍下HTTP、TLS 和 TCP是如何协同工作的&#xff1f;我们从底层到上层逐步分析每个协议的作用及其相互关系。这些协议共同协…

代码随想录算法训练营第三十四天 | 62.不同路径 63.不同路径II 343.整数拆分

62.不同路径 题目链接&#xff1a;62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路径_哔哩哔哩_bilibili 思路&#xff1a;机器人位于一…

2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 1、日期统计-&#xff08;解析&#xff09;-暴力dfs&#xff08;&#x1f609;蓝桥专属 2、01串的熵-&#xff08;解析&#xff09;-不要chu…

RK3568-适配ov5647摄像头

硬件原理图 CAM_GPIO是摄像头电源控制引脚,连接芯片GPIO4_C2 CAM_LEDON是摄像头led灯控制引脚,连接芯片GPIO4_C3编写设备树 / {ext_cam_clk: external-camera-clock {compatible = "fixed-clock";clock-frequency = <25000000>;clock-output-names = "…

实战篇Redis

黑马程序员的Redis的笔记&#xff08;后面补一下图片&#xff09; 【黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…

沉浸式体验测评|AI Ville:我在Web3小镇“生活”了一周

最近&#xff0c;我在朋友的推荐下&#xff0c;体验了 aivillebot 的项目。起初&#xff0c;我只是抱着试试看的心态&#xff0c;心想这不就是个 Web3 版的《星露谷物语》吗&#xff1f; 但是一周下来&#xff0c;我发现这个虚拟小镇也没那么简单——里面的居民不是目前端游或链…