iOS 9 学习系列: Xcode Code Coverage
Code coverage 是一个计算你的单元測试覆盖率的工具。
高水平的覆盖给你的单元測试带来信心。也表明你的应用被彻底的測试过了。
你可能写了几千个单元測试,但假设覆盖率不高。那么你写的这套測试可能价值也不大。
这里并没有一个确切的百分比,要求你必须到达这个覆盖率。这非常大程度上取决于你的项目(的详细情况)。
譬如说,假设你的项目中有非常多不能写单元測试的视觉组件,那么覆盖率就会比单纯处理数据的框架要低的多。
Code Coverage in Xcode
在过去,假设你想要制作一个測试的代码覆盖报告出来,须要设置非常多[选项]。
非常复杂,还有很多须要手动设置。
在
iOS 9中,苹果提供了智能的代码覆盖工具,他是和 LLVM 一体的。每次执行測试都会被调用和计算。
Using the Code Coverage Tools
如今我们用一个样例来展示,如何使用新的 code coverage 工具和如何提升如今的測试用例。完毕后的代码放在了 Github 上,你能够跟着做。
第一件事是创建一个新项目。并确认你选上了Unit tests选项。
这会按要求创建一个默认项目,现我们须要測试点什么。这个測试可能是你的随意需求,这里我加入一个空的 swift 文件,里面写好了一个全局的方法。
这种方法检測两个字母串是否是仅排序不同的同样字母组成的词。
写成全局的方法,可能不是好的设计,但这里我们仅演示一下。
这是一个相对简单的方法。所以我们可能会得到一个没有不论什么问题的。100%覆盖的測试覆盖率。

一旦你写好了算法,就该写个測试了。打开项目创建时已经创建好了的默认的XCTestCase,加入一个以下的简单的測试方法。他看起来是这样子的。
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240/q/100" class="imagebubble-image" alt="">
在执行測试之前,我们必须先确认 code coverage 是否被打开了,写代码时,默认是关闭的。所以你须要编辑一下你的測试 scheme,把它打开。

确保"Gather coverage data"是被选中的。然后点击关闭button,执行測试的 target. 我们希望刚刚创建的測试用例可以顺利通过。
The Coverage Tab
一旦这个測试通过了。你就能知道 checkWord 这种方法,至少有一条路径是对的。但你不知道的是。还多多少没有被測试到。
这就是code coverage这个工具的优点。当你打开code coverage tab后,你能够清楚的看到測试的覆盖情况。他们按找 target, file, function 进行了自己主动分组。
打开Xcode左边窗体的Report Navigator面板,选中你刚执行的測试。
然后在tab中选中 Coverage。

这会展示一个你的类、方法的列表,并标示出每一个的測试覆盖率。假设你将鼠标悬停在checkWord这种方法上,你可以看到測试的覆盖率是28%。
不能接受啊!我们须要找到。那些代码分支是可以被測试运行。那些是不能的,进而改善他们。双击方法的名字,Xcode会打开类的代码,而且看到code coverage的情况。

白色的区域表示这些代码时測试覆盖过的。
灰色区域时測试无法覆盖的,我们须要加入很多其它的測试用例来覆盖灰色部分的代码。
在右手边的数字,表明这些代码块,在这次測试中被运行的次数。
Improving Coverage
非常显然,28%的覆盖率不是我们的目标。
这里没有 UI,看起来是个完美的编写測试用例的候选function。所以,我们加入一个測试用例。
理想情况下,我们希望每一个分支都能被測试到。
这样就能达到完整的覆盖。加入以下的測试用例到你的測试类中。

