代码之家  ›  专栏  ›  技术社区  ›  user23743

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

  •  15
  • user23743  · 技术社区  · 15 年前

    我在10.6上使用的是Xcode 3.2,附带了附带的gcov版本和默认的GCC编译器(两个版本都是4.2.1)。我已经创建了一个独立的Cocoa单元测试包,它被注入到我的应用程序中,并遵循了苹果的文档 setting up a gcov-instrumented build configuration

    当我用这个“Gcov仪器化”配置构建测试包时,应用程序启动,测试被注入并运行。此外,覆盖率统计文件在以下位置生成:

    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覆盖率。我在这里和苹果邮件列表档案中搜索过,没有发现任何人有类似的问题。我想我错过了什么,但那是什么呢?

    5 回复  |  直到 4 年前
        1
  •  10
  •   Quinn Taylor    15 年前

    我不时遇到这个问题。我偶然进入了一段相当长的幸运时间,在我的主要项目中它“大部分都在工作”。我的意思是,我大部分时间都在工作,所以我能够得到保险,但比10.5的时候要痛苦一些。例如,为了获得任何更新,我不得不积极地删除覆盖率文件并重建。即使在我的“勉强工作”状态下,编译器/运行时似乎也不愿意覆盖现有的覆盖率数据文件。

    我想我又回到了一个可行的方案。伏都教是肯定的,但不太理想:

    1. 对项目进行全面清理。

    这是否为您提供了预期的覆盖率数据?

    Cover Story ),我收到如下警告:

    /BUILDRESULTS/MarsEdit.build/Code Coverage/MarsEditDataModelTests.build/Objects normal/i386/MEDataItem.gcno:version'400A',首选'402*'

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

        2
  •  7
  •   user23743 user23743    12 年前

    在Xcode 4.6中,覆盖率报告似乎可以正常工作。为应用程序目标打开“生成测试覆盖率文件”和“仪器程序流”,运行测试,然后将覆盖率工具指向输出。那是在 ~/Library/Developer/Xcode/Derived Data/<Project>-<hash>/Build/Intermediates/<Target>.build/Debug-iphonesimulator/<Target>.build

    This GitHub repository

        3
  •  2
  •   dmaclach    14 年前

    使用GCC4.2.1可以获得代码覆盖率。详情如下:

    SnowLeopardGCov

        4
  •  0
  •   Peter Hosey    14 年前

    我一直在尝试让iPhone模拟器的代码覆盖率工作,并且总是得到0%的覆盖率。下面是我尝试过的配置细节和步骤。

    配置

    应用

    工具书类

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

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

    台阶

    • 启用仪器程序流
    • Info.plist中的UIApplicationExitsOnSuspend标志设置为true

    结果

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

    设置尝试

    1. 设置环境变量:

      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.)
      
    2. GCC优化设置为None(-O0)并取消选中预编译前缀头文件标志。
        5
  •  0
  •   Vanuan tacaswell    13 年前

    推荐文章