ios 单元测试覆盖率怎么查看_iOS (Object-C) 非单元测试状态下代码覆盖率获取尝鲜...

最近开始要调研精准测试,代码覆盖率是其中一个十分重要的部分,因此参考网上的流程来试做一下。过程中发现由于 Xcode 8 有一些变化,网上的相关文章都没有对应更新,所以发文记录下。

目标

在操作应用过程中,通过一个特定操作可获取到从应用启动到此操作前所有操作的覆盖率数据。

需要用到的工具

XcodeCoverage

Xcode 8.1(为了支持 iOS 10.1,亲测可在最新的 iOS 10.1.1 中成功获得覆盖率)

配置步骤

项目加入 XcodeCoverage

只用过 pod 的方式,也建议使用这个方式安装,比较快捷。

1.在 Podfile 中加入 pod 'XcodeCoverage', '~>1.0'

2.运行 pod install

3.在需要获取覆盖率的 target 中加入 Run Script 的步骤,内容为 Pods/XcodeCoverage/exportenv.sh

官方最新的 1.3 貌似不兼容 Xcode 8 ,需要做一些调整。

1.下载最新的官方代码:git clone https://github.com/jonreid/XcodeCoverage.git

2.拷贝官方的 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 电脑路径的权限,因而一直无法生成。

获取覆盖率

获取模拟器运行覆盖率

在 xcode 中 build ,然后 run

在应用中做出操作

点击 home 键,应用进入后台,同时应用自动生成对应覆盖率文件

进入 项目目录/Pod/XcodeCoverage,运行命令 ./getcov --show ,即可自动生成覆盖率报告。

获取真机运行覆盖率

1.在 xcode 中 build ,然后 run

2.在应用中做出操作

3.点击 home 键,应用进入后台,同时应用自动生成对应覆盖率文件

4.打开 Xcode->window->Devices ,选择运行应用的真机

5.在 Installed Apps 部分选择运行的应用,然后点击底部的齿轮按钮,选择 'Download Container'

6.把生成的 xcappdata 文件保存下来,然后在 finder 中打开

7.对 xcappdata 文件右键->显示包内容(show package content),然后打开 AppData/Documents/arm64/,拷贝里面的所有 .gcda 文件

8.进入 项目目录/Pod/XcodeCoverage,打开 env.sh,找到 OBJECT_FILE_DIR_normal 及 CURRENT_ARCH 。

9.打开应用编辑结果存储的目录,对应的路径为 /,其中 OBJECT_FILE_DIR_normal 及 CURRENT_ARCH 是上一步找到的值。(大于小于号不需要保留)

10.把第7步的 .gcda 文件全部拷贝到第9步打开的目录

11.回到 项目目录/Pod/XcodeCoverage ,运行命令 ./getcov --show ,即可自动生成覆盖率报告。

报告样式:

主要的坑就在真机运行和模拟器运行时目录的区别。 真机运行时,真机上应用无法写入 mac 上的路径,因此 .gcda 文件只能放在手机沙箱,另外取出。模拟器无此问题(模拟器有写入 mac 路径的权限)

后续

覆盖率拿到了,但过程仍然不够自动化,还需要解决覆盖率数据自动回传、通过按钮触发 dump 等问题才能达到最基本的要求。后续再往这个方面继续探究。

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值