可以在调用 `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 Targets
或By Process Identifier (PID)
中选择
【讨论】:
以上是关于可以在调用 `XCUIApplication().terminate()` 后阻止 XCode 调用调试器的主要内容,如果未能解决你的问题,请参考以下文章
如何从 XCUIApplication 对象访问当前的 SceneDelegate?
如何在 swift UITests 中的 XCUIApplication 中设置暗模式?
无法从 XCTest 中的 XCUIApplication 访问 TextEditor
XCUIApplication 替换 UIATarget captureScreenWithName()
XCUIApplication().debugDescription 的打印输出正在崩溃 UIAutomated Test XCode 8