J'utilise gcov/lcov pour l'analyse de couverture des tests unitaires googletest.L'analyse de couverture de certaines macros googletest montre une couverture incomplète lorsqu'il est réparti sur plusieurs lignes - pourquoi?
Un problème récurrent est que le rapport de couverture montre des lignes non couvertes dans le code de test pour certaines macros googletest lorsque la macro est répartie sur plusieurs lignes.
Je sais gov/lcov ne peut pas être plus précis qu'une seule ligne, mais je suis intrigué par le comportement que je vois. Quelqu'un peut-il expliquer cela? exemple minimal:
#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
)
;
}
Comment l'analyse de couverture a été réalisée:
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
L'analyse de la couverture dans le navigateur Web affichera alors les lignes 7, 9 et 11 non couverte:
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 : }
Pourquoi? Et pourquoi la macro EXPECT_EQ n'est-elle pas affectée?
Cela dépend de la manière dont gcov analyse réellement ses entrées, et éventuellement de la façon dont les macros sont définies (par exemple, elles collent ou non des jetons). Donc, ce sont deux endroits où chercher une explication. – Peter