真机的代码覆盖率测试

代码覆盖率测试

以前虽然写过单元测试,但很少监测测试的完整程度,测试用例也经常存在重复的情况。这次在测试的要求下开始接入代码覆盖率测试。什么是代码覆盖率?就是测试用例对代码的测试覆盖程度(见代码覆盖率浅谈)。 这里面会涉及到两种文件,分别是编译时产生的代码结构文件(gcno文件)运行时产生的代码执行的覆盖率文件(gcda文件)**,下面看看怎么产生gcno文件和gcda文件。

产生gcno文件和gcda文件

  • 1、打开Scheme设置页面,添加TestCoverage的Build选项;
  • 2、打开Xcode的Build Setting,在Generate Test Coverage Files中把TestCoverage设置为Yes;
  • 3、打开Xcode的Build Setting,在Instrument Program Flow 中把TestCoverage设置为Yes;
  • 4、代码接入 首先是添加初始化代码,可以选择在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中调用以下方法(也可以在main.m文件中调用)
void initTestCoverage(void)
{
    const char* prefix = "GCOV_PREFIX";
    const char* prefixValue = [[QMFileHelper getSubPathAtDocuments:@"Coverage"] cStringUsingEncoding:NSASCIIStringEncoding];
    const char* prefixStrip = "GCOV_PREFIX_STRIP";
    const char* prefixStripValue = "14";
    setenv(prefix, prefixValue, 1);
    setenv(prefixStrip, prefixStripValue, 1);
}

然后在需要产生代码覆盖率的地方调用__gcov_flush()方法产生覆盖率文件,需要注意,必须先添加声明extern void __gcov_flush(void);

  • 5、查看生成的gcno和gcda文件 gcno是编译时产生,可以点击Xcode的product文件下的.app文件,右键选择“show in finder”,然后在上级目录的Intermediates文件夹中查找,我的是在 /Users/loyinglin/Library/Developer/Xcode/DerivedData/Live-abcabcababcabac/Build/Intermediates/Live.build/Debug-iphoneos/Live.build/Objects-normal gcda是运行时产生,通过Xcode下载程序运行的沙盒,在Document的Coverage文件夹下可以看到。

其他问题

1、gcno和gcda的文件找不到 检查Xcode的工程设置是否正确(步骤1、2、3设置的属性) 检查步骤4的代码是否被调用;

建议先检查gcno是否生成,在查看gcda是否生成;

2、编译的时候链接失败 链接时出现以下错误 Undefined symbols for architecture armv7: "___gcov_flush", referenced from: 检查步骤2、3设置的属性是否在当前环境下打开;

3、调用___gcov_flush卡死 ___gcov_flush是同步方法,并且耗时较长,如果在主线程调用会造成卡死。

总结

在Xcode中进行覆盖率测试可以看这篇,更加智能化的Xcode代码覆盖率测试工具。 深入了解GCC Coverage,点击这里。 .gcno文件和.gcda文件可以使用lcov进行解析,实际测试过程中为了方便统一处理,.gcno用脚本zip -j result/gcno_arm64.zip dir/arm64/*.gcno (dir替换为特定地址)进行打包,代码中用MiniZipArchive打包上传,更方便进行统一的测试。

谨以此篇记录代码覆盖率测试的了解和接入。

附录——测试相关

一个好的测试方案能用较短的时间和较少的资源完成测试任务,测试内容包括功能需求测试、代码覆盖测试,最后给出测试的总结和评价。 自动化测试与手动测试区别:自动化测试用来测试功能的完备性,手动测试用来测试产品的易用性。 灰度测试:平滑过渡的一种发布方式。iOS最常见的灰度测试就是用越狱平台的用户进行灰度测试。灰度测试可以保证整体系统的稳定,也能测试到在实际运行中的问题。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

iOS逆向工程之Hopper+LLDB调试第三方App

LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具。使用LLDB可以动态的调...

48390
来自专栏后端云

vm被systemd删除

发现计算节点重启后,所有的该节点上的vm被删除了,查看vm对应的qemu日志,qemu-kvm: terminating on signal 15 from p...

31840
来自专栏QQ音乐技术团队的专栏

electron 构建跨平台桌面应用

昨日(2016.09.13)本文发表后,获得了一定的阅读和转发量,但经部分网友反馈和仔细审核后发现,在与 NW.js 对比的环节,言辞欠妥,且数据的真实性有待考...

1.3K110
来自专栏中国白客联盟

Mac os提高效率的几款工具

Android studio/intellij idea:android动态调试。

15530
来自专栏杨建荣的学习笔记

ASM基本配置问题(r5笔记第89天)

ASM自10g开始作为Grid的一部分,对于存储管理层的一个重大变革。重要性和丰富的功能就不多说了,主要的一点,是完全免费的。所以对于高端存储望而却步,而且不希...

27550
来自专栏农夫安全

Bwapp漏洞平台答案全解-A3(第一篇)

A3 - Cross-Site Scripting (XSS) *****************跨站脚本****************** 跨站的终极思路...

69970
来自专栏全栈之路

vue.js安装心得

npm是nodejs的包管理器,所以之前只想找npm,而不想下载nodejs,最后闹了笑话。

17720
来自专栏无所事事者爱嘲笑

ionic2 处理android硬件返回按钮

14140
来自专栏一只程序汪的自我修养

VS快捷键

32250
来自专栏向治洪

React Native打包

前面写了关于React的一系列入门章:http://lib.csdn.net/xiangzhihong8/5375/chart/React%20Native ...

39650

扫码关注云+社区

领取腾讯云代金券