我在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
指令,所以我删除它以查看命名空间是否导致了麻烦。此外,我符合attribute
的括号模型以匹配character
,一切都无济于事。
这不是一个关键问题,但我很好奇可能导致此行为的原因以及是否/如何修复它。另外,我想知道我是否应该从覆盖检查中完全切断头文件夹,但我认为这不是一个好习惯。
见解?
编辑看看特拉维斯的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
,它只在日志中出现一次。
如果需要适当的覆盖率报告,则需要在调试模式下运行构建。优化的构建将包含已删除的代码。
gcov
/ lcov
只能通过这些丢失的位来做很多事情,这就是为什么你没有看到标记为覆盖的代码,即使它确实被测试过。