【问题标题】:disable gcov coverage at run-time在运行时禁用 gcov 覆盖
【发布时间】:2016-09-07 11:24:53
【问题描述】:

我正在用 C++ 编写一些测试,并且正在使用 gcov(实际上是 lcov,但我认为这不是重点)来获取有关覆盖率的信息。

有没有办法在运行时禁用信息记录? 例如。 :

bool myTest() {
    ObjectToTest obj;

    /* Enable gcov... */

    obj.FunctionToTest();

    /* ...Disable gcov */

    if(obj.GetStatus() != WHATEVER)
        return false;
    else
        return true;
}

在这种情况下,我希望 gcov 仅将 FunctionToTest 显示为“已覆盖”,但将 ObjectToTest 构造函数和 GetStatus 保留为“未覆盖”。

提前致谢!

【问题讨论】:

  • 不,这不太可能,因为编译器在编译时生成代码时插入生成数据的指令。一旦检测代码在那里,就不可能禁用它。

标签: c++ gcov


【解决方案1】:

不,对于 gcov,我们没有任何此类选项。

我在一些覆盖工具(如 clover)中看到了这样的选项,但它通过直接检测源代码来工作。

除了解决您的问题之外,将这部分代码写入不同的源文件,然后通过包含它在所需的源文件中调用它。
我建议这样做是因为当您稍后使用 LCOV 或 GCOVR 生成覆盖率报告时,它们都提供了通过将指定文件传递给某些开关来从覆盖率报告中排除指定文件的选项。

LCOV:

-r tracefile pattern
   --remove tracefile pattern
          Remove data from tracefile.

GCOVR:

-e EXCLUDE, --exclude=EXCLUDE
                    Exclude data files that match this regular expression

【讨论】:

    【解决方案2】:

    虽然我同意@VikasTawniya 所说的,但您也可以在测试代码中模拟您不喜欢跟踪的功能。

     #ifdev NO_COV
     #include mock.h // mock of obj.FunctionToTest(); does nothing
     #else 
     #include real.h // real implementation of obj.FunctionToTest();
     #endif
    

    现在你的报道结果不会因为obj.FunctionToTest()的电话而被破坏

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-10
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      相关资源
      最近更新 更多