2009-04-24 4 views
2

Je tente de mesurer la couverture de test pour la première fois en utilisant gcov. Maintenant que je suis passé la courbe d'apprentissage initiale, les choses semblent bien se passer, sauf pour un petit hic. Je m'attends à ce que cela se résume à un manque de compréhension de ma part, alors j'espère que quelqu'un de familier avec gcov peut expliquer ce qui se passe.Pourquoi gcov signale-t-il une couverture de 0% sur un fichier d'en-tête pour une classe bien utilisée?

Le problème est que j'ai un fichier d'en-tête particulier montrant 0% de couverture. Cependant, le seul chose dans cet en-tête est une déclaration de classe pour une classe bien utilisée. En outre, le fichier d'implémentation pour la classe montre une couverture de 100%, et je peux pointer vers 5 tests différents où je sais que la classe est instanciée avec succès.

Alors pourquoi gcov signaler 0% de couverture sur la classe, et comment puis-je résoudre ce problème?

- modifier -

Comme lacqui a souligné ci-dessous, si l'en-tête n'a pas de code exécutable, il ne devrait pas être inclus dans le calcul de la couverture. Et en fait, parmi toutes mes classes, ce fichier d'en-tête particulier est le seul que gcov essaie de générer des informations de couverture. J'ai fait une comparaison ligne par ligne avec les autres en-têtes, et la plus grande différence que j'ai trouvée est que cet en-tête particulier n'a pas de constructeur ou de destructeur explicite, alors que les autres le font. Pour tenter de minimiser les différences entre les fichiers, j'ai ajouté un ctor et un dtor explicites à la classe de problème. Cependant, cela n'a fait aucune différence.

+0

pouvez-vous nous montrer l'en-tête? – user44511

Répondre

3

Il semble que j'ai résolu le problème. Comme je m'y attendais, c'est plutôt un problème de manque d'expérience que tout. Il s'est avéré que gcov ne trouvait qu'un sous-ensemble des fichiers de trace disponibles, et ne rapportait donc qu'une partie des résultats totaux. La recherche et l'ajout du reste des fichiers de trace ont résolu le problème.

Pour tous ceux qui sont curieux, le fichier d'en-tête problématique apparaît toujours dans la sortie. En fait, tous les autres fichiers d'en-tête le sont également, même s'ils ne contiennent aucun code exécutable. Cependant, ils montrent tous 90 +% de couverture.

2

Votre fichier d'en-tête ne contient pas de code exécuté. Puisque rien n'est exécuté (il n'y a pas de code exécuté dans une déclaration de classe), il n'y a rien à mesurer et rien à couvrir.

3

C++ crée un destructeur implicite même si vous n'en avez pas créé explicitement. Si vous ne détruisez pas votre objet avant la fin du programme, ce destructeur implicite ne sera jamais appelé. gcov montre ceci en marquant un compteur '0' sur la ligne de la déclaration de classe.