AckbarAssertions 1.0.0

AckbarAssertions 1.0.0

测试已测试
语言语言 SwiftSwift
许可协议 Apache 2
发布最新发布2016年6月
SPM支持 SPM

Brian Partridge 维护。



  • Square, Inc.

Ackbar

描述

Swift 的类型系统确保您的函数与正确的类型的对象进行交互,但您仍然需要使用条件语句和断言来验证它们的值。

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

许可证

Apache许可证,版本2.0

贡献

我们对您对Ackbar感兴趣感到高兴,并期待看到您将它在哪里发展。在提交拉取请求之前,请阅读我们的贡献指南

谢谢!