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

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.profrawxcrun 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.mzph.cn/pingmian/74218.shtml

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

相关文章

STM32技能综合巩固

一、深入理解ARMCPU架构及其指令格式、ARM汇编语言编程方法 1.汇编语言编程&#xff0c;实现LED灯 新建keil项目&#xff0c;选择芯片 选择运行环境以及配置 添加.s文件 汇编程序&#xff1a; AREAMYDATA,DATA AREAMYCODE,CODE ENTRY EXPORT__main __main MOVR0,#10 M…

P2Rank网页端:预测蛋白结合口袋+vina分子对接

P2Rank 是一种基于机器学习的蛋白质口袋预测工具&#xff0c;用于识别蛋白质结构中的潜在配体结合位点。它采用了一种基于物理特征的打分方法&#xff0c;结合随机森林&#xff08;Random Forest&#xff09;机器学习模型&#xff0c;以提高口袋预测的精确度。 该程序有在线工具…

安装windows server 2016没有可选硬盘,设备安装过ubuntu系统

如果在安装 Windows Server 2016 时无法识别已安装过 Ubuntu 的硬盘&#xff0c;可能是由于硬盘分区格式&#xff08;如 ext4&#xff09;与 Windows 不兼容&#xff0c;或缺少必要的驱动程序。以下是详细的解决方案&#xff1a; 1. 检查 BIOS/UEFI 设置 确认硬盘模式 • 重启电…

Debian系统_主板四个网口1个配置为WAN,3个配置为LAN

Debian系统_主板四个网口1个配置为WAN&#xff0c;3个配置为LAN 一、重新配置网口 1、查看当前网口的状态 ifconfig 或者 ip link show 或者 ls /sys/class/net 2、修改网络配置文件 sudo vi /etc/network/interfaces 注意WAN口的网关地址如果是192.168.3.1的话&#xff0c;L…

springboot整合Thymeleaf web开发出现Whitelabel Error Page

背景 在做java端上应用开发的时候&#xff0c;从资源和部署操作成本两方面考虑&#xff0c;一般会将前端的静态资源直接与后端应用一起打包&#xff0c;通过springboot内嵌的Tomcat提供web服务。进入web首页登录一直到后续业务流程正向操作&#xff0c;页面都能正常加载静态资…

JavaScript元素尺寸与位置

目录 client 家族与 offset 家族 一、client 家族&#xff1a;内容区域 内边距 示例代码 应用场景 二、offset 家族&#xff1a;内容区域 内边距 边框 滚动条 示例代码 应用场景 三、综合应用场景 1. 动态调整元素高度 2. 拖拽元素 3. 判断元素是否在视口内 四…

GZ073网络系统管理赛项赛题第1套模块A:网络构建解题笔记

2. 设备 接口或VLAN VLAN名称 二层或三层规划 说明 S1 VLAN10 CAIWU Gi0/1至Gi0/4 财务部 VLAN20 XIAOSHOU Gi0/5至Gi0/8 销售部 VLAN30 YANFA Gi0/9至Gi0/12 研发部 VLAN40 SHICHANG Gi0/13至Gi0/16 市场部 VLAN50 AP Gi0/20至Gi0/21 无线AP管理 VL…

jmeter web压力测试 压测

