可以在调用 `XCUIApplication().terminate()` 后阻止 XCode 调用调试器

Posted

技术标签:

【中文标题】可以在调用 `XCUIApplication().terminate()` 后阻止 XCode 调用调试器【英文标题】:Possible to prevent XCode from envoking debugger after calling `XCUIApplication().terminate()` 【发布时间】:2016-04-04 17:26:20 【问题描述】:

我正在使用 UITest 测试一个客观的 C 应用程序,使用 swift 进行测试。

XCode 7.3,模拟 9.3

每个测试用例都会调用 XCUIApplication.launch(),它会通过发送 SIGKILL 来终止任何正在运行的应用程序。

Xcode 将此视为崩溃 - 在 main.m 上调用调试器。要继续测试套件,我只需单击调试器中的继续按钮。

点击继续后,我的日志显示:

Message from debugger: Terminated due to signal 9

这种情况令人沮丧,因为它发生在我 1/4 的测试用例之后。导致我无法专注于正在编辑的文档,并导致我的测试套件挂起,直到我点击继续。

有没有办法解决这个问题?

【问题讨论】:

虽然不是直接解决方案,但您始终可以使用 ⌃⌘Y 关闭断点或删除/禁用异常断点。 @JoeMasilotti 你建议我删除哪个断点? XCode 的断点管理器 (⌘7) 显示“无断点”。这似乎是一种“内置”行为。按照您的建议(⌘Y)禁用系统范围内的断点后的事件,我仍然会在 UITest 重新启动之间频繁地转储到我的调试器中。 你在测试用例后做 tearDown() 吗? @Che - 你不应该这样做,因为如果它已经在运行,launchApp() 会杀死应用程序。但也 - 是的,我已经尝试过了,并没有发现明显的差异。 【参考方案1】:

我们遇到了同样的问题。经过一些调试,我们发现这是由于为您的应用启用了Background Modes

我们的解决方案是为开发和测试制定一个新目标,禁用所有 Background Modes

仅供参考,在您的项目设置的Capabilities 部分中,它被标记为Background Modes,打开这个Off 是关键。或者,您可以从 Info.plist 中删除 Require background modes(又名 UIBackgroundModes)键

【讨论】:

这也修复了 XCUIApplication().launch() “UI 测试失败 - 尝试启动失败”的断言。【参考方案2】:

您可以在终止后使用 xCode 进行调试和/或测试。在菜单中:

    调试 附加到进程 从Likely TargetsBy Process Identifier (PID) 中选择

【讨论】:

以上是关于可以在调用 `XCUIApplication().terminate()` 后阻止 XCode 调用调试器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XCUIApplication 对象访问当前的 SceneDelegate?

如何在 swift UITests 中的 XCUIApplication 中设置暗模式?

无法从 XCTest 中的 XCUIApplication 访问 TextEditor

XCUIApplication 替换 UIATarget captureScreenWithName()

XCUIApplication 的通用点击函数

XCUIApplication().debugDescription 的打印输出正在崩溃 UIAutomated Test XCode 8