gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 04:52:55 26 4
gpt4 key购买 nike

我有一个带有两个目标的 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设置中查找 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 - 而不是我的测试 objective-c oolAppTests 的文件?

最佳答案

有趣的。通过执行以下命令,我能够在我的框架上显示报告:

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

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

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

关于iOS 代码覆盖率报告包含不应该存在的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39859206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com