iOS自动化探索(十)代码覆盖率统计

摘要:
IOSAPP代码覆盖率统计在今年第三季度,领导者增加了一项任务,即进行前代码覆盖率和后代码覆盖率的统计。由于他们熟悉iOS代码,他们选择先从iOS开始。在经历了一整天的麻烦之后,他们最终通过以下覆盖率监控原则开始了这一过程。在Xcode中配置编译选项后。编译后将为每个可执行文件生成gcno文件;然后调用代码中的覆盖分布函数来生成相应的。gcda文件。

iOS APP代码覆盖率统计

今年Q3季度领导给加了个任务要做前后端代码覆盖率统计, 鉴于对iOS代码比较熟就选择先从iOS端入手,折腾一整天后终于初步把流程跑通了记录如下

覆盖率监测的原理

Xcode中配置编译选项后,编译后会为每个可执行文件生成对应的.gcno文件;之后在代码中调用覆盖率分发函数,会生成对应的.gcda文件。
  • gcno:包含基本的块信息,以及代码行与块的映射关系;
  • gcda:包含代码行执行的情况,以及覆盖率的信息归纳;
执行完测试后,提取goda并借助工具与gcno做对比给出检测报告

必要知识储备或条件:

  • 项目源码
  • Xcode开发环境,包括开发者账号
  • Cocopods基础用法
  • Xcode真机运行基础操作
  • 抓取APP沙盒日志基础操作
  • Git基础操作

以上说的几个都不懂也行, 让开发帮忙做这些然后编个代码覆盖率统计的包给你测试, 测完把手机给开发取数据生成报告。 注意每次测试完先按下HOME键把程序退到后台等几秒让app自己生成日志文件

下面开始讲步骤

步骤1: 拉取项目代码

git clone XXXXXXXXXXX

步骤2: 编辑Podfile文件, 添加XcodeCoverage库

打开终端, cd到项目路径编辑Podfile

vi Podfile

添加:

pod 'XcodeCoverage', ‘~>1.0'

运行pod update安装依赖库

pod update

步骤3:Xcode工程配置

1. 使用Xcode打开项目,Targes -> 选择你的APP -> Build Settings -> 搜索Preprocessor Macros -> 展开在Debug一栏加入NT_COVERAGE=1

iOS自动化探索(十)代码覆盖率统计第1张

注意这里我们都只修改Debug模式下的属性, 避免影响线上版本的打包发布

2. 同样在Build Settings中将以下3项的Debug模式改为Yes

  • Generate Debug Symbols 配置成YES
  • Generate Legacy Test CoverageFiles 配置成YES
  • Instrument Program Flow 配置成YES

iOS自动化探索(十)代码覆盖率统计第2张

iOS自动化探索(十)代码覆盖率统计第3张

iOS自动化探索(十)代码覆盖率统计第4张

3. Build Phase中 -> New Run Script Phase -> Run Scrip中添加Pods/XcodeCoverage/exportenv.sh

iOS自动化探索(十)代码覆盖率统计第5张

iOS自动化探索(十)代码覆盖率统计第6张

这里有个注意的地方, 如果原本项目中已经有一个run script也还是新建一个

#4. AppDelegate.m中applicationDidEnterBackground方法添加以下代码

    #if NT_COVERAGE
        #if !TARGET_IPHONE_SIMULATOR
            NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentsDirectory = [paths objectAtIndex:0];
            setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);
            setenv("GCOV_PREFIX_STRIP", "13", 1);
        #endif
        extern void __gcov_flush(void);
        __gcov_flush();
    #endif

iOS自动化探索(十)代码覆盖率统计第7张

步骤4: 编译安装

选择Debug模式安装到手机或者模拟器上

步骤5:手动测试或者运行自动化测试

注意每次完成测试后先按Home键退到后台, 等几秒让APP产生覆盖率日志不要直接杀掉APP进程

步骤6:提取真机上的.gcda文件

如果是在模拟器上运行测试可以跳过此步

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>,其中OBJECT_FILE_DIR_normalCURRENT_ARCH是上一步找到的值,(尖括号注意去掉)

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

步骤7:生成覆盖率报告

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

./getcov --show

即可自动生成覆盖率报告

iOS自动化探索(十)代码覆盖率统计第8张

整个过程手动操作较多, 可以继续研究下如果实现自动化

其中步骤6可以使用ifuse挂在沙盒来实现自动化提取.gcda文件, 方法可以参考下面这篇

使用libimobiledevice + ifuse提取iOS沙盒文件

覆盖率数据合并

在覆盖率统计测试中,可能会遇到测试用例需要在不同的设备上运行, 这个时候我们就需要收集每一台手机上的覆盖率数据然后合并输出为1份报告

具体操作如下

#1. Xcode配置