这些測试用例应该可以全然覆盖我们的代码了。执行一下单元。然后打开最后一个測试报告。
imageMogr2/auto-orient/strip%7CimageView2/2/w/1240/q/100" class="imagebubble-image" alt="">
我们成功了,100%的覆盖率。
你能够看到整个代码都变成了白色,右面的数字也展示了每一个代码段至少被运行了一次。
使用code coverage是一个很棒的方式,帮你建立真正有价值的測试组合。远好于你写了许多測试用例,但没有真正測试到代码。
Xcode 7 让这样的方式变的很easy,我推荐你在项目中开启 Code Coverage。即使你已经写好了測试。也能够帮你知道究竟測试写的怎么样。
Demo在Github地址: https://github.com/fish-yan/XCode-Code-Coverage
iOS 9 学习系列: Xcode Code Coverage的更多相关文章
- iOS 9 学习系列:Split Screen Multitasking
http://www.cocoachina.com/ios/20151010/13601.html iOS 9 的一个重大变化就是增加了多任务,这个多任务允许用户在屏幕上同时运行多个 app.有两种形 ...
- iOS/iPhone学习系列、代码教程
part 1--入门: 1. xcode 版本下载 以及 iphone sdk 下载: 最新版本在此下载: http://developer.apple.com/devcenter/ios/index ...
- iOS日常学习 - 每个Xcode开发者应该知道的七个使用技巧
本文为转载学习使用原文链接 工欲善其事,必先利其器.对一个iOS开发者来说,这就意味着对Xcode的熟练掌握程度.Xcode是一个学习起来有点难度的软件,下面的这些技巧或许可以显著的提高你的编程效率. ...
- iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)
在WWDC 2015 上, Apple 为 iOS 9 宣布了一个所谓 通用链接 的深层链接特性, 视频地址为 [无缝链接到您的 App].虽然它不是一个必须实现的功能, 但还是需要引起一些注意. 在 ...
- iOS 9 学习系列:Storyboard References
http://www.cocoachina.com/ios/20150922/13474.html 如果你曾经使用 interface builder 创建过一个复杂.界面非常多的应用,你就会明白最后 ...
- iOS 9 学习系列:UIStack View
http://www.cocoachina.com/ios/20150921/13492.html 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方式,纵向或 ...
- iOS 9 学习系列:UIStack View (转载)
作者:Nathan_Bao 地址:http://www.jianshu.com/p/1991e6c2881a 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方 ...
- OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现
# OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...
- OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建
# OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...
随机推荐
- uni-app - 支付(app支付、小程序支付、h5(微信端)支付)
App支付.小程序支付.h5(微信端)支付 APP支付(内置) appPay.js /** * 5+App支付,仅支持支付宝以及微信支付 * * 支付宝Sdk集成,微信sdk未集成 * * @para ...
- 微信小程序 - 授权页面
小程序授权方式更改以后,我们只有两种选择. 1.在主页使用遮罩层,类似这样的(会造成一点卡顿) 2.新增登陆授权页(经过反复的思考,我还是觉得用这个好) 这个也不错: https://blog.csd ...
- 微软BI 之SSAS 系列 - 基于雪花模型的维度设计
基于雪花模型的维度以下面的 Product 产品与产品子类别,产品类别为例. DimProduct 表和 DimProductSubcategory 表有外键关系,而 DimProductSubcat ...
- 微软BI 之SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表
基于数据仓库上的 SSRS 报表展示,一般可以直接通过 SQL 查询,存储过程,视图或者表等多种方式将数据加载并呈现在报表中.但是如果是基于 Cube 多维数据集的数据查询,就不能再使用 SQL 的语 ...
- 忘记webogic管理控制台密码
cd /user_projects/domains/base_domain/security cp DefaultAuthenticatorInit.ldift DefaultAuthenticato ...
- angular中的 登录检查 和 过期Session清理
angular利用ui-router进行登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检 ...
- Can't connect to MySQL server on 'ip' (13)
解决方法1.:setsebool -P httpd_can_network_connect_db=1 解决方法2.:修改/etc/selinux/config SELINUX=enforcing 为 ...
- JqGrid把数据行插入指定位置的方法addRowData
1.首页在colModel里写好方法,如下代码options.rowId是获取当前行的编号 { label: '操作', width: 60, align: 'center', formatter: ...
- Oracle自学笔记(一)
1.创建用户并指定表空间 create user gy_3004 identified by gy_3004 default tablespace gy_3004_data temporary tab ...
- windows用户态程序的Dump
熟悉Linux的开发人员都知道,在Linux下开发程序,如果程序崩溃了,可以通过配置Core Dump,来让程序崩溃的瞬间产生一个Dump文件,然后通过dump文件来调试程序为什么崩溃.但是windo ...