Ich verwende gcov/lcov für Coverage-Analyse von googletest-Unit-Tests.Coverage-Analyse einiger googletest-Makros zeigt unvollständige Abdeckung, wenn über mehrere Zeilen verteilt - warum?
Ein wiederkehrendes Problem ist, dass der Coverage-Bericht nicht aufgedeckte Zeilen im Testcode für einige googletest-Makros zeigt, wenn das Makro über mehrere Zeilen verteilt ist.
Ich weiß, dass gov/lcov nicht genauer als eine einzige Zeile sein kann, aber ich bin verwirrt über das Verhalten, das ich sehe. Kann jemand das erklären? Minimal Beispiel:
#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
)
;
}
Wie Coverage-Analyse durchgeführt wurde:
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
Die Coverage-Analyse im Web-Browser dann 7 Zeilen zeigen, 9 und 11 als aufgedeckt:
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 : }
Warum? Und warum ist das EXPECT_EQ-Makro nicht betroffen?
Es hängt davon ab, wie gcov seine Eingaben analysiert und möglicherweise wie die Makros definiert sind (zum Beispiel, ob sie Token einfügen oder nicht). Das sind also zwei Orte, an denen man nach Erklärungen suchen kann. – Peter