【发布时间】: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