我正在使用gcov/lcov進行googletest單元測試的覆蓋率分析。某些googletest宏的覆蓋率分析顯示,當分散在多行時顯示不完整的覆蓋率 - 爲什麼?
一個反覆出現的問題是,覆蓋率報告在某些googletest宏的測試代碼中顯示未覆蓋的行,當宏分佈在多行時。
我知道gov/lcov不可能比單行更準確,但我對我所看到的行爲感到困惑。有人可以解釋這個嗎?小例子:
#include <gtest/gtest.h>
TEST(coverage,incomplete)
{
// Every second line in every invocation here will show up as uncovered:
EXPECT_NO_THROW(40 +
2);
EXPECT_NO_THROW(40 + 2
);
EXPECT_NO_THROW(40 + 2)
;
}
TEST(coverage,complete)
{
// This test does not show uncovered lines
EXPECT_NO_THROW(40 + 2);
EXPECT_EQ(40
+
2
, // even though this is spread over several lines
42
)
;
}
如何覆蓋分析做:
g++-4.8 -Igtest/googletest/include/ --coverage -o coverage_macropp coverage_macropp.cpp gtest/googletest/make/gtest_main.a -pthread
./coverage_macropp
lcov --capture --directory . --output-file coverage.info
genhtml --demangle-cpp coverage.info --output-directory coverage
在Web瀏覽器的覆蓋率分析會再展線7,9,和11發現:
Line data Source code
1 : #include <gtest/gtest.h>
2 :
3 5 : TEST(coverage,incomplete)
4 : {
5 : // Every second line in every invocation here will show up as uncovered:
6 1 : EXPECT_NO_THROW(40 +
7 0 : 2);
8 1 : EXPECT_NO_THROW(40 + 2
9 0 : );
10 1 : EXPECT_NO_THROW(40 + 2)
11 0 : ;
12 1 : }
13 :
14 5 : TEST(coverage,complete)
15 : {
16 : // This test does not show uncovered lines
17 1 : EXPECT_NO_THROW(40 + 2);
18 1 : EXPECT_EQ(40
19 : +
20 : 2
21 : , // even though this is spread over several lines
22 : 42
23 : )
24 1 : ;
25 4 : }
爲什麼?爲什麼EXPECT_EQ宏不受影響?
這取決於gcov如何分析其輸入,並可能取決於如何定義宏(例如,它們是否粘貼令牌)。所以那兩個地方要尋找解釋。 – Peter