XCUI中setUpWithError未等待异步函数执行完成如何解决?
解决XCTest setUpWithError中异步函数执行顺序问题
你的问题可以通过XCTest原生支持的异步setUpWithError写法彻底解决,不用再依赖容易出问题的XCTestExpectation配合Task的方式。
修改后的代码如下:
override func setUpWithError() async throws { // 按顺序等待两个异步函数执行完成 try await function1() try await function2() // 所有异步操作完成后,再执行同步函数 synchronousFunction() }
为什么原来的写法会出问题?
虽然理论上wait(for:timeout:)会阻塞到预期被触发,但Task的调度存在不确定因素,再加上如果function1或function2内部有未处理的异步逻辑错误,可能导致预期永远无法被正确标记为完成。而改用异步版本的setUpWithError后,代码会严格按照await的顺序执行,确保前一个异步操作彻底完成后才会执行下一行,完全避免了顺序混乱的问题。
如果你的项目还在使用低于Xcode 13的版本,必须用XCTestExpectation的话,要确保异步函数的错误被正确处理,避免预期无法触发:
override func setUpWithError() throws { let expectation = XCTestExpectation(description: "Setup") Task { do { try await function1() try await function2() } catch { XCTFail("Setup failed with error: \(error)") } expectation.fulfill() } wait(for: [expectation], timeout: defaultTimeout) synchronousFunction() }
不过还是优先推荐async/await的写法,代码更简洁直观,也不容易出错。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

