原文地址:A complete list of articles on Unit Testing with Swift from 2017
原文需翻墙。
无论你写不写测试,Swift 在社区的普及度已经越来越高。过去一年社区里涌现了很多基于 Swift 的测试相关文章资源。下面我把我收集到的很大家分享一下。
在测试之前应该了解的事情
如果你以前没有写过单元测试,那么强烈建议你先看下这个 WWDC 17 上的视频。在这个视频了介绍了写出可以被测试的代码的重要性。并且一步步演示了如何给模块解耦。同时也展示了很多给 app 建模和写单元测试的技巧。从这个视频了解单元测试会是一个很好的开端。
这是一篇非常好的介绍如何用 Swift 写测试的 guide 。介绍了几个很核心的内容,比如如何在 Xcode 里配置单元测试,如何 mock 数据对象。同时也介绍了一些进阶的单元测试概念,比如性能测试和测试覆盖率。
我应该在什么时候开始写测试代码?Jaim Zuber 在演讲里解释了在项目里引入测试的好处。当然也一步步演示了如何在实际项目中写测试。如何测试 ViewControllers 、如何测试 Storyboard、如果没有 mock 测试要如何进行,这些问题都能在演讲里找到答案。
对 XCTest 不熟悉?害怕引入单元测试把项目搞乱?你也可以通过 playground 开始。在这个视频里,Paul Ardeleanu 会演示在 playground 里写几个简单的 XCTest case 。你一定能看懂,即使你没听说过 TDD 。
现在你知道如何为模块解耦,如何写 XCTestCase。然而你可能还是会困惑如何把这些技术应用在实践里。这篇教程介绍了广泛使用的解耦技巧:依赖注入(Dependency Injection)。解释了如何利用 DI 和 Swift protocol 去解耦网络层服务,如何给服务写测试。
从某个角度来说很难完全掌握写测试的技巧:要记住有太多的规则和模式。不过你也不用一口气都学会这些。Krzysztof Zabłocki 列出了在你刚开始写测试时需要注意的通用的概念和规则。记住这些准则,你就能写出易维护的测试,并且长期受益。
Bohdan Orlov 比较了两个经常被滥用的模式: Singleton 和 Service Locator。并且指出了为什么两个模式经常被滥用。也提供了基于两种方式更优雅的写单元测试的方式。对于解耦和重构老代码非常实用。
专业测试三十年
如果你运气好,整个项目都是你自己从零开始写的。然而更多的时候你必须做一些团队协作的工作,review 和修改一些别人的代码。在这样的情况下,我们要怎么给这些项目写测试呢?在这个视频里,Michael May 和你一起做了一次现场 review 。他重构了一个老的项目,并且细致的解释了每行的重构思路。
学习技术并且不断的练习是成为一个高级程序员的关键。
Swift 没有一个 mocking 的框架,因为受限于语言的动态能力,纯 Swift 对象的实现代码不能被改变。
Luciano Marisi 会告诉你如何达到这个目的。你会看到很多非常实用的技术。这些好用的模式在你写测试的过程中会经常被用到。
如果测试的对象有第三方依赖,引入第三方依赖就会加大测试的复杂度。所以模拟一份依赖的复制可以是测试变的简单。这种代替依赖的物体叫做 Test Double(Google Testing Blog)。本文介绍了几种创建 test double 的技术。
在软件开发中处理异步请求是家常便饭。Xcode 提供了很多类让我们处理等待事件。本文对 XCTestExpectation 进行了全面的介绍。同时也介绍了使用过程中遇到的坑。让你能够完美的写出针对异步请求的测试。
很多人对怎么样给 Core Data 写测试完全没概念。在这篇文章里,会简要的介绍针对 Core Data 的测试技巧,包括在内存中的数据库和 DI 。如果你用 Core Data 作为存储层,但是不知道如何测试。这篇文章会告诉你答案。
在一个很大的项目里跑测试会因为需要 rebuild 项目而花费很多时间。John Holdsworth 有一个很酷的神器:InjectionTDD 。InjectionTDD 会注册新的实现而不需要重新编译整个项目。Bartosz Polaczyk 会一步步演示如何使用 InjectionTDD。
祖传秘籍
有的时候我们的代码会依赖于时间(比如缓存的有效期是两天)。但是在写测试的时候很难模拟时间的变化。John Sundell 介绍了他如何进行“时空穿梭”来测试。
测试代码也是代码。所以依然要在意测试的代码的质量。这篇文章会告诉你如何避免在测试代码中引入混乱。分享的三个 tip 在实际工作场景中都非常实用。
通常我们会觉得在测试的时候发生闪退没什么影响。因为不经常发生而且也不会影响到实际用户。然而却会影响到持续集成的流程:出现异常后面的测试就不会被执行了。Tim Vermeulen 展示了如何轻巧的解决这个问题,并且如何使异常展示的更加友好。
你是否使用 OCMock ?没有 OC 的动态优势的 Swift 要如何 mock 呢? Jesse Squires 介绍了另外一种方式来解决这个问题。
一旦你开始在实际项目中开始写测试,你就发现设计 mock 对象并不像那些入门教程里说的那么简单。实际上 mock 也和软件产品一样:他们应该可以被重用并且易维护(be reusable and maintainable)。OCMockito 的作者,Jon Reid 介绍了他在 mocking 对象的实践经验。介绍了很多实用的技术,对写出高质量的 mock 和提高效率有很大帮助。
还有这种操作
如果有好几个依赖注入(DI)到单一实体上会显得很笨重。Krzysztof Zabłocki 展示了另外一种操作:用合成 protocol 。
iOS Cookies 收集了很多高质量的 Swift 库。测试相关的这些库不要错过🍻。
总结
作为一个刚入门的开发者,没有一个 mentor 面对面教过我如何写单元测试。然而感谢 Swift 社区,可以有这么多充满价值的资料可以让我去学习。
欢迎关注我的微博:@没故事的卓同学
掘金博客地址:https://juejin.im/user/5624c86b60b2b199f7611227
如果想与我有更密切的交流也可以加入我的小密圈:程序员生存指南