测试已测试 | ✓ |
Lang语言 | SwiftSwift |
许可证 | Apache 2 |
发布最后发布 | 2016 年 6 月 |
SPM支持 SPM | ✗ |
由 Brian Partridge 维护。
Swift 的类型系统确保你的方法与正确类型的对象交互,但你仍需要使用条件语句和断言来验证它们的值。
你可以测试条件语句,但在此之前,你无法在不崩溃测试运行的情况下测试 Swift 的断言(assert
、precondition
、fatalError
)。Ackbar
允许你编写单元测试来验证断言是否被测试覆盖并在你期望它们调用时触发。
这分为两个部分进行
AckbarAssertions
添加到你的 app/framework 目标。它将为 DEBUG
构建添加覆盖 Swift 断言的方法。AckbarTesting
添加到你的测试目标,并使用 assertHitsDebugException
来测试你的断言是否被执行。更多详情请查看下面的 详细设计。
在你的 app/framework 的 Podfile 中
pod 'AckbarAssertions'
在你的测试目标的 Podfile 中
pod 'AckbarTesting'
安装 pods
pod install
重要:打开 Ackbar/Assertions/README.swift
并按照说明将陷阱手动集成到你的 app 目标中。更多详情请查看 设计部分。
在你的 app/framework 中
func foo(someConditionThatMustBeTrueToSucceed: Bool) {
precondition(someConditionThatMustBeTrueToSucceed) // Write your assertions as you normally would.
...
}
在你的测试中
func testFoo() {
assertHitsDebugException(foo(false)) // Use like you would use XCTAssert*.
}
查看 Endor,了解如何在测试中使用 AckbarTesting
的更复杂示例。
测试断言是通过抛出断言失败的 NSException
并使用 Objective-C 的 try
/catch
异常处理功能来检测和触发测试失败来实现的。
断言失败通常会导致进程终止,但这也大大降低了可测试性。为了使断言可测试,我们需要可以检测到的东西,并且还需要回滚调用栈,以便在检测到后,其他测试可以在继续运行之前运行。目前,为此现在最好的选择是使用异常。
为每个线程附加一个类似于 NSAssertionHandler
的 '处理器' 是不可行的,因为这只能有效地用于记录失败情况。它不能支持堆栈回溯。
Swift通过抛出错误进行错误处理不是一个选择,因为它不会回溯堆栈且要求所有调用者使用try
关键字。这可能会干扰Swift错误处理风格的合法使用。
Swift断言系列在断言失败时发送陷阱信号。我们可以实现信号处理器,但由于直接使用mach的复杂性和Swift语言正在经历的变革,我们选择在这个阶段不采取这种方法。然而,已经有使用信号处理器来实现这一功能的示例。
我们使用CocoaPods进行分发,因为它使将代码集成到您的项目中变得简单。然而,为了使AckbarAssertions中的可测试断言能够覆盖Swift的断言,您需要将AckbarAssertions.swift
添加到您想要测试的应用和框架目标中。否则,您将需要更新您的代码,以便调用AckbarAssertions.assert
而不是仅仅使用assert
。
如果您选择显式调用AckbarAssertions.assert
,请注意您的崩溃报告可能会受到影响。许多崩溃报告器会将具有类似堆栈跟踪的 '相关' 崩溃汇总在一起,因此堆栈跟踪顶部具有AckbarAssertions.assert
的2个不同崩溃将导致不同的崩溃被汇总到同一崩溃的不同实例中。
我们很高兴您对 Ackbar 感兴趣,并希望看到您能将它引向何方。在提交Pull Request之前,请阅读我们的贡献指南。
谢谢!