2015-06-14 11 views
18

Bei einem Projekt führe ich die Testfälle auf drei verschiedenen ausführbaren Dateien aus, die mit verschiedenen Optionen kompiliert wurden. Abhängig von den Optionen werden einige Codepfade übernommen oder nicht. Im Moment verwende ich nur die Coverage-Daten von einer ausführbaren Datei.Ist es möglich, Coverage-Daten von zwei ausführbaren Dateien mit gcov/gcovr zusammenzuführen?

ich gcovr bin mit einem XML zu erzeugen, die dann durch Sonar analysiert wird:

gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml 

Ich habe drei Sätze von gcda und gcno Dateien, aber ich weiß nicht, wie ein globalen Bericht zu erzeugen, Sie.

Gibt es eine Möglichkeit, das zu tun?

+0

lcov macht das. Vielleicht kann jemand aus dem lcov-Projekt helfen. – k0n3ru

+0

@ k0n3ru, lcov Daten in einigen Zwischenformat zusammenführen. – Gluttton

+0

Das Problem mit lcov ist, dass ich das XML-Cobertura-Format nicht mehr habe. –

Antwort

1

Angenommen, dass mit "mit verschiedenen Optionen kompiliert" meinten Sie, dass Sie so kompilieren, dass Sie nach der Vorverarbeitung verschiedene Ausgaben erhalten, mit der Hilfe von LCOV (wie von k0n3ru erwähnt) konnte ich es tun. Hier ist der Beispielcode in der Datei sut.c:

#include "sut.h" 
#include <limits.h> 

int foo(int a) { 
#if defined(ADD) 
    a += 42; 
#endif 
#if defined(SUB) 
    a -= 42; 
#endif 
    return a; 
} 

mit sut.h nur die Deklaration von foo bietet und eine einfache Haupt in test.c, die foo aufruft und druckt die Ergebnisse. Dann mit dieser Folge von Befehlen konnte ich eine total.info Datei mit 100% Abdeckung für sut.c erstellen:

> g++ --coverage -DADD test.c sut.c -o add.out 
> ./add.out 
> lcov -c -d . -o add.info # save data from .gdda/.gcno into add.info 
> g++ --coverage -DSUB test.c sut.c -o sub.out 
> ./sub.out 
> lcov -c -d . -o sub.info # save again, this time into sub.info 
> lcov -a add.info -a sub.info -o total.info # combine them into total.info 
> genhtml total.info 

die dann für sut.c zeigt folgende Ergebnisse:

enter image description here

EDIT (Danke an Gluttton für die Erinnerung an diesen Teil): Von der total.info-Datei im lcov-Format zur Cobertura-XML-Ausgabe sollte dann mit Hilfe des hier bereitgestellten "lcov to cobertura XML-Konverters" möglich sein (obwohl ich das nicht versucht habe): https://github.com/eriwen/lcov-to-cobertura-xml

Die Tatsache, dass die Zusammenführung von Coverage-Informationen möglich ist, bedeutet jedoch nicht, dass dies eine gute Idee ist: Coverage, IMO, hat nur einen begrenzten Aussagewert hinsichtlich der Qualität einer Testsuite. Durch das Zusammenführen von Coverage-Ergebnissen von verschiedenen Präprozessor-Ausgaben wird dieser Wert noch weiter verringert.

Das ist, weil die Möglichkeiten für Entwickler, über Szenarien zu lernen, die sie nicht berücksichtigt haben, reduziert werden: Durch die bedingte Kompilierung können die Kontrollstruktur und der Datenfluss des Codes zwischen den Präprozessor-Ausgaben enorm variieren - Coverage-Informationen, die sich aus Overlaying ergeben Die Ergebnisse von Testläufen für verschiedene Präprozessorausgaben können eine sinnvolle Interpretation der Ergebnisse unmöglich machen.

+0

Wie konvertiert man den Bericht von 'html' nach' xml' (Cobertura)? – Gluttton

+0

Sie würden das .info-Format von lcov lieber direkt in cobertura konvertieren. Eine Google-Suche brachte mich hierher: https: // github.com/eriwen/lcov-zu-cobertura-xml –

+0

Danke. Ich habe gerade versucht und es funktioniert tatsächlich zum Zusammenführen der GCOV-Daten, aber ich habe keinen guten Weg gefunden, die LCOV-Daten in cobertura zu konvertieren. Ich habe versucht, die genannten Tools, aber es wirft eine Menge Informationen weg, es gibt keine Brancheninformationen in der generierten XML. –