iOS代码覆盖率报告包含不应该在其中的文件

时间:2016-10-04 18:20:01

标签: ios xcode llvm code-coverage xcrun

我有一个包含两个目标的Xcode项目 - 源代码所在的主要目标(让我们称之为CoolApp),以及单元测试的测试目标(让我们称之为CoolAppTests)。我还有一个Git提交挂钩,确保如果项目的总线覆盖率低于某个百分比,我就无法进行更改。

问题是,覆盖率报告不仅包含CoolApp中的文件,还包含CoolAppTests中的文件。因此,当我添加一个新的测试文件时,项目的总线覆盖范围实际上可能 down ,这使得提交钩子变得毫无用处。

要生成覆盖率报告,我将执行以下步骤:

xcodebuild test \
   -project "CoolApp.xcodeproj" \
   -scheme "CoolAppTests" \
   -destination "platform=iOS Simulator,name=iPhone 6,OS=10.0" \
   -configuration Debug \
   -enableCodeCoverage YES

然后通过查找构建设置中的TEMP_ROOT目录(xcodebuild -target CoolAppTests -showBuildSettings)获取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的文件?

1 个答案:

答案 0 :(得分:1)

有趣。我能够通过执行:

来显示关于我的框架的报告
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

我再次只显示了应用中课程的覆盖范围。

我猜你的代码发生了什么,当你构建测试目标时,你告诉它编译你所有的app类以及你的测试类。因此,测试目标将它们视为测试代码的一部分。这是我经常看到的开发人员所做的事情。您的测试目标应该具有该应用程序的目标依赖项,但它不需要再次编译或包含类,即使只运行单元测试。应用程序类将自动可用于测试目的。