XCTestCase:等待应用空闲

Posted

技术标签:

【中文标题】XCTestCase:等待应用空闲【英文标题】:XCTestCase: Wait for app to idle 【发布时间】:2015-11-10 07:12:29 【问题描述】:

我的 UI 测试失败,因为测试无休止地等待,直到应用空闲。我看不到后台发生了什么,比如加载微调器。

它只出现在一个标签上。所有其他选项卡都是可点击的,但屏幕 3 上的测试失败。我在屏幕 3 上捕获测试后单击另一个选项卡,测试继续并成功完成。

有什么想法吗?

- (void)testExample


    XCUIElementQuery* tabBarsQuery = self.app.tabBars;

    [tabBarsQuery.buttons[@"Screen2"] tap];
    [tabBarsQuery.buttons[@"Screen3"] tap];
    [tabBarsQuery.buttons[@"Screen1"] tap];
    [tabBarsQuery.buttons[@"Screen4"] tap];


【问题讨论】:

【参考方案1】:

也许您有一些动画或其他一些后台(或前台)活动,它们经常在主线程上更新您的 UI。这会导致应用程序永远不会“停顿” - 至少在此选项卡上。在我们的应用程序中,我们有带有重复选项的 UIView 动画。 CPU 使用率很好,也没有消耗电池,但每次测试都失败了。禁用动画解决了这个问题。我找不到强制测试不等待空闲的方法,所以我们最终禁用了动画使用#ifdef for UI test target使用运行时参数,如下所述:https://***.com/a/33466038/168996

【讨论】:

很奇怪。必须有一种方法可以强制测试过程忽略动画......动画在应用程序中很正常,不是吗?动画对测试流程没有任何意义。仅仅因为某物在移动并不意味着在 UI 中不能点击另一个按钮。 也许这只是早期版本中 XCTest 的一个错误。我不是 100% 确定,但我认为这现在工作正常,即有一个重复的动画,但它并没有通过测试。【参考方案2】:
let tabBarsQuery = self.app.tabBars
let button = tabBarsQuery.buttons[@"Screen2"]

在编写 UI 测试用例时,系统需要时间使其可点击,因此我们正在为其创建谓词并等待按钮。

let predicate = NSPredicate(format: "isHittable == 1") expectation(for: 
predicate, evaluatedWith: button, handler: nil)
waitForExpectations(timeout:10, handler: nil)
button.tap()

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请编辑您的答案以添加解释并说明适用的限制和假设。

以上是关于XCTestCase:等待应用空闲的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XCTestCase 中测试 NSPersistentDocument?

在 XCTestCase 中自动关闭对话框

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

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

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

XCUITest 等待未经测试的应用程序达到空闲状态