暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

岛哥手记 2021-09-17
1018

阅读本文大约需要1分钟。
点击👆小卡片,回复 “合集” 获取系统性的学习笔记和测试开发技能图谱


背景

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


实践

这里我是基于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应用的代码覆盖率报告了:

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


推荐阅读:

Android性能加压方案:提高概率性问题的复现几率

自动化检测 Android APP 非 SDK 接口使用,防止非预期异常发生!

苹果个人付费开发者证书申请及使用图文详解


文章转载自岛哥手记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论