什么会导致启用代码覆盖率的构建失败?

What could cause code coverage enabled builds to fail?

总结

我正在尝试从我的项目中获取代码覆盖率报告。但是,当我尝试构建和 运行 测试时,派生数据文件夹中没有创建 CodeCoverage 文件夹。

我该怎么做?

我运行ning xcodebuild如下:

xcodebuild \ -workspace <some_workspace> \ -scheme <some_scheme> \ -destination <some_destination> \ -derivedDataPath <some_path> \ -enableCodeCoverage YES \ build test

有什么问题?

对于我的 workspace/project 它在最后一行失败:

xcodebuild: error: Failed to build workspace <some_workspace> with scheme <some_scheme>. Reason: Could not determine bundle identifier for <some_test_target>'s TEST_HOST: "<some_path>/Build/Intermediates/CodeCoverage/Products/Debug-iphonesimulator/<some_product>.app"

起初它似乎与 TEST_HOST 问题直接相关,但这里并非如此。

根本就没有CodeCoverage文件夹:

<some_path>/Build/Intermediates/CodeCoverage

我尝试了什么?

我对一个干净的新项目进行了同样的尝试,同样的 运行ning 相同的 xcodebuild 命令,它成功了。 Build/Intermediates/ 文件夹中存在 CodeCoverage 文件夹。

然而,在我自己的项目中,比较复杂,Build/Intermediates/文件夹包含一堆*.build文件夹(与应用程序和各种框架相关,HockeySDK.build用于示例)和 PrecompiledHeaders 但没有 CodeCoverage 文件夹。

查看 xcodebuild 的输出时,我从未看到对我项目的 CodeCoverage 文件夹的引用。但是,对于测试项目,第一次提到是在:

Write auxiliary files /bin/mkdir -p /<some_path>/Build/Intermediates/CodeCoverage/Intermediates/<some_project>.build/Debug-iphonesimulator/<some_project>.build/Objects-normal/x86_64

对于我的项目,我看到:

Write auxiliary files /bin/mkdir -p /<some_path>/Build/Intermediates/<some_project>.build/Debug-iphonesimulator/<some_project>.build/Objects-normal/x86_64

解决方法

似乎 'trick' 它起作用的另一件事是将 Host Application 设置为 None。完成此操作后,它会构建和测试,但由于缺少主机,测试失败。但是,这会导致创建 CodeCoverage 文件夹,如果再次正确设置 Host Application,运行 构建和测试工作正常,并生成代码覆盖率报告。

您必须确保包名称在所有配置中都相同。 Xcode 修改它以防您使用不受支持的字符。例如 Xcode 将“-”替换为“_”。

在所有配置中,转到:

Project -> Build Settings -> Product Module

并设置完全相同的不带空格的名称。