今年Q3季度领导给加了个任务要做前后端代码覆盖率统计, 鉴于对iOS代码比较熟就选择先从iOS端入手,折腾一整天后终于初步把流程跑通了记录如下
Xcode中配置编译选项后, 编译后会为每个可执行文件生成对应的 .gcno 文件;之后在代码中调用覆盖率分发函数,会生成对应的 .gcda 文件。
执行完测试后,提取goda并借助工具与gcno做对比给出检测报告
以上说的几个都不懂也行, 让开发帮忙做这些然后编个代码覆盖率统计的包给你测试, 测完把手机给开发取数据生成报告。 注意每次测试完先按下HOME键把程序退到后台等几秒让app自己生成日志文件
下面开始讲步骤
git clone XXXXXXXXXXX
打开终端, cd到项目路径编辑Podfile
vi Podfile
添加:
pod 'XcodeCoverage', ‘~>1.0'
运行pod update安装依赖库
pod update
注意这里我们都只修改Debug模式下的属性, 避免影响线上版本的打包发布
这里有个注意的地方, 如果原本项目中已经有一个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
选择Debug模式安装到手机或者模拟器上
注意每次完成测试后先按Home键退到后台, 等几秒让APP产生覆盖率日志不要直接杀掉APP进程
如果是在模拟器上运行测试可以跳过此步
<OBJECT_FILE_DIR_normal>/<CURRENT_ARCH>
,其中 OBJECT_FILE_DIR_normal
及 CURRENT_ARCH
是上一步找到的值,(尖括号注意去掉)打开终端, cd进入项目目录/Pods/XcodeCoverage, 运行命令:
./getcov --show
即可自动生成覆盖率报告
整个过程手动操作较多, 可以继续研究下如果实现自动化
其中步骤6可以使用ifuse挂在沙盒来实现自动化提取.gcda文件, 方法可以参考下面这篇
在覆盖率统计测试中,可能会遇到测试用例需要在不同的设备上运行, 这个时候我们就需要收集每一台手机上的覆盖率数据然后合并输出为1份报告
具体操作如下
同单台手机时操作方法
同单台手机时操作方法
同单台手机时操作方法
同单台手机时操作方法, 注意备份台手机的报告文件夹
上面每台手机的覆盖率报告中都会有一个Coverage.info
Pods/XcodeCoverage目录下新建一个文件夹coverage
然后将上面提取到的.info文件依次命名为Coverage1.info, Coverage2.info ...放入coverage目录下
复制一份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
运行./mergecov即可生成合并的报告, 存放在当前目录的report文件夹