下载地址 Apache JMeter - Download Apache JMeter 1. 设置线程组 2. 设置http请求头 3. 设置http请求体 4. 设置结果条目 常用函数 ${__RandomString(8, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789)}${__javaScript( ${__Random(1000, 10000)} /…

大语言模型(LLM)应用开篇 | RAG方法论概述 | 构建知识库探索

大型语言模型应用开篇 | RAG技术 | 构建知识库探索 1、大语言模型&#xff08;LLM&#xff09;应用开篇2、RAG技术2.1 基于RAG实现知识库问答系统的基本步骤2.2 RAG与其他技术的关系与区别 1、大语言模型&#xff08;LLM&#xff09;应用开篇 现在是2025年&#xff0c;DeepSeek…

fbx bip互转 测试OK

目录 fbx bip互转 3dmax插件fbx转bip: 测试可以转: MotionBuilder fbx转bip fbx bip互转 3dmax插件fbx转bip: 测试可以转: 不用插件!!无脑把Mxiamo转bip骨骼动画 - CG软件插件脚本交流 - Powered by Discuz!

8个实用销售工具

CRM系统&#xff08;客户关系管理系统&#xff09; 特点&#xff1a;能集中管理客户信息&#xff0c;如联系方式、交易记录、偏好等&#xff0c;还可对销售流程进行自动化管理。 用途&#xff1a;帮助销售团队跟踪客户&#xff0c;分析客户行为&#xff0c;预测销售趋势&am…

【家政平台开发(6)】筑牢家政平台安全防线:全方位隐私与安全需求解析

本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析&#xff0c;剖析家政行业现状、挖掘用户需求与梳理功能要点&#xff0c;到系统设计阶段的架构选型、数据库构建&#xff0c;再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化…

IP 地址规划中的子网划分:/18 网络容纳 64 个 C 段(/24)的原理与应用解析

整体表格说明 这是某市教育城域网中某县教育相关机构的IP地址规划表&#xff0c;明确了某县一中和某县教育局的IP地址范围&#xff0c;包括终端使用地址段、业务互访地址段。 概念解析 64个C段终端及互联地址 C段地址&#xff1a;一个C段是IP地址中的一个/24网络&#xff08;…

python生成并绘制各种类型声音噪声

python生成并绘制各种类型声音噪声 1、效果 白噪声: 工业设备振动噪声: 2、噪声类型 主要噪声类型有: 白噪声:全频段能量均匀分布 直接生成高斯分布随机数粉红噪声:能量随频率增加按1/f衰减(适合声学测试) 使用IIR滤波器对白噪声进行滤波处理布朗噪声:能量随频率增加…

软考-数据库系统工程师第四版pdf

软考-数据库系统工程师第四版pdf git中的文件相对没有那么清楚&#xff0c;网盘的有高清版 github下载 这里我给出仓库地址 链接: https://github.com/yaodada123/ruankao-pdf https://github.com/yaodada123/ruankao-pdf gitee下载 https://gitee.com/yao-hengchao/ruank…

Linux(24)——系统调优

目录 一、tuned 软件包&#xff1a; 1、安装并启用 tuned &#xff1a; 2、验证 tuned 软件包&#xff1a; &#xff08;1&#xff09;是否安装&#xff1a; &#xff08;2&#xff09;是否启用&#xff1a; &#xff08;3&#xff09;是否正在运行&#xff1a; 二、系统…

文件系统--软硬链接/动静态库

inode 是文件系统中的一个重要概念&#xff0c;用于存储文件的元数据。 inode 的结构和内容 文件权限&#xff1a;定义了文件所有者、所属组以及其他用户对文件的读、写、执行权限。文件所有者和所属组&#xff1a;记录了文件的所有者和所属的用户组信息。文件大小&#xff1…

WebSocket原理详解(二)

WebSocket原理详解(一)-CSDN博客 目录 1.WebSocket协议的帧数据详解 1.1.帧结构 1.2.生成数据帧 2.WebSocket协议控制帧结构详解 2.1.关闭帧 2.2.ping帧 2.3.pong帧 3.WebSocket心跳机制 1.WebSocket协议的帧数据详解 1.1.帧结构 WebSocket客户端与服务器通信的最小单…

MySQL 进阶 面经级

会用数据库&#xff0c;找大厂工作是远远不够的。 本人2025美团暑期AI面试好几个MySQL场景问题不会答&#xff0c;已脏面评。遂在此整理学习&#xff01; 文章目录 美团AI面1.数据库分片sharding的概念&#xff0c;它有什么优势和挑战?优势Sharding 挑战 2. 分库分表的常见策…

基于单片机的智能奶茶机(论文 +源码)

1总体架构设计 本课题为基于单片机的智能奶茶机设计&#xff0c;其系统架构上设计如图2.1所示&#xff0c;整个系统包括了DS18B20温度传感器、继电器模块、LCD液晶、蜂鸣器、按键、STC89C52单片机等器件&#xff0c;在功能上用户可以通过按键键控制选择甜度和添加物以及设置温度…