自2017年以来有关使用Swift进行单元测试的文章的完整列表

您是否为应用编写单元测试? 无论您在Swift中编写测试有什么答案,它都会成为开发社区中的热门话题。 许多开发人员发表了出色的文章,就用Swift编写测试进行了出色的演讲和播客。 通过这些材料,学习变得比以往更加容易。 在2017年底,我决定分享我最喜欢的材料,这对您将单元测试技能从零提高到一非常有用。

快乐学习🙂

在弄脏手之前

可测性工程

可测试性工程– WWDC 2017 –视频– Apple Developer
单元测试是必不可少的工具,可以一致地验证您的代码是否正常工作。 探索设计技术…… developer.apple.com

如果您是编写单元测试的新手,我强烈建议您从WWDC 2017的视频开始。在此视频中,Brain Croom和Greg Tracy声明了编写可测试代码的动机以及可测试性的重要性。 然后,他们展示了如何逐步分离模块。 他们还介绍了在建模应用程序和编写单元测试中应了解的许多技术和技巧。 这绝对是开始您的旅程的好地方。

iOS单元测试和UI测试教程

iOS单元测试和UI测试教程
编写测试并不是魅力十足,但是由于测试可以使您闪亮的应用程序避免变成臭虫缠身的垃圾…… www.raywenderlich.com

我仍然记得,当我第一次选中“包括单元测试”复选框时,我并不知道该项目有任何更改,也不知道如何进行。 这是由Audrey Tam提出的有关在Swift中编写测试的完整指南。 她介绍了一些基本主题,例如如何在Xcode中设置单元测试以及如何创建模拟对象或存根对象。 她还介绍了更高级的主题,例如性能测试和测试范围。

在此过程中,您将掌握测试忍者所使用的一些词汇,并且到本教程结束时,您将非常有信心地将依赖项注入待测系统 (SUT)中!

Swift开发人员时尚的单元测试指南

Swift开发人员时尚的单元测试指南
Jaim Zuber介绍了成熟的技术来测试您的应用程序,包括使测试变得困难的模式以及… academy.realm.io

我应该在当前阶段对代码编写测试吗? Jaim Zuber展示了为什么需要测试以及将测试引入项目的好处。 他还提供了详细的分步教程,以在实践中编写测试:

我们将回答以下问题:如何测试ViewController? 如何测试故事板代码? 在没有模拟库或部分模拟的情况下如何生存?

如果您仍然不确定编写测试有什么好处,请观看此视频讲座!

Xcode Playgrounds中的TDD

Xcode Playgrounds中的TDD 技能专区| 2017年3月30日
iOSCon 2017 – iOS会议和Swift Developers会议主持人。 保罗·阿德莱努(Paul Ardeleanu):除了出色……

不熟悉XCTest? 害怕弄乱您现有的项目? 别担心,您可以从游乐场开始! 去检查这个精彩的演示,当听到“ TDD”术语(测试驱动开发)时不要惊慌。 在此视频中,Paul Ardeleanu指导您通过Playground中的简单示例编写XCTest案例,即使您不知道TDD是什么,也可以轻松地从头开始并进行后续操作。

该解决方案的最大优势是,每次发生变化时,游乐场都会重新运行所有测试,从而大大缩短反馈!

Swift中网络单元测试的完整指南

Swift中网络单元测试的完整指南
medium.com

现在您知道了如何解耦模块以及如何编写XCTestCase。 但是,如何在实践中结合这些技术仍然令人困惑。 这是我的教程,讨论了广泛使用的解耦技术Dependency Injection(DI)。 它说明了如何使用DI和Swift协议解耦网络服务,并向您展示了如何为该服务编写测试。

依赖注入使我们的系统更加灵活……我们也可以“注入”模拟网络环境来运行测试代码,而无需访问Internet。

测试iOS应用

测试iOS应用
在iOS应用中编写测试是一个棘手的主题。 并非每个人都如此荣幸地能够全职编写测试,例如…… merowing.info

掌握测试写作技巧有些困难:太多规则或模式需要记住。 但是您无需一次学习所有的知识。 KrzysztofZabłocki列出了在编写测试时应首先强调的综合和通用概念。 牢记这些原则,从长远来看,您将能够编写可维护的测试并从中受益。

