为什么gcov没有报告我的单元测试所涵盖的任何行?

15 xcode cocoa code-coverage ocunit gcov

我在10.6上使用Xcode 3.2,带有gcov的发布版本和默认的GCC编译器(版本4.2.1).我已经创建了一个依赖的Cocoa单元测试包,它被注入到我的应用程序中,并遵循Apple的文档来设置基于gcov检测的构建配置 - 基于Debug配置,该配置没有启用任何编译器优化.

当我使用这种'Gcov-instrumented'配置构建测试包时,应用程序启动并注入并运行测试.覆盖统计文件也是在以下位置生成的:

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcda

build/<AppTarget>.build/Gcov-instrumented/<AppTarget>.build/Objects-normal/x86_64/<object>.gcno

到现在为止还挺好.我知道测试确实在运行,因为如果我插入失败,那么测试套件会按预期失败.不幸的是,gcov报告测试中没有涉及任何对象线!每行报告为0覆盖.我在这里和Apple邮件列表档案中搜索过,找不到有类似问题的人.我希望我错过了什么 - 但它是什么?

dan*_*ass 10

我一直在间接地遇到这个问题.我偶然发现了一段很长的幸运时间,在我的主项目中它"大部分都在工作".通过大多数工作我的意思是我能够得到报道,但比10.5更痛苦.例如,我必须积极地删除覆盖文件并重建以获得任何更新.即使在我的"几乎不工作"状态下,编译器/运行时似乎也不愿意覆盖现有的覆盖数据文件.

我想我已经偶然发现了一个工作场景.Voodoo肯定,不太理想:

  1. 确保SDK是10.6.
  2. 确保将部署设置为gcc 4.0(!).
  3. 彻底清理项目.
  4. 重建.

这是否可以获得预期的覆盖率数据?

当然,我希望能够生成使用gcc 4.2或其中一个LLVM编译器工作的覆盖文件,但目前这似乎让我比以前略显瘫痪.

另一条线索:当我观察覆盖率数据时(使用谷歌的封面故事),我收到如下警告:

/BUILDRESULTS/MarsEdit.build/Code Coverage/MarsEditDataModelTests.build/Objects-normal/i386/MEDataItem.gcno:版本'400A',更喜欢'402*'

但仍然提供了覆盖范围信息.因此,似乎它正在使用较旧的覆盖格式版本,但如果我使用较新的编译器(4.2)可能会生成较新的格式.gcno文件,那么0%的覆盖率问题就像格雷厄姆一样困扰着我.


小智 7

在Xcode 4.6中,覆盖率报告似乎有效.为应用目标启用"生成测试覆盖率文件"和"仪器程序流程",运行测试,然后将覆盖率工具指向输出.那是在~/Library/Developer/Xcode/Derived Data/<Project>-<hash>/Build/Intermediates/<Target>.build/Debug-iphonesimulator/<Target>.build; 在CoverStory中打开该文件夹会向我显示我期望的结果.

这个GitHub存储库包含的脚本可以自动发现输出并让lcov可视化它; 我现在对CoverStory很满意.