我有一个带有两个目标的 Xcode 项目 - 源代码所在的主要目标(我们称之为 CoolApp),以及单元测试的测试目标(我们称之为 CoolAppTests)。我还有一个 Git 提交 Hook ,可确保如果项目的总行覆盖率低于某个百分比,我将无法提交更改。
问题是覆盖率报告不仅包含 CoolApp 中的文件,还包含 CoolAppTests 中的文件。结果,当我添加一个新的测试文件时,项目的总行覆盖率实际上可能会下降,这使得提交钩子(Hook)变得毫无用处。
要生成覆盖率报告,我将执行以下步骤:
xcodebuild test \
-project "CoolApp.xcodeproj" \
-scheme "CoolAppTests" \
-destination "platform=iOS Simulator,name=iPhone 6,OS=10.0" \
-configuration Debug \
-enableCodeCoverage YES
然后我通过在build设置 (xcodebuild -target CoolAppTests -showBuildSettings) 中查找 TEMP_ROOT 目录来获取 CoolAppTests 的 DerivedData。从那里,我得到/CodeCoverage/Coverage.profdata 和位于/CodeCoverage/Products/Debug-iphonesimulator/CoolAppTests.xctest/CoolAppTests 的二进制文件。
PROFDATA=.../CodeCoverage/Coverage.profdata
BINARY=.../CodeCoverage/Products/Debug-iphonesimulator/CoolAppTests.xctest/CoolAppTests
最后,我生成报告并捕获其输出:
xcrun llvm-cov report -instr-profile "${PROFDATA}" "${BINARY}"
此时,如前所述,报告包含来自 CoolApp 和 CoolAppTests 的文件。
有什么方法可以过滤掉报告中的内容,使其只有我的主要目标 - CoolApp - 而不是来自我的测试目标 CoolAppTests 的文件?
最佳答案
有趣的。通过执行以下操作,我能够在我的框架上显示报告:
xcrun llvm-cov report -instr-profile Coverage.profdata
Products/Debug-iphonesimulator/StoryTeller.framework/StoryTeller
注意我指定了框架的路径。这仅向我展示了框架类。为了显示测试的覆盖率,我必须使用这个:
xcrun llvm-cov report -instr-profile Coverage.profdata
Products/Debug-iphonesimulator/StoryTellerTests.xctest/StoryTellerTests
为了仔细检查这一点,我进入了我正在处理的 Swift 应用程序的派生数据并执行了这个:
xcrun llvm-cov report -instr-profile Coverage.profdata
Products/Debug-iphonesimulator/xxxxxx.app/xxxxxx
同样,我只看到了应用程序中类(class)的覆盖范围。
我猜你的代码是怎么回事,当你构建测试目标时,你告诉它编译你所有的应用程序类以及你的测试类。因此测试目标会将它们视为测试代码的一部分。这是我经常看到开发人员做的事情。您的测试目标应该在它的目标依赖项中有应用程序,但它不需要再次编译或包含类,即使只运行单元测试。应用程序类将自动对其可用以进行测试。
关于iOS 代码覆盖率报告包含不应在其中的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39859206/