大型公司可能拥有专门的质量检查团队,但是如果您是2个开发人员之一,则通常要负责确保工作的质量和可靠性。

Singleton,服务定位器和iOS中的测试

Singleton,服务定位器和iOS中的测试
在本文中,我想回顾一下iOS中的Singleton模式和Service Locator模式的用法以及它们的原因… badootech.badoo.com

当您在项目中看到单例时,您是工程师吗? Bohdan Orlov比较了两种主要滥用的模式,即Singleton模式和Service Locator模式,并指出了为什么它们如此臭名昭著。 他还提供了做得更好的方法,并基于这两种模式编写了单元测试。 它对于解耦模块和重构遗留代码非常方便。

从应用程序的任何层访问全局对象都违反了最小特权原则,并且我们努力使依赖关系保持明确。

让我们做一些更酷的东西!

测试未测试的应用

测试未测试的应用
在此CMD + U Conference现场编码演示中,Michael May展示了开始测试尚不存在的代码的技术… academy.realm.io

进行每一个小的更改,您的代码将变得更加健壮,并且您将获得更多的测试。

如果足够幸运,您可以从零开始项目。 但是,大多数时候您必须进行团队合作,查看或修改其他人的代码。 在这种情况下,我们如何开始为这些项目编写测试? 在此视频中,Michael May与您进行了实时代码审查。 他重构了一个现有的项目,并逐行解释了自己的想法。 这是一次真实的体验!

iOS上的常见单元测试技术

iOS上的常见单元测试技术
TL; DR – iOS上的大多数(如果不是全部)单元测试用例都可以遵循相同的众所周知的模式:给出一组初始的… www.marisibrothers.com

学习技术并反复实践它们是成为高性能开发人员的关键。

Swift没有模拟框架,因为反射是有限的,并且对于纯swift对象而言,无法更改方法的实现。

Luciano Marisi告诉您如何制作它们! 在那里,您会发现一些非常有用的技术。 这些出色的模式几乎涵盖了写作测试中的所有日常情况。

在Swift中测试双打

在Swift中测试双打– Marco Santa Dev
敏锐的开发人员编写了许多单元测试,以涵盖用于生产的代码。 不幸的是,一个组件可以… marcosantadev.com

Google Testing Blog中的“测试双倍对象可以代表测试中的真实对象”。 您肯定已经听过“模拟”和“存根”,但是还有更多有用的双测试可以促进单元测试。

要使测试易于编写,您需要测试双打。

Marco Santarossa通过全面的示例介绍了极少数的双打考试,轻松创建双打考试。

在XCTest中等待

在XCTest中等待
等待很困难,在Xcode中等待也不例外。 甚至可以从众多的Xcode和XCTest选项中进行选择… masilotti.com

等待很困难,在Xcode中等待也不例外。 即使从Xcode和XCTest提供的众多选项中进行选择也可能很困难。

在移动/桌面开发中,异步请求是不可避免的。 Xcode为您提供了许多类来处理等待事件。 Joe Masilotti写了有关XCTestExpectation及其系列的整体说明。 他还介绍了您应避免的陷阱,并帮助您为异步请求(如老板)编写测试用例。

破解核心数据测试

破解核心数据测试
medium.com

模拟上下文并向容器中写入测试变得越来越困难(NSPersistentContainer)

对许多人来说,编写针对Core Data的测试是一个黑匣子。 在本文中,我简要介绍了Core Data的测试技术,包括内存数据库和Core Data中的DI。 如果您正在使用Core Data作为存储层,并且仍然想知道如何编写测试,那么这就是您的最佳选择。

code + S的Xcode单元测试

code + S的Xcode单元测试
使用Xcode IDE进行TDD可能会造成破坏。 每次您在实现中引入一个小的更改时… medium.com

对于大型项目而言,运行测试是一项艰巨的任务,因为重建项目需要很长时间。 这是John Holdsworth的工具InjectionTDD进行救援的。 InjectionTDD注入新的实现,而无需重建整个项目。 现在,Bartosz Polaczyk逐步介绍了InjectionTDD。

