实践
这里我是基于XcodeCoverage这个工具实现的,目前这个工具只支持Objective-C的覆盖率数据采集,暂时不支持Swift。
打覆盖率包
1、首先将项目clone到本地,项目地址如下:
https://github.com/jonreid/XcodeCoverage
2、将XcodeCoverage整个文件夹放到应用项目的Xcode工程同级目录下,如下图:
3、在自己的工程中配置运行脚本,如下图:
4、在项目的Build Settings中做一些配置,首先是将 Generate Debug Symbols 配置成YES,如下图:
其次是将 Generate Legacy Test Coverage Files 配置成YES,如下图:
接着将 Instrument Program Flow 配置成YES,如下图:
最后给 Preprocessor Macros 增加一个字段 COVERAGE=1,如下图:
5、在项目源码中添加生成覆盖率的相关代码,这里我们在应用退出的时候调用__gcov_flush() 来生成.gcda文件,这个文件中记录了我们应用的代码覆盖率数据,具体代码如下:
注意:__gcov_flush() 方法可重复调用,覆盖率数据会累计。
#if COVERAGE NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1); setenv("GCOV_PREFIX_STRIP", "13", 1); extern void __gcov_flush(void); __gcov_flush(); #endif
6、编译运行并打包,然后装到手机上使用即可。
提取.gcda文件
在手机上运行应用,然后执行手工测试或者自动化测试用例,完成后退出应用 .gcda文件就会自动生成到我们应用的沙盒中,那么接下来就是怎么提取这个文件了,有两种方式:
1、手动提取,通过Xcode下载手机中应用的沙盒文件即可,如下图:
2、自动提取
这里用到了挂载文件系统工具:ifuse
brew cask install osxfuse brew install ifuse
遇到的问题:
ifuse has been disabled because it requires closed-source macFUSE
查看ifuse的源码可以看到下面这段代码,可见在2021-04-08之后,安装ifuse会显示 disable,这个时候只需要修改系统时间到这个日期时间之前就可以正常安装了。
on_macos do disable! date: "2021-04-08", because: "requires FUSE" end
接着先在我们的电脑上创建一个挂载点目录:
mkdir Enesco
然后执行挂载命令
ifuse Enesco
如果想要卸载挂载点,只需要执行下面的命令即可:
umount Enesco
如果想要挂载某个设备的某个应用的documents目录,执行下面的命令:
ifuse -u 00008030-000C10A90C29802E --documents com.estgroupe.estmusicplayer Enesco
遇到的问题:
ERROR: InstallationLookupFailed The App 'com.estgroupe.estmusicplayer' is either not present on the device, or the 'UIFileSharingEnabled' key is not set in its Info.plist. Starting with iOS 8.3 this key is mandatory to allow access to an app's Documents folder.
报这个错是因为我们应用没有开启文件共享,需要在应用项目的 info.plist 中添加一下如下图红框部分的字段即可:
打开finder就可以看到应用的documents目录就挂载好了:
如果想挂载某个应用的整个沙盒目录,需要执行下面的命令:
ifuse -u 00008030-000C10A90C29802E --container com.estgroupe.estmusicplayer Enesco
生成覆盖率报告
打开命令行终端, cd进入项目目录XcodeCoverage, 运行如下命令:
./getcov --show
如下图就是iOS应用的代码覆盖率报告了:
点击某个文件进入,可以看到具体的代码覆盖率数据: