4

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

问题是覆盖报告不仅包含 CoolApp 中的文件,还包含 CoolAppTests 中的文件。结果,当我添加一个新的测试文件时,项目的总行覆盖率实际上可能会下降,这使得提交挂钩变得毫无用处。

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

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 的文件?

4

1 回答 1

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

同样,我只看到了应用程序中类的覆盖范围。

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

于 2016-10-07T00:39:30.453 回答