XCUITest:运行 以协调的方式跨两个应用程序进行测试

XCUITest: Running tests across two apps in a coordinated fashion

我正在考虑使用 XCUITest 对我的 iOS 应用程序进行 UI 测试。看起来 XCUITest 具有广泛的功能,包括与多个应用程序一起工作的能力。但是,多应用程序支持似乎有些有限。

似乎使用 XCUIApplication 我可以使用 Bundle ID 启动另一个应用程序,甚至可以监视它的状态。但是,我想做的是能够 运行 对两个具有紧密交互的应用程序进行协调测试(例如,一个应用程序对另一个应用程序打开 URL,执行一些 UI 操作,然后 returns 到第一个应用程序)。

仅使用 XCUITest 是否可行,还是我需要一些更高级别的工具? (我认为存在一些工具可以做到这一点,但如果可能的话,我更愿意继续使用 XCUI测试)

理想情况下,我会将所有代码放在一个文件中,该文件在两个应用程序中执行 UI 操作。但如果那是不可能的,我愿意编写单独的测试应用程序,这些应用程序可以有效地相互切换,在它们 'turn' 时执行操作。但是我不确定我将如何协调这两个测试应用程序。

这在 Xcode 9 中得到了很好的支持。以下是设置方法:

我发现最简单的方法是创建一个包含您的两个应用程序的工作区。在包含您的 UI 测试代码以执行这两个应用程序的应用程序项目中,确保这两个应用程序都列在您的 UI 测试目标中的目标依赖项下:

现在只需在测试的设置函数中启动这两个应用程序,使用它们的包标识符:

app1 = XCUIApplication(bundleIdentifier: "no.terje.app1.App1")
app1.launch()
app2 = XCUIApplication(bundleIdentifier: "no.terje.app2.App2")
app2.launch()

(应用程序是我测试的实例成员 class、var app1: XCUIApplication!

现在一切准备就绪。 运行 像这样针对两个应用程序进行测试:

func testButtonsExist() {
  app1.activate()
  app1.buttons["mybutton"].exists
  app2.activate()
  app2.buttons["myotherbutton"].exists
}

至于您提到的等待或异步挑战:我想大多数挑战也存在于单个应用程序中的异步代码中,例如等待 URL 打开。但是,post 如果您遇到特定问题,您正在尝试并失败的具体事情。