前面讲到<收集Android程序的代码覆盖率 >的时候,讲到收集代码覆盖率分别有修改最终程序(例如Emma是修改字节码),和修改源文件两种方式。而在iOS上,采用的就是后者,iOS原来用的是gcov收集代码覆盖率,后面苹果的LLVM项目,也实现了代码覆盖率收集功能,用法完全兼容gcov,而且生成的代码覆盖率统计文件的格式也兼容gcov。

先说说怎样收集ios程序的代码覆盖率,然后再说说原理性的东西。

不知道大家用的是xcode的哪个版本?老版本的xcode使用的clang编译器的代码覆盖率功能好像坏掉了……也就是说按照苹果的文档去做,生成的程序在启动的时候会崩溃。在最新的clang编译器里,已经修复了这个缺陷,下面是做法:

1.    首先下载LLVM的最新源码(LLVM是一个开源项目 ,需要SVN客户端,在终端中运行):
svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm
2.    在同步clang的源代码:
cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
3.    代码同步完毕后,编译编译器:
cd..
# 指定将我们编译的clang安装到opt文件夹中
./configure --prefix=/opt --enable-optimized
# 是用8个线程并行编译
make -j8
# 将结果程序安装到/opt文件夹中
sudo make install

编译好了以后,需要告诉xcode使用最新的编译器,而不是它自带的坏掉的编译器。在Xcode里打开工程:
1.    设置User Defined Build Setting:CC = /opt/bin/clang,这一步告诉xcode使用我们的编译器,如果大家熟悉make的话,应该知道CC是一个很出名的make变量。如下图所示:
 

2.    设置Other C Flags: --coverage,这一步告诉clang在编译时,生成代码覆盖率版本。如下图所示:

3.    设置Other Linker Flags: --coverage -lprofile_rt,这一步告诉clang在链接时,需要连接收集代码覆盖率用到的函数库。 如下图所示:
 

设置好以后,编译,然后在模拟器里或者手机里执行手工或自动化测试,测试完毕后,代码覆盖率信息就已经保存好了,看的话,需要一个工具CoverStory,CoverStory是用来看gcov生成的代码覆盖率信息的,但因为clang完全兼容gcov,所以也就可以复用这个工具,下载地址是:http://code.google.com/p/coverstory/

而代码覆盖率信息是放在一个非常隐晦的地方(说实话那个地方我很久以来只会通过终端进入,一直都没找到从GUI界面进去的方式):
# ~代表用户的家 (Home)目录,由于我用的是模拟器,因此下面的路径里用的是Debug-iphonesimulator,如果是用真机 # 机 ,应该是Debug-iphoneos文件夹。 ~/Library/Developer/Xcode/DerivedData/<你的ios工程名加上一堆随机字符>/Build/Intermediates/<工程名.build>/Debug-iphonesimulator/<工程名.build>/Object-normal/<cpu 架构>/ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }

以我得机器为例,我的工程如上图所示是CoreDataBooks,因此路径是:
shiyimin-Mac-2:i386 shiyimin$ pwd
/Users/mahmood1/Library/Developer/Xcode/DerivedData/CoreDataBooks-dpmulgzuyflwiycpkobgmstmioxz/Build/Intermediates/CoreDataBooks.build/Debug-iphonesimulator/CoreDataBooks.build/Objects-normal/i386

在Finder里将这个目录拖到CoverStory里,就可以看到具体的代码覆盖率信息了:


 
从上图可以看到,最左边的列表里,显示了ios程序各源代码的代码覆盖率比例,例如CoreDataBooksAppDelegate.m这个文件的覆盖率就只有52.9%,右边红色高亮显示了在测试中未覆盖到的代码,而已覆盖的代码以黑色显示。

如果你把文件夹拖到CoverStory里,没有任何反应,可以在查看文件夹里是否有.gcda和.gcno文件来排错,如果没有这两种文件,那一般说明没有收集到代码覆盖率信息。

