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