You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带async的异步测试用例在iOS模拟器中执行时为何挂起?

问题原因与解决方案

你的问题出在async测试方法里混用了老的阻塞式等待API:wait(for:timeout:)会卡住测试线程,而模拟器的并发调度逻辑下,你创建的Task可能需要等待测试线程空闲才能执行,结果两边互相等,形成死锁。真机的调度策略更灵活,所以没触发这个问题。

解决办法(二选一即可)

方法1:用异步版的expectation等待API

把wait(for:timeout:)换成await fulfillment(of:timeout:),这是XCTest专门给async测试方法设计的异步等待接口,不会阻塞线程,能和Task友好配合:

func test_Example() async {
    let exp = expectation(description: "It's the expectation")
        
    Task {
        print("Task says: Hello!")
        exp.fulfill()
    }
        
    await fulfillment(of: [exp], timeout: 600)
}

方法2:直接await Task完成

如果你的场景不需要额外的expectation逻辑,也可以直接等待Task的执行结果,完全不用expectation:

func test_Example() async {
    // 等待Task执行完成
    await Task {
        print("Task says: Hello!")
    }.value
    
    // 这里可以添加断言逻辑
}

内容的提问来源于stack exchange,提问作者MMise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:10:28