如何为自定义 XCTest 断言编写自动化测试?

Posted

技术标签:

【中文标题】如何为自定义 XCTest 断言编写自动化测试?【英文标题】:How can I write automated tests for custom XCTest assertions? 【发布时间】:2016-07-30 14:49:03 【问题描述】:

我正在开发testing framework for ios development。我也希望这个测试框架能够得到很好的测试。问题是,我不知道如何为我的测试目标编写一个测试,断言我的框架正确地导致了失败的测试。如果我创建了一个失败的测试,我又会导致测试失败(我知道,这很混乱)。

考虑一个例子。我的部分框架包括验证特定代码 sn-p 没有任何破坏性约束的功能。

MTKAssertNoBrokenConstraints 
    // UI code that might break some constraints

我已经手动对此进行了测试,以验证当没有破坏的约束时,断言通过,但是当存在破坏的约束时,它正确地将测试标记为失败。

但我需要一种方法来验证 MTKAssertNoBrokenConstraints 是否会将测试标记为失败实际上不会将测试本身标记为失败。

我已经研究过创建一个符合XCTestObservation 的自定义对象,但到目前为止,我只得到了无限递归。我不确定这是否是正确的道路,或者解决无限递归是否真的会让我到达我需要的地方。

【问题讨论】:

这个问题的答案将帮助我解决Issue #2。我将不胜感激这里的答案,解决该问题的请求请求,或两者兼而有之。 【参考方案1】:

以下测试拦截XCTFail("FOO")的失败,然后针对失败执行一些检查。

class TestTheTests: XCTestCase 

    var interceptFailure = false
    var failureCount = 0
    var failureDescription = ""
    var failureFilePath = ""
    var failureLineNumber: UInt = 0
    var failureExpected = false

    override func recordFailureWithDescription(description: String, inFile filePath: String, atLine lineNumber: UInt, expected: Bool) 
        if !interceptFailure 
            super.recordFailureWithDescription(description, inFile: filePath, atLine: lineNumber, expected: expected)
         else 
            failureCount += 1
            failureDescription = description
            failureFilePath = filePath
            failureLineNumber = lineNumber
            failureExpected = expected
        
    

    func testExample() 
        interceptFailure = true
        XCTFail("FOO")
        interceptFailure = false

        XCTAssertEqual(failureCount, 1)
        XCTAssertTrue(failureDescription.hasSuffix("FOO"), "Was \"\(failureDescription)\"")
    


【讨论】:

嗯,这让我有很多事情要做。我将寻找一种更简洁的实现,而不是简单地设置一个标志,但我喜欢这个。

以上是关于如何为自定义 XCTest 断言编写自动化测试?的主要内容,如果未能解决你的问题,请参考以下文章

XCTest 与自定义 UICollectionViewCell

如何为spring数据编写自定义模块

如何为 Presto 编写自定义窗口函数?

如何为复杂对象编写自定义 JSON 解码器?

如何为自定义结构中定义的无序集编写自定义哈希函数?

如何为离子框架编写自定义/自己的插件