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 的 setUp() 中等待多个异步调用