InjectionForXcode通过实时编译更新的文件并在实时iOS流程中替换/替换其实现方式来节省大量时间。

你必须知道的一些事情

Swift单元测试中的时间旅行

Swift单元测试中的时间旅行
我们编写的许多代码都以某种方式依赖当前日期。 让我们看一下如何在……中测试这些代码 。www.swiftbysundell.com

通常,我们的代码取决于不同的时间。 但这是编写测试的一个大问题:不等待就很难准备好正确的日期对象。 约翰·桑德尔(John Sundell)提出了一种很酷的技巧,即时空旅行,以帮助您“跳到”适当的时间,这样您就不必坐着了。

一种快速且可预测的日期相关测试,而无需发明大量基础结构或诉诸于恶意的解决方案,例如浪费系统日期。

减少Swift测试中的脆弱感

减少Swift测试中的脆弱感
当测试不一致时会发生松脱现象-当您根据时间获得不同的结果时,会发生以下情况: www.swiftbysundell.com

当测试不一致时会发生松脱感

测试代码也是代码。 您仍然需要注意测试代码的质量。 John Sundell撰写了一篇很棒的文章,告诉您在编写测试时如何避免“松脱”。 他分享了三个在实际工作中有帮助的技巧。 还有一件事,如果您对提高测试技能感兴趣,请不要错过他每周更新的优秀博客。

不会崩溃的测试

不会崩溃的测试
给蒂姆五世打个招呼! 当一个话题激发他的时候,他将在这里发布。今天,他将谈论如何…… ericasadun.com

凭直觉,在单元测试中崩溃似乎没有害处。 它们仅发生在开发过程中,根本不会影响用户。 但是,它们破坏了您的持续集成流程:异常后的测试将不会执行。 Tim Vermeulen展示了如何优雅地解决问题以及如何使异常性更具描述性。

编写测试会很简单,当遇到意外的nil或意外引发错误时,测试会正常失败。

在没有OCMock的情况下进行测试和模拟

在没有OCMock的情况下进行测试和模拟
OCMock是用于Objective-C的功能强大的模拟对象单元测试库。 即使您使用的是Swift,只要您… www.jessesquires.com

您是OCMock用户吗? 没有Objective-C中运行时混乱的好处,使用OCMock模拟纯Swift代码是一项挑战。 Jesse Squires介绍了一种使用协议和XCTestExpectation来测试SUT行为的替代方法。

这种测试方法使我们的测试相当简单明了,并为我们提供了Swift中的一种“模拟”功能。

使模拟对象更有用

使模拟对象更有用
在Swift中,我们手工制作模拟对象。 他们的设计决定了我们编写单元测试的方式。 我们可以进一步制作模拟对象吗? academy.realm.io

为什么需要模拟对象? 为什么要使用模拟对象而不是真实对象?

一旦开始编写自己的测试,您可能会发现设计模拟并不像示例代码所示那样容易。 实际上,模拟就像真正的产品一样:它们应该是可重用和可维护的。 OCMockito的作者乔恩·里德(Jon Reid)在这里介绍了他模拟对象的经验。 他介绍了许多模拟技术,例如利用辅助方法和使断言更具描述性。 这些可以帮助您创建高质量的模拟并提高效率。

更多的救生员

使用协议组合进行依赖项注入

使用协议组合进行依赖项注入
我喜欢使用组合注入和依赖项注入,但是当您需要为每个实体注入多个依赖项时…… merowing.info

如果单个实体上有多个依赖项,那么DI有时会很麻烦。 KrzysztofZabłocki提供了一个很好的捷径:使用协议组合!

iOS Cookies-测试部分

iOS Cookies每周都会整理许多高质量的Swift库。 测试爱好者绝对是为您量身打造的测试部分🍻

Arek Holko向您展示了如何通过简单的技巧来挽救生命。 🙂

结论

作为唯一的开发人员,我没有指导老师教我如何面对面编写单元测试。 但是,感谢Swift社区,我有很多资源可以咨询和学习。

如果您有任何疑问或发现我想念的任何东西,请随时在下面留下答复。 并且不要忘了喜欢/拍/分享那些文章。 🙂