我的应用程序使用位置服务,我有代码可以在禁用位置服务时提醒用户。这有一个按钮,允许他们切换到设置应用程序并启用它。这工作正常,但我想编写一个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秒,但结果是相同的,所以不是没有等待足够长的时间。
没有期望,即代码直接从按下设置按钮到检查断言,断言失败,因为app状态是.runningForeground。我认为执行发生得太快,因此试图等待状态改变。在这种情况下,断言失败,测试结束,然后“Resigning active”出现在控制台中,但不是“Entered background”。
这是Xcode 9上的ios11,在模拟器和物理设备中的行为相同。
总而言之,问题是:以编程方式测试“设置”应用已启动的最佳方式是什么?
答案 0 :(得分:3)
所以看起来我太复杂了!在等待答案的同时,我想我会看到我是否可以检查UI元素是否变为非活动状态或类似情况。那是我发现的时候:
app.wait(for: .runningBackground, timeout: 10)
当达到该状态时返回true!它有效。显然,我不知道现在运行的应用程序是否为“设置”,但它足够好,因为在UI测试中实现该状态的唯一原因是设置URL是否已激活。