为啥 XCode 启动应用程序两次以运行 UI 测试?

Posted

技术标签:

【中文标题】为啥 XCode 启动应用程序两次以运行 UI 测试?【英文标题】:Why does XCode start the app twice to run a UI Test?为什么 XCode 启动应用程序两次以运行 UI 测试? 【发布时间】:2017-09-15 09:45:40 【问题描述】:

我正在经历一个相当乏味的过程,让一堆 UI 测试再次工作,但要运行每个测试,看起来 XCode 在模拟器中启动了两次应用程序。一次是无用的,然后是另一次真正运行测试的地方。

我的配置是否有问题导致这种情况发生,或者这种行为是否符合预期?

【问题讨论】:

【参考方案1】:

这是预期的行为。您看到的实际上不是同一个应用启动两次,而是两个不同的应用:

第一个启动是 UITestRunner 应用程序。启动 UITest 时,Xcode 会构建一个与您的应用程序交互的 UITestRunner 应用程序。需要此运行器应用程序,因为 UITests 与单元测试的工作方式不同。

单元测试在您的应用范围内工作。换句话说,他们可以访问您应用的所有代码、变量和状态。因此,在运行单元测试时,只会启动您的应用。

UITests 像用户一样“使用”您的应用。他们无权访问您的应用程序代码。他们所能做的就是使用用户界面与应用程序进行交互。 UITests 在与您的应用程序不同的进程中运行。这就是 UITestRunnerApp 的作用。它合成您的应用程序可以响应的事件。换句话说:UITestRunnerApp 模拟了一个真实的用户。

因此,当启动 UITest 时,您确实会看到两个应用程序正在启动。首先是 UITestRunner 应用程序(将立即发送到后台),然后是你的应用程序。

【讨论】:

测试后 uitestrunner 仍然存在正常吗?这似乎会使模拟器或测试设备变得混乱 @Cyrus 是的,这很正常。但是每个 UITest 目标只有一个 UITestRunner 应用程序,所以应该没有混乱。当您再次运行测试时,旧的 UITestRunner 应用会被覆盖。

以上是关于为啥 XCode 启动应用程序两次以运行 UI 测试?的主要内容,如果未能解决你的问题,请参考以下文章

由于应用重启,XCUITest 需要运行两次才能成功

xcode为啥启动界面不显示

Jason 解码两次以正确匹配模式

为啥 Xcode 将我的所有代码编译两次,导致任何全局变量的链接器错误?

为啥这个 Swift Playground 打印和循环两次?

为啥 UITableView 自定义单元格的第一个单元格总是在 Xcode 中的动作事件上被调用两次