前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【精准测试】iOS 代码覆盖率数据采集自动化实践

【精准测试】iOS 代码覆盖率数据采集自动化实践

作者头像
岛哥的质量效能笔记
发布2021-10-08 15:37:20
1.2K0
发布2021-10-08 15:37:20
举报

阅读本文大约需要1分钟。

点击👆小卡片,回复 “合集” 获取系统性的学习笔记和测试开发技能图谱

背景

上篇文章《简单两步实现 Jacoco+Android 代码覆盖率的接入!(最新最全版)》介绍了如何实现Android端的代码覆盖率接入,基于同样的背景我们也需要实现iOS端的代码覆盖率数据采集。

实践

这里我是基于XcodeCoverage这个工具实现的,目前这个工具只支持Objective-C的覆盖率数据采集,暂时不支持Swift。

打覆盖率包

1、首先将项目clone到本地,项目地址如下:

代码语言:javascript
复制
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() 方法可重复调用,覆盖率数据会累计。

代码语言:javascript
复制
#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

代码语言:javascript
复制
brew cask install osxfuse
brew install ifuse

遇到的问题:

代码语言:javascript
复制
ifuse has been disabled because it requires closed-source macFUSE

查看ifuse的源码可以看到下面这段代码,可见在2021-04-08之后,安装ifuse会显示 disable,这个时候只需要修改系统时间到这个日期时间之前就可以正常安装了。

代码语言:javascript
复制
  on_macos do
    disable! date: "2021-04-08", because: "requires FUSE"
  end

接着先在我们的电脑上创建一个挂载点目录:

代码语言:javascript
复制
mkdir Enesco

然后执行挂载命令

代码语言:javascript
复制
ifuse Enesco

如果想要卸载挂载点,只需要执行下面的命令即可:

代码语言:javascript
复制
umount Enesco

如果想要挂载某个设备的某个应用的documents目录,执行下面的命令:

代码语言:javascript
复制
ifuse -u 00008030-000C10A90C29802E --documents com.estgroupe.estmusicplayer Enesco

遇到的问题:

代码语言:javascript
复制
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目录就挂载好了:

如果想挂载某个应用的整个沙盒目录,需要执行下面的命令:

代码语言:javascript
复制
ifuse -u 00008030-000C10A90C29802E --container com.estgroupe.estmusicplayer Enesco

生成覆盖率报告

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

代码语言:javascript
复制
./getcov --show

如下图就是iOS应用的代码覆盖率报告了:

点击某个文件进入,可以看到具体的代码覆盖率数据:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 岛哥的质量效能笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档