Code coverage 是一个计算你的单元測试覆盖率的工具。

高水平的覆盖给你的单元測试带来信心。也表明你的应用被彻底的測试过了。

你可能写了几千个单元測试,但假设覆盖率不高。那么你写的这套測试可能价值也不大。

这里并没有一个确切的百分比,要求你必须到达这个覆盖率。这非常大程度上取决于你的项目(的详细情况)。

譬如说,假设你的项目中有非常多不能写单元測试的视觉组件,那么覆盖率就会比单纯处理数据的框架要低的多。

Code Coverage in Xcode

在过去,假设你想要制作一个測试的代码覆盖报告出来,须要设置非常多[选项]。

非常复杂,还有很多须要手动设置。


iOS 9中,苹果提供了智能的代码覆盖工具,他是和 LLVM 一体的。每次执行測试都会被调用和计算。

Using the Code Coverage Tools

如今我们用一个样例来展示,如何使用新的 code coverage 工具和如何提升如今的測试用例。完毕后的代码放在了 Github 上,你能够跟着做。

第一件事是创建一个新项目。并确认你选上了Unit tests选项。

这会按要求创建一个默认项目,现我们须要測试点什么。这个測试可能是你的随意需求,这里我加入一个空的 swift 文件,里面写好了一个全局的方法。

这种方法检測两个字母串是否是仅排序不同的同样字母组成的词

写成全局的方法,可能不是好的设计,但这里我们仅演示一下。

这是一个相对简单的方法。所以我们可能会得到一个没有不论什么问题的。100%覆盖的測试覆盖率。

check word

一旦你写好了算法,就该写个測试了。打开项目创建时已经创建好了的默认的XCTestCase,加入一个以下的简单的測试方法。他看起来是这样子的。

imageMogr2/auto-orient/strip%7CimageView2/2/w/1240/q/100" class="imagebubble-image" alt="">

tests

在执行測试之前,我们必须先确认 code coverage 是否被打开了,写代码时,默认是关闭的。所以你须要编辑一下你的測试 scheme,把它打开。

turn on coverage

确保"Gather coverage data"是被选中的。然后点击关闭button,执行測试的 target. 我们希望刚刚创建的測试用例可以顺利通过。

The Coverage Tab

一旦这个測试通过了。你就能知道 checkWord 这种方法,至少有一条路径是对的。但你不知道的是。还多多少没有被測试到。

这就是code coverage这个工具的优点。当你打开code coverage tab后,你能够清楚的看到測试的覆盖情况。他们按找 target, file, function 进行了自己主动分组。

打开Xcode左边窗体的Report Navigator面板,选中你刚执行的測试。

然后在tab中选中 Coverage。

test coverage panel

这会展示一个你的类、方法的列表,并标示出每一个的測试覆盖率。假设你将鼠标悬停在checkWord这种方法上,你可以看到測试的覆盖率是28%。

不能接受啊!我们须要找到。那些代码分支是可以被測试运行。那些是不能的,进而改善他们。双击方法的名字,Xcode会打开类的代码,而且看到code coverage的情况。

coverage result

白色的区域表示这些代码时測试覆盖过的。

灰色区域时測试无法覆盖的,我们须要加入很多其它的測试用例来覆盖灰色部分的代码。

在右手边的数字,表明这些代码块,在这次測试中被运行的次数。

Improving Coverage

非常显然,28%的覆盖率不是我们的目标。

这里没有 UI,看起来是个完美的编写測试用例的候选function。所以,我们加入一个測试用例。

理想情况下,我们希望每一个分支都能被測试到。

这样就能达到完整的覆盖。加入以下的測试用例到你的測试类中。

test cases

这些測试用例应该可以全然覆盖我们的代码了。执行一下单元。然后打开最后一个測试报告。

imageMogr2/auto-orient/strip%7CimageView2/2/w/1240/q/100" class="imagebubble-image" alt="">

the final coverage result

我们成功了,100%的覆盖率。

你能够看到整个代码都变成了白色,右面的数字也展示了每一个代码段至少被运行了一次。

使用code coverage是一个很棒的方式,帮你建立真正有价值的測试组合。远好于你写了许多測试用例,但没有真正測试到代码。

Xcode 7 让这样的方式变的很easy,我推荐你在项目中开启 Code Coverage。即使你已经写好了測试。也能够帮你知道究竟測试写的怎么样。

Demo在Github地址: https://github.com/fish-yan/XCode-Code-Coverage

