2009-04-24 6 views
2

Ich versuche die Testabdeckung zum ersten Mal mit gcov zu messen. Jetzt, da ich die anfängliche Lernkurve hinter mir habe, scheinen die Dinge gut zu laufen, abgesehen von einem kleinen Haken. Ich erwarte, dass es auf mangelndes Verständnis von meiner Seite hinausläuft, also hoffe ich, dass jemand, der mit gcov vertraut ist, erklären kann, was vor sich geht.Warum meldet gcov 0% Deckung in einer Header-Datei für eine gut verwendete Klasse?

Das Problem ist, dass ich eine bestimmte Header-Datei mit 0% Abdeckung haben. Allerdings ist die nur Sache in diesem Header eine Klassendeklaration für eine gut verwendete Klasse.

Darüber hinaus zeigt die Implementierungsdatei für die Klasse 100% Abdeckung, und ich kann auf 5 verschiedene Tests zeigen, wo ich weiß, dass die Klasse erfolgreich instanziiert wird.

Warum sollte gcov 0% Berichterstattung über die Klasse melden, und wie kann ich das beheben?

- bearbeiten -

Wie lacqui unten ausgeführt, wenn der Header keinen ausführbaren Code hat, ist es nicht in Deckung Berechnungen einbezogen werden sollte. Und tatsächlich ist von allen meinen Klassen diese spezielle Header-Datei die einzige, für die gcov Abdeckungsinformationen erzeugt.

Ich habe einen zeilenweisen Vergleich mit den anderen Headern gemacht, und der größte Unterschied, den ich fand, war, dass dieser bestimmte Header keinen expliziten Konstruktor oder Destruktor hat, während die anderen dies tun. In einem Versuch, die Unterschiede zwischen den Dateien zu minimieren, fügte ich einen expliziten ctor und dtor zur Problemklasse hinzu. Dies machte jedoch keinen Unterschied.

+0

können Sie uns den Header zeigen? – user44511

Antwort

3

Es sieht aus wie ich das Problem aussortiert habe. Wie ich es erwartet habe, ist es mehr ein Mangel an Erfahrung, als alles andere.

Es stellte sich heraus, dass gcov nur eine Teilmenge der verfügbaren Trace-Dateien gefunden hat und daher nur einen Teil der Gesamtergebnisse gemeldet hat. Das Suchen und Hinzufügen der restlichen Tracefiles behebt das Problem.

Für alle, die neugierig sind, zeigt die problematische Header-Datei immer noch in der Ausgabe. In der Tat, alle anderen Header-Dateien auch, obwohl sie keinen ausführbaren Code enthalten. Sie alle zeigen jedoch eine Abdeckung von über 90%.

2

Ihre Header-Datei enthält keinen ausgeführten Code. Da nichts ausgeführt wird (es gibt keinen ausgeführten Code in einer Klassendeklaration), gibt es nichts zu messen und nichts zu verbergen.

3

C++ erstellt impliziten Destruktor, auch wenn Sie nicht explizit einen erstellt haben. Wenn Sie Ihr Objekt vor dem Programmende nicht zerstören, wird dieser implizite Destruktor nie aufgerufen. gcov zeigen Sie dies an, indem Sie einen '0'-Zähler in der Zeile der Klassendeklaration markieren.