最近开始要调研精准测试,代码覆盖率是其中一个十分重要的部分,因此参考网上的流程来试做一下。过程中发现由于 Xcode 8 有一些变化,网上的相关文章都没有对应更新,所以发文记录下。
在操作应用过程中,通过一个特定操作可获取到从应用启动到此操作前所有操作的覆盖率数据。
只用过 pod 的方式,也建议使用这个方式安装,比较快捷。
pod 'XcodeCoverage', '~>1.0'
pod install
Pods/XcodeCoverage/exportenv.sh
git clone https://github.com/jonreid/XcodeCoverage.git
lcov-1.12/bin
内所有文件到项目所在的 Pod/XcodeCoverage/lcov-1.12/bin
中,同名文件直接覆盖一般情况下,我们只在 Debug 包中获取代码覆盖率,因此只改动 Debug 的配置。需要改动的地方有两个,以下直接贴图:
在 AppDelegate.m
中添加如下代码 (代码参考自 vigossjjj/CodeCoverage4iOS 项目):
- (void)applicationDidEnterBackground:(UIApplication *)application
{
...
#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();
...
}
这部分代码触发点是点击 home 键应用进入后台时。其中 #if !TARGET_IPHONE_SIMULATOR
中包含的部分会改写环境变量,让生成的覆盖率文件( .gcda 文件)放在应用的沙箱中。否则默认会保存在对应 mac 电脑的路径,但由于应用没有写入 mac 电脑路径的权限,因而一直无法生成。
项目目录/Pod/XcodeCoverage
,运行命令 ./getcov --show
,即可自动生成覆盖率报告。AppData/Documents/arm64/
,拷贝里面的所有 .gcda 文件项目目录/Pod/XcodeCoverage
,打开 env.sh
,找到 OBJECT_FILE_DIR_normal
及 CURRENT_ARCH
。<OBJECT_FILE_DIR_normal>/<CURRENT_ARCH>
,其中 OBJECT_FILE_DIR_normal
及 CURRENT_ARCH
是上一步找到的值。(大于小于号不需要保留)项目目录/Pod/XcodeCoverage
,运行命令 ./getcov --show
,即可自动生成覆盖率报告。报告样式:
主要的坑就在真机运行和模拟器运行时目录的区别。 真机运行时,真机上应用无法写入 mac 上的路径,因此 .gcda 文件只能放在手机沙箱,另外取出。模拟器无此问题(模拟器有写入 mac 路径的权限)
覆盖率拿到了,但过程仍然不够自动化,还需要解决覆盖率数据自动回传、通过按钮触发 dump 等问题才能达到最基本的要求。后续再往这个方面继续探究。
https://github.com/jonreid/XcodeCoverage/blob/master/README.md
https://github.com/jonreid/XcodeCoverage/issues/48
https://github.com/vigossjjj/CodeCoverage4iOS/blob/master/README.md