iOS 9 学习系列: Xcode Code Coverage的更多相关文章

  1. iOS 9 学习系列:Split Screen Multitasking

    http://www.cocoachina.com/ios/20151010/13601.html iOS 9 的一个重大变化就是增加了多任务,这个多任务允许用户在屏幕上同时运行多个 app.有两种形 ...

  2. iOS/iPhone学习系列、代码教程

    part 1--入门: 1. xcode 版本下载 以及 iphone sdk 下载: 最新版本在此下载: http://developer.apple.com/devcenter/ios/index ...

  3. iOS日常学习 - 每个Xcode开发者应该知道的七个使用技巧

    本文为转载学习使用原文链接 工欲善其事,必先利其器.对一个iOS开发者来说,这就意味着对Xcode的熟练掌握程度.Xcode是一个学习起来有点难度的软件,下面的这些技巧或许可以显著的提高你的编程效率. ...

  4. iOS 9学习系列:打通 iOS 9 的通用链接(Universal Links)

    在WWDC 2015 上, Apple 为 iOS 9 宣布了一个所谓 通用链接 的深层链接特性, 视频地址为 [无缝链接到您的 App].虽然它不是一个必须实现的功能, 但还是需要引起一些注意. 在 ...

  5. iOS 9 学习系列:Storyboard References

    http://www.cocoachina.com/ios/20150922/13474.html 如果你曾经使用 interface builder 创建过一个复杂.界面非常多的应用,你就会明白最后 ...

  6. iOS 9 学习系列:UIStack View

    http://www.cocoachina.com/ios/20150921/13492.html 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方式,纵向或 ...

  7. iOS 9 学习系列:UIStack View (转载)

    作者:Nathan_Bao 地址:http://www.jianshu.com/p/1991e6c2881a 在 iOS9 中,Apple 引入了 UIStackView,他让你的应用可以通过简单的方 ...

  8. OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现

    # OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...

  9. OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建

    # OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...

随机推荐

  1. uni-app - 支付(app支付、小程序支付、h5(微信端)支付)

    App支付.小程序支付.h5(微信端)支付 APP支付(内置) appPay.js /** * 5+App支付,仅支持支付宝以及微信支付 * * 支付宝Sdk集成,微信sdk未集成 * * @para ...

  2. 微信小程序 - 授权页面

    小程序授权方式更改以后,我们只有两种选择. 1.在主页使用遮罩层,类似这样的(会造成一点卡顿) 2.新增登陆授权页(经过反复的思考,我还是觉得用这个好) 这个也不错: https://blog.csd ...

  3. 微软BI 之SSAS 系列 - 基于雪花模型的维度设计

    基于雪花模型的维度以下面的 Product 产品与产品子类别,产品类别为例. DimProduct 表和 DimProductSubcategory 表有外键关系,而 DimProductSubcat ...

  4. 微软BI 之SSRS 系列 - 使用带参数的 MDX 查询实现一个分组聚合功能的报表

    基于数据仓库上的 SSRS 报表展示,一般可以直接通过 SQL 查询,存储过程,视图或者表等多种方式将数据加载并呈现在报表中.但是如果是基于 Cube 多维数据集的数据查询,就不能再使用 SQL 的语 ...

  5. 忘记webogic管理控制台密码

    cd /user_projects/domains/base_domain/security cp DefaultAuthenticatorInit.ldift DefaultAuthenticato ...

  6. angular中的 登录检查 和 过期Session清理

    angular利用ui-router进行登录检查 SAP都会有这个问题,session过期或者页面被刷新的情况下应该进入登录页. 监听ui-router的satte事件可以实现当state切换的时候检 ...

  7. Can't connect to MySQL server on 'ip' (13)

    解决方法1.:setsebool -P httpd_can_network_connect_db=1 解决方法2.:修改/etc/selinux/config SELINUX=enforcing 为 ...

  8. JqGrid把数据行插入指定位置的方法addRowData

    1.首页在colModel里写好方法,如下代码options.rowId是获取当前行的编号 { label: '操作', width: 60, align: 'center', formatter: ...

  9. Oracle自学笔记(一)

    1.创建用户并指定表空间 create user gy_3004 identified by gy_3004 default tablespace gy_3004_data temporary tab ...

  10. windows用户态程序的Dump

    熟悉Linux的开发人员都知道,在Linux下开发程序,如果程序崩溃了,可以通过配置Core Dump,来让程序崩溃的瞬间产生一个Dump文件,然后通过dump文件来调试程序为什么崩溃.但是windo ...