最后,有关gcov的使用和原理,请参看gcov文档:http://gcc.gnu.org/onlinedocs/gcc/Gcov.html

本文由知平软件施懿民编写,请关注我们的微博。

转载于:https://blog.51cto.com/4977661/949739

收集iOS程序的代码覆盖率相关推荐

  1. 详解优化iOS程序性能的25个方法

    本篇文章主要介绍了优化iOS程序性能的25个方法,感兴趣的小伙伴们可以参考一下 1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发 ...

  2. iOS程序闪退的原因以及处理办法

    iOS程序闪退是一种比较常见的现象.闪退的情况很多,造成程序闪退的原因也很多. ================================启动时闪退======================= ...

  3. 优化iOS程序性能的25个方法

    1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露.它自动为你 ...

  4. 一个6年iOS程序员的工作感悟,送给还在迷茫的你

    前言 每一个开发者,都有一段不愿提起的经历,很多年前,刚刚从大学毕业的时候,很多公司来校招.其中最烂俗的一个面试问题是:"你希望你之后三到五年的发展是什么?".我当时的标准回答是( ...

  5. Unity制作的 安卓和Ios程序如何退出

    Android: 效果:连按两次手机返回键退出. 将下面脚本挂到场景中一个命名为GameQuit的空物体. using UnityEngine; using System.Collections; p ...

  6. 用CocoaPods做iOS程序的依赖管理

    CocoaPods 简介 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs 的 npm.随着 iOS 开发者的增多,业界也出现了为 iOS 程序提供 ...

  7. UIViewController的生命周期及iOS程序执行顺序

    当一个视图控制器被创建,并在屏幕上显示的时候. 代码的执行顺序 1. alloc                                   创建对象,分配空间 2.init (initWit ...

  8. IOS开发系列--IOS程序开发概览

    IOS开发系列--IOS程序开发概览 2014-08-04 19:42 by KenshinCui, 9983 阅读, 51 评论, 收藏, 编辑 概览 终于到了真正接触IOS应用程序的时刻了,之前我 ...

  9. iOS程序启动过程笔记

    CHENYILONG Blog 笔记 一.iOS程序的完整启动过程(有storyboard) 1.先执行main函数,main内部会调用UIApplicationMain函数 2.UIApplicat ...

最新文章

  1. MindSpore部署图像分割示例程序
  2. 春泥棒(偷春人) — ヨルシカ(MV + 歌词、汉译、罗马音)
  3. Transformer又来搞事情!百万像素高清图轻松合成,效果迷人
  4. 负数运算_小学生必备科学常识100问-34数学史(7):负数的产生
  5. Android开发10——Activity的跳转与传值
  6. this.getstate_Java线程类Thread.State getState()方法(带示例)
  7. c# 获取文件路径[转]
  8. 实训汇编语言设计——内存多字节10进制数相加
  9. datatable中某一列最小值_操作dom获取datatable中的某一行的某一列的数据
  10. python自动下载邮件附件
  11. 直线平面垂直的判定和性质
  12. [Vmware卸载] Vmware12卸载
  13. es nested字段的空值查询问题
  14. 中国房价到底有多少泡沫?数据说话!
  15. ssh隧道连接的3种方式
  16. linux下的EC20的监控python脚本
  17. shading interp;
  18. 肥牛是不是牛肉,为什么?
  19. 进击太空:脑电研究新领域
  20. JAVA五子棋AI(人机对战 颜色选择 悔棋等 可直接使用)

热门文章

  1. [BZOJ5303] [HAOI2018] 反色游戏
  2. python调用R语言,关联规则可视化
  3. WebSocket-java实现
  4. 使用Nexus私服代理其他maven仓库(jitpack、jcenter)
  5. 8、JavaScript深入浅出——数据类型
  6. shopnc前台登陆不进去解决方法
  7. Kinect v2.0 for windows开发环境说明
  8. 【Raspberry Pi】webpy+mysql+GPIO 实现手机控制
  9. 网络协议分析工具Ethereal的使用
  10. python 输出当前行号