类定义标记为未涵盖

时间:2019-03-11 10:55:57

标签: c++ qt code-coverage catch-unit-test codecov

我为Qt中的个人(开源)项目设置了Codecov。该项目仍然大部分是存根(几乎没有几个类,到目前为止,我试图达到100%的覆盖率。但是,从Codecov报告中看这两个类的标题,一个被视为覆盖,另一个是即使两者都进行了单元测试并且都通过了。

Attribute coverage fails

Character coverage passes

我在Catch2中对它们都进行了测试:

#include "../thirdparty/catch/catch.hpp"
#include "character/attributes/attribute.h"

#define TEST_ATTRIBUTE_NAME "test-attribute"
#define TEST_ATTRIBUTE_VALUE 1

TEST_CASE("Attributes")
{
  SECTION("should create new attribute correctly (name constructor)")
  {
    character::attribute sut(TEST_ATTRIBUTE_NAME);
    REQUIRE(QString(TEST_ATTRIBUTE_NAME) == QString(sut));
    REQUIRE(0 == int(sut));
  }

  SECTION("should create new attribute correctly (name and value constructor)")
  {
    character::attribute sut(TEST_ATTRIBUTE_NAME, TEST_ATTRIBUTE_VALUE);
    REQUIRE(QString(TEST_ATTRIBUTE_NAME) == QString(sut));
    REQUIRE(TEST_ATTRIBUTE_VALUE == int(sut));
  }
}

遵循DRY原理,我不会粘贴character::character的测试代码;)

起初,我在属性测试中使用了using character::attribute指令,因此我删除了该指令以查看名称空间是否引起了麻烦。另外,我符合attribute的方括号模型以匹配character,但无济于事。

这不是一个关键问题,但是我很好奇这可能是什么原因以及如何/如何解决此问题。另外,我想知道是否应该从覆盖范围检查中完全删除标头文件夹,但我认为这不是好习惯。

见解?

编辑在Travis的Codecov输出中,我发现attribute.h出现了3次。第一个显示以下信息:

File '.../attributes/attribute.h'
Lines executed:100.00% of 1
No branches
Calls executed:100.00% of 1
Creating '^#...#attributes#attribute.h.gcov'

其他两个事件显示以下内容:

File '.../attributes/attribute.h'
Lines executed:0.00% of 1
No branches
Calls executed:0.00% of 1
Creating '^#...#attributes#attribute.h.gcov'

因此,我怀疑唯一要考虑的实例是最后一个实例,该实例显示出0%的执行,而character.h却只在日志中出现一次。

1 个答案:

答案 0 :(得分:0)

如果要获得适当的覆盖率报告,则需要在调试模式下运行构建。优化的版本将删除一些代码。

gcov / lcov只能对这些丢失的比特做很多事情,这就是为什么即使真正经过测试,您也看不到标记为覆盖的代码的原因。