XCTestCase 异步

Posted

技术标签:

【中文标题】XCTestCase 异步【英文标题】:XCTestCase async 【发布时间】:2018-09-06 04:49:59 【问题描述】:

我在场景中有 XCTestCase

在 XCTestCase 正文中,有一组测试用例。 我只希望所有测试用例在第一个测试用例成功完成后开始的问题(在我的特殊目的中,第一个测试用例响应一个 token 以供其他测试用例使用)。

我不想将参数 token 添加到其他测试用例中。

所以基本上,测试文件看起来像这样

class MyTestCase: XCTestCase 

    var token: String!

    override func setUp() 
        super.setUp()
        self.continueAfterFailure = false
    

    func testGetToken() 
        asyncGetToken  token in
            self.token = token
            // From now, the test1 and test2 should be started.
        
    
    func test1() 
        //using token to make request etc
    

    func test2() 
        //using token to make request etc
    

有人建议简单的解决方案吗?

【问题讨论】:

最好让测试彼此完全独立。这意味着一个测试的行为不应该依赖于另一个测试的结果,并且测试应该能够以任何顺序运行。 如果所有测试都依赖于相同的初始状态并且testGetToken 所做的唯一事情就是设置该状态,那么您可以在测试用例的setUp 中执行此操作(等待异步结果在完成设置之前)。 【参考方案1】:

如 cmets 中所述,您应该将令牌检索移动到 setUp 方法中,这将允许在每次测试之前检索令牌,并保持您的测试彼此独立。

override func setUp() 
    super.setUp()
    self.continueAfterFailure = false

    let tokenExpectation = expectation(description: "get token")
    asyncGetToken  token in
        self.token = token
        tokenExpectation.fulfill()
    
    let result = XCTWaiter().wait(for: [tokenExpectation], timeout: 5)
    XCTAssertEqual(result, .completed)

【讨论】:

请注意,asyncGetToken 是异步的,setUp 很可能会在令牌被检索和分配之前完成。 这种情况下可以使用XCTWaiter来延迟setUp的完成 编辑加入服务员 在主线程上观察到的异步作业需要预期,否则我们将陷入死锁。实际上,我已经这样做了,但我也希望它作为独立测试而不是嵌入到 setUp 函数中。无论如何,感谢您的帮助@Oletha

以上是关于XCTestCase 异步的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XCTestCase 测试异步代码

XCTestCase 使用异步操作设置一次

在 XCTestCase 的 setUp() 中等待多个异步调用

在 XCTestCase 中自动关闭对话框

在位于 XCTestCase 的单独文件中的函数中捕获屏幕截图

ios的单元測试OCUnit以及更新了之后的XCTestCase