【问题标题】:iOS code coverage report contains files that shouldn't be in thereiOS 代码覆盖率报告包含不应该存在的文件
【发布时间】:2016-10-04 18:20:01
【问题描述】:

我有一个带有两个目标的 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 目录来获取 CoolAppTests 的 DerivedData(xcodebuild -target CoolAppTests -showBuildSettings)。从那里,我得到 /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 的文件?

【问题讨论】:

    标签: ios xcode llvm code-coverage xcrun


    【解决方案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
    

    再一次,我只看到了应用程序中类的覆盖范围。

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

    【讨论】:

    • 几个问题:1)您是否为您的框架目标、您的测试目标或两者都启用了覆盖; 2) 如果构建的输出是静态库而不是框架/应用程序,这仍然有效吗?
    • 我已经在所有目标上启用了覆盖支持(我认为这是默认设置)并在方案的测试设置中收集覆盖数据。至于静态库。没有把握。但我认为它会是一样的。您的应用程序类是否包含在编译源构建阶段?如果是这样,请删除它们并重试。
    猜你喜欢
    • 2022-09-27
    • 1970-01-01
    • 2020-01-12
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多