gcov/lcov + googletest 创建一个人为的低分支覆盖率报告
gcov/lcov + googletest create an artificially low branch coverage report
首先,我很清楚throws/exceptions引起的“hidden branch”问题。这不是那个。
我观察到的是:
- 我的测试框架 (googletest) 有测试宏(例如
EXPECT_TRUE
)。
- 我使用宏编写通过测试
- 测量分支覆盖率现在渐近线为 50%,因为我没有在通过和失败条件下评估 test.. .
考虑以下几点:
TEST (MyTests, ContrivedTest)
{
EXPECT_TRUE(function_that_always_returns_true());
}
现在假设我在 function_that_always_returns_true()
中完美覆盖了每一行和每个分支,这个分支覆盖报告将渐近 50%(因为 gcov 没有观察到第 3 行在失败条件下评估,故意)
关于这个问题,我唯一的想法是我可以用 LCOV_EXCL_BR_LINE
之类的东西排除求值宏,但这感觉既不符合人体工程学又很老套。
TEST (MyTests, ContrivedTest)
{
bool my_value = function_that_always_returns_true();
EXPECT_TRUE(my_value); //LCOV_EXCL_BR_LINE
}
这不可能是一个小众问题,我不得不相信人们通过 lcov/gcov 成功地使用了 googletest。人们如何解决这个限制?
找了很久之后,我意识到我要过滤掉的所有测试调用都是 EXPECT_*
模式。所以简单地添加:
lcov_excl_br_line=LCOV_EXCL_BR_LINE|EXPECT_*
我的 lcovrc
解决了我的问题
首先,我很清楚throws/exceptions引起的“hidden branch”问题。这不是那个。
我观察到的是:
- 我的测试框架 (googletest) 有测试宏(例如
EXPECT_TRUE
)。 - 我使用宏编写通过测试
- 测量分支覆盖率现在渐近线为 50%,因为我没有在通过和失败条件下评估 test.. .
考虑以下几点:
TEST (MyTests, ContrivedTest)
{
EXPECT_TRUE(function_that_always_returns_true());
}
现在假设我在 function_that_always_returns_true()
中完美覆盖了每一行和每个分支,这个分支覆盖报告将渐近 50%(因为 gcov 没有观察到第 3 行在失败条件下评估,故意)
关于这个问题,我唯一的想法是我可以用 LCOV_EXCL_BR_LINE
之类的东西排除求值宏,但这感觉既不符合人体工程学又很老套。
TEST (MyTests, ContrivedTest)
{
bool my_value = function_that_always_returns_true();
EXPECT_TRUE(my_value); //LCOV_EXCL_BR_LINE
}
这不可能是一个小众问题,我不得不相信人们通过 lcov/gcov 成功地使用了 googletest。人们如何解决这个限制?
找了很久之后,我意识到我要过滤掉的所有测试调用都是 EXPECT_*
模式。所以简单地添加:
lcov_excl_br_line=LCOV_EXCL_BR_LINE|EXPECT_*
我的 lcovrc
解决了我的问题