【问题标题】:Why does gcov report 0% coverage on a header file for a well used class?为什么 gcov 报告一个使用良好的类的头文件覆盖率为 0%?
【发布时间】:2010-10-21 12:39:01
【问题描述】:

我第一次尝试使用gcov 测量测试覆盖率。现在我已经过了最初的学习曲线,事情似乎进展顺利,除了一点点障碍。我希望这归结为我缺乏理解,所以我希望熟悉 gcov 的人可以解释发生了什么。

问题是我有一个特定的头文件显示 0% 的覆盖率。但是,该标头中的 only 是一个常用类的类声明。

此外,该类的实现文件显示了 100% 的覆盖率,并且我可以指出 5 个不同的测试,在这些测试中我知道该类已成功实例化。

那么为什么 gcov 会报告课程的 0% 覆盖率,我该如何解决呢?

-- 编辑--

正如 lacqui 在下面指出的,如果标头没有可执行代码,则不应将其包含在覆盖率计算中。事实上,在我所有的类中,那个特定的头文件是 gcov 试图为其生成覆盖信息的唯一一个。

我已经与其他头文件进行了逐行比较,我发现最大的不同是这个特定的头文件没有显式的构造函数或析构函数,而其他头文件有。为了尽量减少文件之间的差异,我在问题类中添加了一个显式的 ctor 和 dtor。然而,这并没有什么不同。

【问题讨论】:

    标签: c++ unit-testing code-coverage gcov


    【解决方案1】:

    看来我已经解决了这个问题。正如我所料,这更多的是缺乏经验的问题。

    事实证明,gcov 只找到了可用跟踪文件的一个子集,因此只报告了总结果的一部分。查找并添加其余的跟踪文件解决了这个问题。

    对于任何好奇的人,有问题的头文件仍会显示在输出中。事实上,所有其他头文件也是如此,即使它们不包含可执行代码。但是,它们都显示 90+% 的覆盖率。

    【讨论】:

      【解决方案2】:

      C++ 会创建隐式析构函数,即使您没有显式创建析构函数。 如果您在程序结束之前不销毁对象,则永远不会调用此隐式析构函数。 gcov 通过在类声明行上标记一个“0”计数器来显示这一点。

      【讨论】:

        【解决方案3】:

        您的头文件不包含已执行的代码。由于没有执行任何操作(类声明中没有执行的代码),因此无需测量,也无需覆盖。

        【讨论】:

          猜你喜欢
          • 2012-09-16
          • 2021-09-05
          • 1970-01-01
          • 1970-01-01
          • 2019-09-14
          • 1970-01-01
          • 2015-04-09
          • 1970-01-01
          • 2011-03-01
          相关资源
          最近更新 更多