Xcode 7 - 代码覆盖数据生成失败
Posted
技术标签:
【中文标题】Xcode 7 - 代码覆盖数据生成失败【英文标题】:Xcode 7 - Code coverage data generation failed 【发布时间】:2015-11-20 08:03:49 【问题描述】:当我运行测试时出现错误:
代码覆盖率数据生成失败。 无法从“UIDevice”检索配置文件数据文件。
在控制台打印警告:
模拟器启动等待 120 秒超时,当前状态为 1。
是什么原因?
【问题讨论】:
找到了解决方案。总是重启你的 mac :-) 有时重启 Xcode 是不够的。 对我来说,重启我的 iPhone 有帮助。 当我遇到这个问题时,删除 Derived Data 文件夹并重建修复它。 在我的情况下,它是设备屏幕锁定的。解锁设备后,它工作得很好。 【参考方案1】:根本原因可能是模拟器故障。模拟器问题很常见,尤其是在首次启动时。
如果成功启动并连接模拟器后仍然出现问题,请发布错误的详细信息。
为了启动模拟器,我经常不得不取消第一次运行(在干净启动 Xcode 之后),然后尝试重新运行几次。
如果这是可重复的,发生在多个项目上,并且在重新启动和清理项目后仍然存在,如果 Stack Overflow 社区无法提供帮助,请考虑向 Apple 提交缺陷。
【讨论】:
你是对的,这是模拟器的问题。我不知道如何解决这个问题。有任何想法吗?我试图在模拟器上运行该应用程序,并且......同样的问题。无法连接。 我能想到的都是关于重试的建议,因为它对我(和我的慢速 Mac)有用。【参考方案2】:我遇到了完全相同的错误并最终让它工作,这些是我采取的步骤。
在清理和删除应用程序后尝试重新启动 Xcode 和模拟器,但始终无效。
然后我按照建议重新启动了 Mac,但还是不行。
然后我选择了一个新设备在模拟器中进行测试,之前使用 5s 并切换到 6,并且成功了。
有趣的是,当我切换到 iPhone 6 模拟器时,它会在运行应用程序和工作之前显示带有加载栏的 Apple 标志。
当切换回 5s 模拟器时,它完全一样,使用 Apple 加载栏,这是它以前没有做过的,然后 5s 工作了。
所以它看起来是一个模拟器问题,并且切换到不同的设备有效。重置内容和设置可能是非工作设备的解决方案。
【讨论】:
我在设备上继续失败,但模拟器确实可以工作 天啊,我再次搜索这个问题,我看到了我的评论。这次我正在测试一个 mac 应用程序,所以我没有什么可以改变设备的。如果我禁用它编译但不执行测试的覆盖率。【参考方案3】:您的一个或多个模拟器卡住了。唯一能解决这个问题的方法是从模拟器菜单中重置模拟器内容和设置。
注意:这将从模拟器中删除所有应用数据。
【讨论】:
【参考方案4】:Cocoapods link_with
方法会导致这个问题!
我在 xcode 7.2 上遇到了完全相同的错误 - 似乎没有多少模拟器或设备重置可以清除它。在完全重建我的 UITest 目标之后,虽然一切正常。在.pbxproj
文件的大量 git diff 中花费了大量时间后,我为我的项目找到了解决方案。我不确定它是否解决了每个看到此错误的人的根本原因,但它确实为我解决了问题。
从“部署目标”下方的项目信息中,“配置”将列出您的应用程序的所有可能配置。展开您尝试运行的配置,您应该会看到所有目标的列表。在我的例子中,cocoapods 自动为 UITest 目标添加了一个基本配置:
在下拉菜单中将此设置为none
。
接下来在左侧的菜单中选择您的 UITest 目标,然后选择 build phases
您将需要删除 check pods manifest.lock
link binary with libraries
emebd pods frameworks
和 copy pods resources
。
最后转到您的 pod 文件并检查是否有提及您的 UITest 目标或目标。就我而言,我一直在我的 podfile 的顶部指定:
platform :ios, '8.4'
use_frameworks!
link_with 'My App', 'My UITesting Target'
pod 'A Pod', '~> 1.0'
相反,podfile 应该列出每个目标的特定依赖项:
platform :ios, '8.4'
use_frameworks!
target 'My App', :exclusive => true do
pod 'A Pod I want to use in my app', '~> 1.0'
end
假设您没有在 UITests 中使用任何 pod,那么目标应该会再次构建而不会出现错误,并且测试将运行!
我对这个问题根源的理解是,每个 UITest 目标都构建了两个单独的包,一个用于应用程序,一个用于 UITest 控制器。不幸的是 cocoapods link_with
逻辑修改了所有指定的目标,以期望它们的包中包含 pods.framework。构建阶段脚本将框架添加到应用程序包而不是 UITest 控制器包,因此当您启动测试时,UITest 控制器包似乎缺少框架并且 xcode 中止安装。
如果您在 UITests 中使用 pod,您应该能够以相同的方式指定它们:
target 'My UITesting Target', :exclusive => true do
pod 'Another Pod I want only for UITesting', '~> 1.0'
end
当您运行 pod install
时,所有内容都应该正确链接。
【讨论】:
验证这一点似乎很有趣。我会告诉你它是否也对我有用【参考方案5】:我解决了这个问题,就像我解决了大多数 XCode 问题一样:
-
删除
DerivedData
中的项目文件(Xcode>Preferences>Locations>DerivedData→
在查找器中跳转)
Product>Clean
(按住 alt 按钮)Product>Clean Build Folder
退出 XCode
重启 XCode
从您的设备/模拟器中删除您的应用
再试一次。 如果它仍然不起作用,请使用另一个模拟器/设备进行几次运行。迟早它会在原来的版本上再次起作用。
【讨论】:
有效答案,解决大部分问题 我无法使用我的设备运行单元测试,但它们在使用模拟器时运行。我遇到了与 OP 相同的错误。这个答案为我解决了这个问题。【参考方案6】:如果您将项目与第 3 方动态框架集成,您可能需要在构建设置中添加路径。查找 ->Build Settings->"Runpath search paths" 并确保它包含框架的路径。
在设置我的项目以使用我的团队一直在研究的框架后,我自己也看到了这个确切的问题。更新此特定设置后,问题就消失了。就我而言,该路径与我必须为“框架搜索路径”设置设置的路径相同。
【讨论】:
【参考方案7】:如果您使用的是可可豆荚,请在 Cocoapods 存储库中查看此线程: https://github.com/CocoaPods/CocoaPods/issues/5385#issuecomment-226269847
这解决了我的问题:
复制@dfleming 回复:
由于某种原因,CocoaPods 似乎没有添加“[CP] Embed Pods Frameworks" 构建阶段到 UI 测试目标时 生成项目工作区。
我手动添加了这个,UI 测试又可以运行了。
此构建阶段应运行以下脚本:(替换 YourProject 与您的项目名称)
"$SRCROOT/Pods/Target Support Files/Pods-YourProjectUITests/Pods-YourProjectUITests-frameworks.sh"
【讨论】:
这可行,但您添加了自定义脚本。您可以将框架添加到目标。这有点冗长,但最后你没有自定义脚本....转到您的 UI 测试目标 > 构建阶段 > 将二进制文件与库链接。这有一个链接到您的 UI 测试目标的框架列表。单击“+”,然后单击提示中的“添加其他”按钮。现在导航到 Pods/Target Supporting Files/Your UI Test Target 并选择“.sh”文件。【参考方案8】:我遇到了同样的问题,但这是由于有一个测试目标并重命名了应用程序的目标。确保您有一个有效的主机应用程序集。
在项目页面选择测试目标 在常规选项卡下应该有一个主机应用程序选择框 选择您要测试的目标【讨论】:
【参考方案9】:发生这种情况的原因之一是测试目标正在测试的主机应用程序未链接到正确的依赖项。例如,如果您正在测试一个框架,请确保主机应用程序链接到这些框架并嵌入。
【讨论】:
【参考方案10】:经过很长时间试图弄清楚这一点,结果我不得不创建一个全新的测试目标。 然后重启设备后问题不再出现。
【讨论】:
【参考方案11】:当您将 Cocoapods 与缺少某些依赖项的框架一起使用时,也会出现此问题。 例如,如果您使用 Framework A,并且此框架依赖于 Framework B,但在 Framework A 的 Podspec 中未声明依赖关系。
【讨论】:
我也遇到了同样的问题!【参考方案12】:我的问题是由于 unittest 目标的部署版本不正确造成的。测试的应用程序部署版本为 7.0,但未自动正确设置单元测试。它设置为 10.0,而我的模拟器版本是 8.4。在构建设置中将 UT 目标的部署版本更改为 8.0,然后所有问题都消失了。
【讨论】:
请注意,我的应用大量使用 cocoapod,但我没有对它做任何单元测试。评论有关 cocoapod 的答案。【参考方案13】:我也遇到了同样的问题:
为不同的项目尝试了以下方法:
1.对于我有一些第三方框架的项目,问题是测试包在运行时找不到框架。对于此更新测试目标的 Runpath Search Paths 构建设置,通过添加 $(PROJECT_DIR)/Frameworks
(假设您将框架保留在该位置)。它解决了我对该项目的问题
您可以在以下位置查找它:
Project file -> Test target -> Build Settings -> Runpath Search Paths
在其他工作区中,当我将测试设备更改为其他模拟器或更改设备本身时。它有帮助。
重启 xcode 或你的 mac 系统。
希望对你有帮助
【讨论】:
【参考方案14】:就我而言,我已将 Swift 文件添加到(直到那时)纯 Objective-C 的框架中。测试包没有里面有任何 Swift 代码。
在我将 Swift 文件添加到测试包后,Xcode 会自动更新一些项目设置并且错误消失了。
您应该将 Swift 文件保留在测试包中,即使它可能不包含任何代码。 Xcode 或 Cocoapods 显然使用测试包中存在的 Swift 文件来确定是否以“快速模式”运行测试。
【讨论】:
【参考方案15】:我尝试了很多这样的解决方案,但都没有成功。我在我的方案测试部分关闭了代码覆盖率选项,这抑制了错误但测试不会运行。然后我注意到 NSLog 控制台中有很多东西。在那里的某个地方,它提到了对我不再使用并尝试加载的框架的引用。
我在应用程序中搜索了它,并且 Build Settings -> Other Linker Flags 试图加载不再存在的框架。
我删除了: -framework 3rd_party_libname
然后测试又开始了。这很令人困惑,但请检查 NSLog 消息。我使用的是 XCode 8.3
【讨论】:
太棒了,谢谢!在所有重新启动和清理都不起作用之后,这为我修复了它。【参考方案16】:迦太基用户:
这发生在我向 Cartfile 添加新框架后。
我运行了 carthage update
,但忘记将 .framework
文件从 Finder 拖到我的应用目标的 Embedded Binaries 部分!
一旦我这样做了,问题就消失了。
(请注意,这是上面@Mustafa 提到的一般问题的具体案例。)
【讨论】:
【参考方案17】:我在 Sierra 10.12.4 上的 Xcode 8.3 上遇到了这个问题
我在我的 Mac 上打开了 Keychain Access 应用程序
几秒钟后,我收到了几个系统弹出窗口,要求我输入密码,以授予对钥匙串项目的权限。
我在弹出窗口中输入了密码,然后我的测试开始工作。
【讨论】:
【参考方案18】:在我的案例中有效的步骤 删除方案并单击管理方案->自动生成方案解决了我的问题。
问题是由在模拟器和钥匙串中安装证书引起的
【讨论】:
【参考方案19】:使用具有多个构建目标和标准编译器的 Xcode 9.1,我们正在进行 UI 测试,我开始看到这个问题。所以,你可能会因为这个答案而讨厌我,我完全希望它会被否决,但这实际上对我有用:我必须从我的机器上完全删除 Xcode 和我的项目才能使这个错误消失。
我尝试了这个线程中的每一个建议,有些尝试了多次,尝试清除缓存文件、删除派生数据、修改构建设置、更新 podfile、清理、每次尝试后重建、清理模拟器、手动重新创建模拟器管理设备”。经过数小时的挫折之后,为什么这台机器无法构建我们的 UI 测试仍然是一个完全的谜。它似乎在其他机器和我们的 CI 上运行良好。除了这个线程中的项目,我手动修改了 pbxproj 文件,将所有与代码覆盖率相关的选项设置为“NO”。
最后,我离重新格式化整台机器只有一步之遥。我决定按照这里的建议完全删除 Xcode:***: How to completely uninstall Xcode。
具体来说,我删除了我们的工作区,退出所有程序,删除所有列出的文件,从模拟器中清除内容和设置,删除模拟器,关闭机器 20 分钟,回来,重新安装 Xcode,克隆存储库,瞧!没有错误。
希望能为某人解决问题。这是“核”选项,你永远不应该这样做,但就像我说的,这是唯一对我有用的东西。
【讨论】:
以上是关于Xcode 7 - 代码覆盖数据生成失败的主要内容,如果未能解决你的问题,请参考以下文章
更新到 Xcode 7 Beta 5 并收到此错误:失败,退出代码 6
制作新的Xcode方案时,“generate-pch命令失败,退出代码为1”
Xcode 11 Beta 7 命令 PhaseScriptExecution 失败,退出代码非零([CP] Copy Pods Resources)
由于“链接器命令失败,退出代码为 1(使用 -v 查看调用)”,无法在 El Capitan 上为 Xcode 7 项目构建开发分支