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

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

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

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

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

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

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

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

步骤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_normal 及 CURRENT_ARCH 是上一步找到的值,(尖括号注意去掉)

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

步骤7:生成覆盖率报告

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

./getcov --show

即可自动生成覆盖率报告

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

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

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

覆盖率数据合并

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

具体操作如下

#1. Xcode配置

同单台手机时操作方法

#2. 运行注意事项

同单台手机时操作方法

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

同单台手机时操作方法

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

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

#4. 提取Coverage.info

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

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自动化探索(十)代码覆盖率统计的更多相关文章

  1. iOS自动化探索(一)WebDriverAgent安装

    WebDriverAgent FaceBook推出的一款iOS移动测试框架, 支持真机和模拟器, 同时支持USB, 官方是这样介绍的: https://github.com/facebook/WebD ...

  2. iOS自动化探索(九)使用Jenkins自动化打包并发布iOS App

    继前一篇: Mac环境下安装Jenkins Jenkins安装好后, 我们试着创建一个iOS自动打包并发布的任务 iOS App构建必须在MAC上面使用xcode进行,所以我们要安装下xcode集成插 ...

  3. iOS自动化探索(七)自动化测试框架pytest - 测试报告

    这里我们单独来看下关于如何生存测试报告 准备测试代码如下: #coding: utf- import pytest @pytest.fixture() def login(): print '输入账号 ...

  4. iOS自动化探索(六)自动化测试框架pytest - fixtures

    Fixture介绍 fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面.在编写测试函数的时候,可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将 ...

  5. iOS自动化探索(五)自动化测试框架pytest - Assert断言的使用

    使用assert语句进行断言 pytest允许使用标准的python assert语法,用来校验expectation and value是否一致 代码演示: def func(): def test ...

  6. iOS自动化探索(四)自动化测试框架pytest - 安装和使用

    自动化测试框架 - pytest pytest是Python最流行的单元测试框架之一, 帮助更便捷的编写测试脚本, 并支持多种功能复杂的测试场景, 能用来做app测试也能用作函数测试 官方文档: ht ...

  7. iOS自动化探索(三)WebDriverAgent Python Client

    之前我们在终端试着调用过WDA API, 今天我们在看一个Python封装的api库 https://github.com/openatx/facebook-wda 安装方式(一): pip inst ...

  8. iOS自动化探索(二)WDA API的使用

    前面我们已经安装好了WebdriverAgent, 现在可以用Facebook官方提供的API来进行一些操作 WDA API官方页面: https://github.com/facebook/WebD ...

  9. iOS自动化探索(八)Mac上的Jenkins安装

    安装Jenkins 首先检查是否有Jenkins依赖的java环境 java -version 出现java version "1.8.xx"说明已经安装了java Jackeys ...

随机推荐

  1. [ 转]Node.js模块 require和 exports

    什么是模块? node.js通过实现CommonJS的Modules/1.0标准引入了模块(module)概念,模块是Node.js的基本组成部分.一个node.js文件就是一个模块,也就是说文件和模 ...

  2. jquery table 隔行变色+点谁谁变色

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. VS2012中使用CEGUI项目发布到XP平台的问题(核心方法就一句话。“你项目使用的所有外部依赖库都用/MT编译。”)

    接着上一篇文章,详细说说如何把一个带CEGUI的项目发布到XP平台. 这个问题纠缠了我好几天.这里把详细解决思路记下来.有同样问题的朋友可以少走很多弯路. 核心方法就一句话.“你项目使用的所有外部依赖 ...

  4. 【C#】获取任意文件的缩略图

    原文:[C#]获取任意文件的缩略图 因为用shell取缩略图时,对于损坏的文件,读出来的图有黑边,所以就诞生了以下方法,不过这个效率要比用shell取的低3-4倍. 1.添加类WindowsThumb ...

  5. 图像滤镜艺术--Toaster滤镜

    原文:图像滤镜艺术--Toaster滤镜     根据Instagram CEO的说法,Toaster滤镜是Instagram所有滤镜中最复杂的滤镜,这个滤镜给人一种新奇的红色烘烤感,很能让人联想起这 ...

  6. MugLife静态照片变3D动画算法研究

    原文:MugLife静态照片变3D动画算法研究 MugLife app是一款可以将静态照片变成3D动画的手机应用,如下效果图所示: 大家可以看到,这个静态图具有了类3D的动画特效,是不是很好玩? 这种 ...

  7. Android零基础入门第77节:Activity任务栈和启动模式

    通过前面的学习,Activity的基本使用都已掌握,接下来一起来学习更高级的一些内容. Android采用任务栈(Task)的方式来管理Activity的实例.当启动一个应用时,Android就会为之 ...

  8. 论文阅读计划1(Benchmarking Streaming Computation Engines: Storm, Flink and Spark Streaming & An Enforcement of Real Time Scheduling in Spark Streaming & StyleBank: An Explicit Representation for Neural Ima)

    Benchmarking Streaming Computation Engines: Storm, Flink and Spark Streaming[1] 简介:雅虎发布的一份各种流处理引擎的基准 ...

  9. 我写的一个Qt 显示二维码( QR Code)的控件(可以去掉对 libpthread 的依赖,而且编译出的库文件可以在 vc2010 的release 模式下使用)

    最近一个项目需要显示二维码,所以花了点时间(只用了一个晚上,写的很不完善),写了个显示二维码的控件.当然这个控件用到了些开源的代码,比如qrencode,所以我也打算把我的代码开源. 我的代码参考了 ...

  10. 配置QSslConfiguration让客户端程序跳过本地SSL验证

    大家下午好哦.今天我们在重新制作我们萌梦聊天室的时候,出现了这样的问题.那就是我们的客户端能够对qtdream.com服务器进行登录,但是不能对localhost服务器(也就是本机啦)进行登录.这究竟 ...