同单台手机时操作方法

#2. 运行注意事项

同单台手机时操作方法

#3. 收集每一台测试手机的覆盖率日志

同单台手机时操作方法

#4. 为每一台手机生成一份覆盖率测试报告

同单台手机时操作方法, 注意备份台手机的报告文件夹

#4. 提取Coverage.info

上面每台手机的覆盖率报告中都会有一个Coverage.info

iOS自动化探索(十)代码覆盖率统计第9张

Pods/XcodeCoverage目录下新建一个文件夹coverage

然后将上面提取到的.info文件依次命名为Coverage1.info, Coverage2.info ...放入coverage目录下

#5. 新增mergecov脚本

复制一份Pods/XcodeCoverage目录下的getcov文件, 重命名为为mergecov

然后修改内容为:

#!/bin/sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )"&& pwd )"
source ${DIR}/envcov.sh
ALL_COVERAGE=CoverageAll.info
INFO_DIR=${DIR}/coverage
MERGE_CMD_P1=''
REPORT_DIR=${DIR}/report
if [ -e $INFO_DIR/$ALL_COVERAGE ]; then
    rm -r $INFO_DIR/$ALL_COVERAGE
fi
if [ -e $REPORT_DIR ]; then
    rm -r $REPORT_DIR
fi
mkdir $REPORT_DIR
for file in` ls $INFO_DIR`
do
    MERGE_CMD_P1="$MERGE_CMD_P1 -a $INFO_DIR/$file"
done
LCOV $MERGE_CMD_P1 -o $INFO_DIR/$ALL_COVERAGE
"${LCOV_PATH}/genhtml" --output-directory ${REPORT_DIR} $INFO_DIR/$ALL_COVERAGE
cd ${REPORT_DIR}
echo "open index.html===================="
open index.html

#6. 合并生成报告

运行./mergecov即可生成合并的报告, 存放在当前目录的report文件夹

免责声明:文章转载自《iOS自动化探索(十)代码覆盖率统计》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇iOS自动化环境搭建(超详细)vue移动端项目经验(三)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

移动端兼容性问题解决方案

1. IOS移动端click事件300ms的延迟响应 移动设备上的web网页是有300ms延迟的,往往会造成按钮点击延迟甚至是点击失效。这是由于区分单击事件和双击屏幕缩放的历史原因造成的, 2007年苹果发布首款iphone上IOS系统搭载的safari为了将适用于PC端上大屏幕的网页能比较好的展示在手机端上,使用了双击缩放(double tap to z...

Windows 10正式版历代记:Version 1709、Build 16299都是什么鬼?

Windows 10免费用!创意者更新秋季版激活秘籍 2017年10月中下旬,微软面向正式版用户推送了Windows 10创意者更新秋季版。这是自发布以来,Windows 10的第五个大版本。 在这篇文章中,我们来回顾一下Windows 10正式版的历史版本。 1、Windows 10 1507 初版Windows 10,代号TH1,版本号10240,发...

McCall的软件质量模型

McCall等认为,特性是软件质量的反映,软件属性可用做评价准则,定量化地度量软件属性可知软件质量的优劣 McCall认为软件的质量模型应该包括产品的修正、产品的转移,产品的运行 而产品的修正又包括可维护性、可测试性、灵活性等子特点。 产品的转移包括可移植性、可复用性、互连性等。 产品的运行包括正确性、可靠性、效率、可使用性和完整性...

用Visual Studio 2019搭建Node.js+Vue+Typescript(TS)Web框架项目,兼容VsCode

兼容VsCode就是可以用VsCode打开,代码不需要做任何修改 同样Visual Studio添加.sln和.njsproj也可以打开别人用VsCode创建的项目 本项目创建有3个目的: 1、用Visual Studio 2019创建 Vue.js Web应用程序 2、用vue输出Hello Vue 3、用Typescript输出Hello Ts 功能...

使用电脑模拟微信内置浏览器

最近在弄微信开发,需要微信请求,其实很好改 只要把请求头改了就好了。 浏览器呢 就使用 chrome我在这使用360极速浏览器了。 首先进入开发者模式(F12或者右键审查元素) 如图: 然后 点击 更多 选 More tools 打开Network conditions 最后设置请求为微信请求: 最后那个请求是自...

UOS怎么访问windows共享的文件夹

先在windows中建一个共享文件夹,此处就先忽略步骤,共享文件夹相关信息如下图: 在UOS桌面上面建一个文件夹,比如,我在这里建了一个 winshare 再在桌面右键点击鼠标,选择在终端中打开 然后再在终端中输入以下命令,期间有提示需要密码,则直接输入密码,如果有提示需要进入开发者模式,则对应的开启一下开发者模式,如果不清楚,看此链接(https...