从 Xcode 7 的覆盖率统计中排除代码
Posted
技术标签:
【中文标题】从 Xcode 7 的覆盖率统计中排除代码【英文标题】:Excluding code from coverage stats in Xcode 7 【发布时间】:2015-09-22 01:26:48 【问题描述】:我在 Xcode 7.0 和 Objective C (like this) 中启用了代码覆盖率统计,并且运行良好。
是否可以标记一些源代码行以便覆盖率报告忽略它们?如果我使用的是 lcov,那么我可以使用 LCOV_EXCL_START
和 LCOV_EXCL_END
标记(如 How to tell lcov to ignore lines in the source files),但 Xcode 无法识别这些。
Xcode 有替代机制吗?
【问题讨论】:
当我年轻且缺乏经验时,我也这样做过,然后我意识到通过忽略某些部分代码来达到 100% 的覆盖率是徒劳的。不要试图通过忽略代码来播放您的报告。 我能看到的唯一方法是在构建目录中找到Coverage.profdata
文件并更新它时使用测试后操作。可能可以使用 llvm-cov 工具将其导出到 gcov。
@Sulthan 我既不年轻也不缺乏经验。我想排除诸如断言特定行无法访问之类的行。一目了然地知道函数中的每一条可达行都被覆盖了,而不必检查 Xcode 中的亮红线是否实际上只是一个断言,这是很有价值的。
@Sulthan 我对导出到另一个工具不感兴趣;我以前可以这样做。这个问题的重点是使用Xcode 7中的显示。
这就是我的意思,但是默认情况下没有这样的功能,所以如果你想这样做,你必须更新覆盖文件 - 这是一个二进制文件。因此,这样做的一种方法是将新的 profdata 格式转换为gcov
格式(这是人类可读的并且忽略行,您可以使用智能sed
命令),然后将其转换回profdata
。并让 Xcode 读取更新的文件。唯一的技术问题是 profdata - gcov 转换。
【参考方案1】:
Xcode7 及更高版本 (based on some forum posts),覆盖系统使用 LLVM 的覆盖生成和报告机制,其格式在 http://llvm.org/docs/CoverageMappingFormat.html 中有详细说明。从 Xcode 9 开始,这种格式不支持任何排除行(或其他结构)的方法。
生成的映射由llvm-cov 导出为可使用的格式(txt 或 html),这也没有太多的排除机制。 llvm-cov does 有一些简单的阈值,仅报告线路和区域的“大于”或“小于”覆盖率,但我怀疑这并不完全是基于问题的你所追求的以上。
【讨论】:
我很欣赏这个答案,即使它不令人满意。强烈鼓励开发人员将 Guard 语句和其他检查放入代码中,在正常操作下不应调用这些语句。这意味着,我们鼓励在其中放置永远不会被覆盖的代码行。以上是关于从 Xcode 7 的覆盖率统计中排除代码的主要内容,如果未能解决你的问题,请参考以下文章