AckbarTesting 1.0.0

AckbarTesting 1.0.0

测试已测试
Lang语言 SwiftSwift
许可证 Apache 2
发布最后发布2016 年 6 月
SPM支持 SPM

Brian Partridge 维护。



  • Square, Inc.

Ackbar

描述

Swift 的类型系统确保你的方法与正确类型的对象交互,但你仍需要使用条件语句和断言来验证它们的值。

你可以测试条件语句,但在此之前,你无法在不崩溃测试运行的情况下测试 Swift 的断言(assertpreconditionfatalError)。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个不同崩溃将导致不同的崩溃被汇总到同一崩溃的不同实例中。

许可

Apache License,版本2.0

贡献

我们很高兴您对 Ackbar 感兴趣,并希望看到您能将它引向何方。在提交Pull Request之前,请阅读我们的贡献指南

谢谢!