XCTest UI测试无法正常测量CPU及内存占用问题咨询
问题解答
1 正确获取UI测试中内存/CPU占用数据的方法
你遇到的传入app参数无指标数据、不传参数数值错误的问题,是XCTest UI性能测试的常见配置问题,按以下步骤调整即可解决:
- 提前完成App预启动:不要在measure测量块内才首次触发App启动,否则指标采集器无法正常绑定到主App进程,导致无数据输出。需要在测试的前置方法中完成App启动操作:
let app = XCUIApplication() override func setUpWithError() throws { continueAfterFailure = false // 测试启动前提前拉起主App,保证测量块执行时App已处于稳定运行状态 app.launch() }
- 调整测量块逻辑,避免非业务操作被统计:注意不要把页面过渡动画、返回操作等无关逻辑纳入测量区间,同时可以添加等待判断保证页面加载完成后再执行操作,避免干扰指标采集:
// 原方法名存在拼写错误:Memoty应为Memory,不影响功能仅作提示 func testMemoryUsage() { let measureOptions = XCTMeasureOptions() measureOptions.invocationOptions = [.manuallyStop] // 可手动调整迭代次数降低测试耗时,默认值为5次 measureOptions.iterationCount = 3 measure( metrics: [XCTMemoryMetric(application: app), XCTCPUMetric(application: app)], options: measureOptions ) { app.buttons["Listing Page"].tap() // 等待列表页完全加载完成再执行滑动 XCTAssertTrue(collectionView.waitForExistence(timeout: 3)) swipeUp() // 滑动完成立刻停止测量,不要把返回操作纳入统计 stopMeasuring() // 后置恢复操作放在测量逻辑之外执行 tapBack() // 等待回到首页,保证下一次迭代的前置状态正确 XCTAssertTrue(app.buttons["Listing Page"].waitForExistence(timeout: 2)) } } func tapBack() { app.navigationBars.buttons.element(boundBy: 0).tap() } func swipeUp() { collectionView.swipeUp(velocity: .fast) } var collectionView: XCUIElement { app.collectionViews["collectionViewId"] }
- 检查构建设置:如果调整后依然无数据,确认两个配置项:
- 主App target的
Debug Information Format设置为DWARF with dSYM File - Xcode 14及以上版本,需要在测试Scheme的
Test选项卡中勾选Gather performance metrics
- 主App target的
2 双进程问题说明
- 调试时同时出现
ExampleUITests和Example两个进程是完全正常的:UI测试的运行逻辑是ExampleUITests作为控制端进程,负责向系统发送模拟操作指令,Example是被控制的主App进程,两个进程相互独立运行。 - 不传参数的
XCTMemoryMetric()默认统计的是当前测试进程ExampleUITests的内存占用,这也是你之前得到9KB错误结果的原因——测试进程仅负责发指令,本身内存占用极低。只有传入主App的XCUIApplication实例时,才会统计你需要的Example主进程的内存消耗。
内容的提问来源于stack exchange,提问作者Paul T.
相关产品推荐
相关产品推荐

