【问题标题】:IOS UI Testing: How do I determine if the app under test switched to Settings App?IOS UI测试:如何判断被测应用是否切换到设置应用?
【发布时间】:2017-10-10 10:23:34
【问题描述】:

我的应用程序使用定位服务,如果定位服务被禁用,我有代码提醒用户。这有一个按钮,允许他们切换到设置应用程序并启用它。这工作正常,但如果可能的话,我想编写一个检测它的 UI 测试。

目前,我的 UI 测试工作正常,检查出现的警报以及它是否有一个设置按钮。当点击按钮时,我可以通过模拟器或物理设备确认应用程序切换到设置。

我不确定我是否可以通过 UITest 判断设置应用程序本身是否出现(这很好!)但我可以检查被测应用程序是否进入了后台(这已经足够了!)

在我的 AppDelegate 中,我有打印语句确认应用程序正在通过 applicationWillResignActive(...) 和 applicationDidEnterBackground(...)

我尝试了以下方法:

let predicate = NSPredicate(format: "self.state = XCUIApplication.State.runningBackground", argumentArray: nil)

_ = self.expectation(for: predicate, evaluatedWith: app, handler: nil)
waitForExpectations(timeout: 10.0, handler: nil)

XCTAssertTrue(app.state == .runningBackground, "Doesn't look like the Settings App was launched")

并且控制台正在标记它正在等待期望 - 它每秒记录一次。请注意,“app”是我在测试中使用的 XCUIApplication() 的实例。最终,期望超时并且测试终止,因为它没有被满足。那时,我的两个打印语句(退出活动,进入背景)出现在控制台上。

我的应用似乎按预期工作,但预期并不能确定应用状态的变化。我尝试将等待时间设置为 60 秒,但结果是一样的,所以这不是等待时间不够长的情况。

不出所料,即代码直接从按下设置按钮到检查断言,断言失败,因为应用程序状态为 .runningForeground。我认为执行发生得太快了,因此尝试等待状态更改。在这种情况下,断言失败,测试完成,然后控制台中出现“Resigning active”,而不是“Entered background”。

这是 Xcode 9 上的 ios11,在模拟器和物理设备中的行为是相同的。

总而言之,问题是:以编程方式测试“设置”应用已启动的最佳方法是什么?

【问题讨论】:

    标签: ios11 xcode-ui-testing xcode9


    【解决方案1】:

    所以看起来我过于复杂了!在等待答案的同时,我想看看是否可以检查 UI 元素是否变为非活动状态或类似情况。这时候我才发现:

    app.wait(for: .runningBackground, timeout: 10)
    

    当达到该状态时返回 true!它有效。显然,我不知道现在运行的应用程序是否是设置,但它已经足够好了,因为在 UI 测试中实现该状态的唯一原因是设置 URL 是否已激活。

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 2015-11-26
      • 2015-11-24
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      相关资源
      最近更新 更多