首页 > 解决方案 > 标记为未涵盖的类定义

问题描述

我在 Qt 中为个人(开源)项目设置了 Codecov。该项目仍然主要是一个存根(几乎没有几个类,到目前为止我试图实现 100% 的覆盖率。但是,查看 Codecov 报告中这两个类的标题,一个被视为已覆盖,另一个是不是,即使它们都有单元测试并且它们都通过了。

属性覆盖失败

角色覆盖通行证

我在 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在属性测试中使用了一个指令,所以我删除了它以查看命名空间是否引起了麻烦。另外,我符合括号模型attributeto match character,都无济于事。

这不是一个关键问题,但我很好奇可能导致这种行为的原因以及是否/如何修复它。另外,我想知道我是否应该从覆盖检查中完全切断 headers 文件夹,但我认为这不是一个好习惯。

洞察力?

编辑查看 Travis 上的 Codecov 输出,我发现attribute.h. 第一个显示以下信息:

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仅在日志中出现一次。

标签: c++qtcode-coveragecatch-unit-testcodecov

解决方案


如果你想要一个正确的覆盖率报告,你需要在调试模式下运行你的构建。优化的构建将包含已删除的代码。

gcov/lcov只能用这些缺失的位做这么多,这就是为什么即使确实经过测试,您也看不到标记为已覆盖的代码。


推荐阅读