测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可协议 | Apache 2 |
发布最新发布 | 2016年6月 |
SPM支持 SPM | ✗ |
由 Brian Partridge 维护。
Swift 的类型系统确保您的函数与正确的类型的对象进行交互,但您仍然需要使用条件语句和断言来验证它们的值。
您可以测试条件语句,但在此之前,您无法在没有崩溃测试运行的情况下测试 Swift 的断言(如 assert
, precondition
, fatalError
)。 Ackbar
允许您编写单元测试,以验证您的断言具有测试覆盖范围,并在您期望的时刻触发。
这分为两部分执行
AckbarAssertions
添加到您的应用程序/框架目标。它将在 DEBUG
构建中添加方法来覆盖 Swift 的断言。AckbarTesting
添加到您的测试目标,并使用 assertHitsDebugException
来测试您的断言是否得到强制执行。有关更多详细信息,请参阅下面的 详细设计。
在应用程序/框架的 Podfile 中
pod 'AckbarAssertions'
在测试目标的 Podfile 中
pod 'AckbarTesting'
安装这些 pod
pod install
重要:打开 Ackbar/Assertions/README.swift
,根据说明手动将陷阱集成到应用程序目标中。有关更多详细信息,请参阅 下面的设计部分。
在应用程序/框架中
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断言家族在断言失败时会发送trap信号。我们可以实现信号处理程序,但考虑到下降到mach的复杂性,以及Swift语言正在进行的剧烈变化,我们选择在此时刻不采取此途径。尽管如此,已经有使用信号处理程序来实现此功能的示例。
我们使用CocoaPods进行分发,因为它可以使您轻松将代码添加到项目中。然而,为了使AckbarAssertions中的可测试断言覆盖Swift的断言,您必须将AckbarAssertions.swift
添加到您要测试的应用和框架目标中。否则,您将需要更新您的代码,以便调用AckbarAssertions.assert
而不是仅仅使用assert
。
如果您选择显式调用AckbarAssertions.assert
,请注意您的崩溃报告可能会受到影响。许多崩溃报告程序会根据堆栈跟踪的相似性汇总“相关”崩溃,因此在堆栈跟踪顶部具有AckbarAssertions.assert
的2个不同崩溃将导致不同实例中的不同崩溃汇总。
我们对您对Ackbar感兴趣感到高兴,并期待看到您将它在哪里发展。在提交拉取请求之前,请阅读我们的贡献指南。
谢谢!