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

时间:2009-09-06 12:30:47

标签: cocoa xcode code-coverage ocunit gcov

我在10.6上使用Xcode 3.2,附带了gcov和默认GCC编译器(版本4.2.1)的版本。我创建了一个依赖的Cocoa单元测试包,它被注入我的应用程序,并在setting up a gcov-instrumented build configuration上遵循Apple的文档 - 基于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邮件列表档案中搜索过,找不到有类似问题的人。我希望我错过了什么 - 但它是什么?

5 个答案:

答案 0 :(得分:10)

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

我想我已经绊倒了一个工作场景。 Voodoo肯定,不太理想:

  1. 确保SDK为10.6。
  2. 确保部署设置为gcc 4.0(!)。
  3. 彻底清理项目。
  4. 重建。
  5. 这能否为您提供预期的覆盖率数据?

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

    另一条线索:当我观察覆盖率数据时(使用Google的Cover Story),我收到警告:

      

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

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

答案 1 :(得分:7)

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

This GitHub repository包含可以自动发现输出并让lcov可视化的脚本;我现在对CoverStory很满意。

答案 2 :(得分:2)

您可以使用gcc 4.2.1获取代码覆盖率。详情如下:

SnowLeopardGCov

答案 3 :(得分:0)

我一直在尝试让代码覆盖率适用于iPhone模拟器,并始终获得0%的覆盖率。以下是配置详细信息和我尝试过的步骤。

<强>配置

Xcode 3.2.5 / iOS 4.1和iOS 4.2 / Mac 10.6 / GCC 4.2 应用 UICatalog

<强>参考

http://www.cubiclemuses.com/cm/articles/2009/05/14/coverstory-on-the-iphone/

http://developer.apple.com/library/mac/#qa/qa2007/qa1514.html

<强>步骤

  • 启用“生成测试覆盖率文件”
  • 启用“仪器程序流程”
  • 将“-lgcov”添加到“其他链接标志”
  • Info.plist中的UIApplicationExitsOnSuspend标志设置为true

<强>结果

我生成了.gcda文件,但覆盖率始终显示为0%。

设置已尝试

  1. 将GCC更改为4.0和4.2。当我尝试将GCC更改为4.0时,我得到26个构建错误。
  2. 设置环境变量:

    const char *prefix = "GCOV_PREFIX";
    const char *prefixValue = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] cStringUsingEncoding:NSASCIIStringEncoding]; // This gets the filepath to the app's Documents directory
    const char *prefixStrip = "GCOV_PREFIX_STRIP";
    const char *prefixStripValue = "1";
    setenv(prefix, prefixValue, 1); // This sets an environment variable which tells gcov where to put the .gcda files.
    setenv(prefixStrip, prefixStripValue, 1); // This tells gcov to strip the default prefix, and use the filepath that we just declared.)
    
  3. GCC Optimization设置为None(-O0)并取消选中预编译的前缀头文件标志。

答案 4 :(得分:0)

当静态库的* .gcno文件被共享库的文件覆盖时,我得到的覆盖率为0。