《iOS 测试指南》读书笔记 (一)

第1章 软件测试与iOS测试

iOS平台的一些特性:
硬件特性
只有一个程序正在运行
有限内存和CPU
多样化不稳定的网络环境
多样化且不同尺寸的屏幕

用户使用特性
短时间内相应
多种输入方式:摇晃、使用地理位置等

第2章 iOS测试环境准备(略)

第3章 iOS单元测试

3.1工具

3.1.1 OCUnit (XCTest)

该工具现已被 XCTest 取代,但大致使用习惯和使用方法的变化不大。XCTest是Xcode自带的测试工具集,他有下面几个特性:

  • 命名方式以 test 开头,如 testXXXX
  • 测试类继承 XCTestCase ,只有继承它或其子类,才能去发现和执行测试方法
  • 测试一定要有结果预期,表达预期结果使用断言
  • 当 XCTest 执行一个测试方法时,会按顺序执行方法中每一行语句。在执行过程中,方法抛出了非预期的异常,会被立即停止,并计为失败。反之,全部执行完,就是测试成功了
  • 一个测试用例中可以有多个测试方法,在每个测试方法执行前和执行后,会调用 setUp 和 tearDown 方法

3.1.2 GHUnit

GHUnit 是一个第三方的测试框架,它是一个开源项目,在 Github 上有1000+的 star,现在看来,已经不再加新特性,但是依然在维护中。在 Xcode 4 之前,OCUnit 有很多限制,所以涌现出来很多的三方测试框架,GHUnit 是其中一个。GHUnit 是以一个应用程序安装到手机里运行的,有测试相关的图形界面,和之前的 OCUnit 完全不同。在其主页上,我还看到它能够测试 UI 组件,比对视图的前后变化等 UI 方面的测试内容。

3.1.3 GTM (略)

3.2 单元测试实践

前面介绍了3种测试工具,作者选定的是 OCUnit 作为全书的实践测试工具。
被测试系统 SUT (System Under Test)
SUT 的形态分三种:

  • 有明确返回值。可以直接验证返回值是否符合预期。
  • 没有返回值。需要验证对象内部的一些属性和状态,这种方法称为状态验证法。经典实用场景:set 方法
  • SUT 依赖于外部的一个类或方法,他会调用外部的一个方法,被依赖的外部方法可能有返回值也可能没有,这种叫行为验证法。这时需要验证的是是否发起了这个行为

3.2.1 实践项目介绍

这个项目是一个简单的计数器工具,点+1按钮数值加1,点-1按钮,数值减1。自己实现了书中 Demo: 计数器Demo,使用 XCTest 实现,可以在 Xcode 8 下直接运行。这个项目采用了 MVC 架构,作者构建了一个典型的 MVC 的通讯场景:View 通过 Target-Action 方式通知 Controller ,Controller 调用 Model 处理业务逻辑,Model 处理完通过 Notification 传递消息给 Controller,Controller 更新 View。作者在下面三个小结中,分别阐述了如何对 Model View&ViewController 做单元测试。
使用了两个三方框架

  • OCHamcrest 断言功能更强大,可读性更好
  • OCMockito Mock框架,可以 Mock 具体类,并指定该类的具体方法的返回值。

3.2.2 Model的单元测试

Model 待测试方法:

@property (nonatomic) NSUInteger count;

- (id)initWithUserDefault:(NSUserDefaults *)defaults;
- (void)increment;
- (void)decrement;
- (NSUInteger)getCountInDefaults;

测试代码见 Demo。主要使用下面3中测试方法:

  • 注入依赖,通过 Mock 方法强制依赖返回结果(这里 Mock 了 NSUserDefaults),从而验证方法的返回值是否正确
  • 注入依赖,通过该 Mock 方法验证某一个方法是否是以我们希望的方法调用了 (testIncrementShouldInvokeSetObject 中使用了 verify 宏来判定是否调用了某个具体方法)
  • 被测试方法会发送 Notification,测试方法必须添加 Notification 的接收器来进行测试

3.3.3 Controller和View的单元测试

先看两者的交互:View 响应用户的操作后,调用 Controller 的方法 。Controller 处理完后会更新 View。其中 View 向 Controller 操作部分可以细分为下面三个步骤:

  • 需要确认相关的 View 是否存在并且正确显示
  • 需要确认相关的 View 是否绑定了正确的事件和方法
  • 需要确认 Controller 发送消息的方法是否正确

而更新 View 的验证就相对简单,只要判断内容或者状态是否符合预期。属于上面 SUT 的状态验证法。
实际使用中,如果对 ViewController 进行测试,需要 Controller 暴露信息较多,否则在测试方法中,很难做到解耦,比较鸡肋。

3.4 单元测试的拓展工具

OCHamcrest IOS单元测试的扩展工具OCHamcrest
OCMockito IOS单元测试工具之OCMockito
关于单元测试的详细内容,可以参考《测试驱动的iOS开发》一书,能有更细致了解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 介绍 objc.io objc.io 是关于 Objective-C 最佳实践和先进技术的期刊,欢迎来到第一期! ...
    评评分分阅读 1,692评论 5 24
  • 前言 如果有测试大佬发现内容不对,欢迎指正,我会及时修改。 大多数的iOS App(没有持续集成)迭代流程是这样的...
    默默_David阅读 1,660评论 0 4
  • 大多数的iOS App (没有持续集成)迭代流程是这样的: 也就是说,测试是发布之前的最后一道关卡。如果bug不能...
    伯牙呀阅读 4,879评论 1 22
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 有一种爱情 他喜欢你 就是因为你是你 无论你是外界眼中的女强人也罢 还是家里邋遢的小懒猫也罢 在他的眼里你都是那...
    柳儿呀阅读 464评论 0 0