- 原文地址:Writing unit tests in Swift playgrounds
- 原文做者:John
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:lsvih
- 校对者:94haox
Swift playground 对于试用新的 framework、探索语言的新特性来讲十分有用。它提供的实时反馈能让你快速尝试新的想法与解决方案,大大提升生产力。html
自 Swift 问世以来,不管是设计 framework API,仍是给 app 开发新功能,我一直在不停地使用 playground,但愿找到将它整合进工做流的办法。前端
本周,让咱们来了解如何将 Swift playground 应用于编写单元测试,以及如何让 TDD - 测试驱动开发(ish)工做流变得更加顺畅。android
实际上在 playground 编写测试与编写 test target 基本一致。你能够先导入 XCTest
,而后建立测试用例,例如:ios
import Foundation
import XCTest
class UserManagerTests: XCTestCase {
var manager: UserManager!
override func setUp() {
super.setUp()
manager = UserManager()
}
func testLoggingIn() {
XCTAssertNil(manager.user)
let user = User(id: 7, name: "John")
manager.login(user: user)
XCTAssertEqual(manager.user, user)
}
}
复制代码
不过,若是你尚未实现直接在 playground 中测试的代码,那么在刚开始时访问代码可能会有点麻烦。你必须根据代码的来源( app 仍是 framework ),而选择不一样的方式来访问将要测试的代码git
测试 app 代码github
因为能够在编写 playground 时不直接导入 app target,所以可使用下面的几种方法测试 app 代码:swift
1) 复制代码 这大概是最简单的方法了。将想测试的代码复制至 playground 运行,最后再拷回去。这个方法简单粗暴。后端
2) 复制文件 若是你不想直接将要测试的代码放到 playground 中,也能够将须要的源文件复制到 playground 的 Sources
目录中(使用 ⌘ + 0
显示 organizer,而后将文件拖进去)。接下来同上,在运行测试以后再将改变后的文件拷回覆盖源文件。xcode
3) 建立 framework target 若是你讨厌复制文件,你也能够建立一个包含须要测试代码的 framework。在 Xcode 中建立一个新的 framework(或使用 SwiftPlate 建立一个跨平台 framework),接着按照下面的步骤操做。bash
测试 framework 代码
你能够经过如下操做将任意 framework 加入 playground:
import
你的 framework,开始编码了!若是你但愿自动执行上述操做,可使用我写的脚本 - Playground,它能让你经过一行命令完成上述除了 framework 的构建与 import 以外的全部操做:
$ playground -d /Path/To/Framework/Project.xcodeproj
复制代码
如今已经能够访问须要测试的代码了,而且咱们还为其编写好了一个测试用例。如今试着运行这个测试用例! 🚀
在通常的 test target 中,你通常会使用 ⌘ + U
来运行你的测试;但在 playground 中,我但愿 Xcode 能自动运行测试(以得到舒爽的实时反馈)。最简单的实现方式就是为你的测试用例运行 defaultTestSuite
,以下所示:
UserManagerTests.defaultTestSuite().run()
复制代码
执行上面的操做会运行测试,并将测试结果转储至控制台(可以使用 ⌘ + ⇧ + C
呼出)。这样作虽然没问题,但很容易错过错误信息。为此,能够建立一个测试观察者(test observer),在测试发生错误时触发一个断言失败(assertionFailure)错误:
class TestObserver: NSObject, XCTestObservation {
func testCase(_ testCase: XCTestCase, didFailWithDescription description: String, inFile filePath: String?, atLine lineNumber: UInt) {
assertionFailure(description, line: lineNumber)
}
}
let testObserver = TestObserver()
XCTestObservationCenter.shared().addTestObserver(testObserver)
复制代码
在开始测试出现失败时,咱们将看到编辑器提示一个行内错误 🎉
若是你用的是 Swift 4,须要将上面的代码改为下面这样:
class TestObserver: NSObject, XCTestObservation {
func testCase(_ testCase: XCTestCase, didFailWithDescription description: String, inFile filePath: String?, atLine lineNumber: Int) {
assertionFailure(description, line: UInt(lineNumber))
}
}
let testObserver = TestObserver()
XCTestObservationCenter.shared.addTestObserver(testObserver)
UserManagerTests.defaultTestSuite.run()
复制代码
虽然须要额外作一些设置,但我仍是很喜欢使用 Swift playground 进行单元测试。我以为这样经过快速的反馈并轻松进行修改,更加接近理想中的红绿重构。这也能够构建更健壮的测试与更高的测试覆盖率。
我我的倾向于为正在开发的 app 与 framework 准备好一个 playground,以便更轻松地深刻调试。此外,我还倾向于围绕 framework 构建 app,这样只需简单将代码引入 playground 就能开始编码。我会在以后的博文中讨论这些结构与设置的细节。
你怎么看?你是否准备使用 playground 进行单元测试?或者你是否在尝试其它方法?请经过评论或 Twitter @johnsundell 让做者知道你的意见、问题与反馈。
感谢您的阅读 🚀
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。