【问题标题】:Does it make any sense to test assertions?测试断言有意义吗?
【发布时间】:2018-07-03 20:06:16
【问题描述】:

我现在拥有的应用程序源代码(ObjC),有时使用 NSAssert(像许多其他程序一样)。

我看到一个单元测试正在测试使用 XCTAssertThrows 调用断言。

从 TDD 的角度来看,测试断言是否正确?

除此之外,如果我在测试时使用调试器,它会一直在这些断言中停止,这很烦人。如果我使用 NS_BLOCK_ASSERTIONS=1 我会解决这个问题,但显然不会再工作并且这些测试会失败。

任何关于如何管理的线索?

【问题讨论】:

    标签: xcode unit-testing tdd xctest xcode-debugger


    【解决方案1】:

    如果我误解了你的问题,请原谅我;请多多包涵。

    XCTAssertThrowsError 用于断言正在抛出异常。将它用于预期异常的测试,例如:

    func test_Divide_GivenADivisorOfZero_ThrowDivideByZeroException() 
    {
       let subject = Mathematician()
       // test passes if the exception is thrown; otherwise it fails
       XCTAssertThrowsError(try subject.Divide(5, 0))
    }
    

    如果我误解了你的问题,请告诉我,我会修改答案。

    【讨论】:

    • "用于断言抛出异常" 不,不是测试异常,是测试断言。而且在发布代码中你根本没有断言,所以如果你测试发布版本,测试就会失败。
    • @Ricardo 从技术上讲,当未发生预期结果时,断言会产生特殊解释的“断言异常”。没有任何断言异常 = 通过测试。在测试您的实现是否正确抛出异常时,您可以使用专门的断言方法来捕获并吞下预期的异常。
    【解决方案2】:

    如果遵循纯 TTD 风格,您将对断言进行测试,否则您不会一开始就编写它 - 即编写最少的代码来通过测试。

    断言无疑是对错误条件的响应,并且通过拥有它,如果它被触发,您不想在断言之后执行代码。

    也许考虑用这些术语来决定 - 如果没有对其进行测试,有人可以删除断言并且构建不会中断(没有测试失败),那么在断言之后执行代码的后果是什么错误情况?

    我建议如果您出于特定原因需要断言,请对其进行测试。

    【讨论】:

    • 感谢您的回复。测试将在发布版本中删除的代码是否有意义? (关于这种情况,没有特别的理由有这个断言,但它不是我的代码)
    • 断言可以在发布时剥离或保留,具体取决于您使用的内容。我会对保留的任何内容进行TDD。剥离的代码只是为了防止编程错误;我不会对此进行测试,因为它只是一个工具,而不是一个要求。
    猜你喜欢
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2020-02-11
    相关资源
    最近更新 更多