2015-06-14 24 views
18

Su un progetto, sto eseguendo i test case su tre diversi eseguibili, compilati con diverse opzioni. A seconda delle opzioni, alcuni percorsi di codice sono presi o meno. In questo momento, sto solo utilizzando i dati di copertura da un eseguibile.È possibile unire i dati di copertura di due file eseguibili con gcov/gcovr?

sto usando gcovr per generare un XML che viene poi analizzato da Sonar:

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

Ho tre set di GCDA e file GCNO, ma non so come generare un rapporto globale di loro.

C'è un modo per farlo?

+0

lcov fa questo. Quindi potrebbe essere utile qualcuno del progetto lcov. – k0n3ru

+0

@ k0n3ru, lcov unisce i dati in un formato intermedio. – Gluttton

+0

Il problema con lcov è che non ho più il formato XML Cobertura. –

risposta

1

Supponendo che "compilato con diverse opzioni" si intende che si compila in modo da ottenere diversi output dopo la preelaborazione, con l'aiuto di lcov (come menzionato da k0n3ru) che ero in grado di farlo. Ecco il codice di esempio nel file di 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; 
} 

con sut.h fornendo solo la dichiarazione di foo, e una semplice principale test.c, che chiama foo e stampa i risultati. Poi, con questa sequenza di comandi sono stato in grado di creare un file total.info con copertura del 100% per sut.c:

> 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 

Che poi per sut.c mostra i seguenti risultati:

enter image description here

EDIT (Grazie a Gluttton per avermi ricordato di aggiungere questa parte): Il passaggio dal file total.info in formato lcov all'output di Cobertura XML dovrebbe quindi essere possibile con l'aiuto del "convertitore XML di lcov in cobertura" fornito qui (anche se non l'ho provato): https://github.com/eriwen/lcov-to-cobertura-xml

Il fatto che la fusione di informazioni sulla copertura sia possibile, tuttavia, non significa certamente che sia una buona idea farlo: la copertura, IMO, ha solo un valore informativo limitato per quanto riguarda la qualità di una suite di test. L'unione dei risultati della copertura da diverse uscite del preprocessore diminuirà ulteriormente questo valore.

Questo perché le possibilità per gli sviluppatori di conoscere gli scenari che non hanno considerato saranno ridotte: utilizzando la compilazione condizionale, la struttura di controllo e il flusso di dati del codice possono variare enormemente tra gli output del preprocessore - informazioni sulla copertura risultanti da "sovrapposizione" "I risultati delle esecuzioni dei test per le diverse uscite del preprocessore possono rendere impossibile un'interpretazione significativa dei risultati.

+0

Ma come convertire il report dal formato 'html' a' xml' (Cobertura)? – Gluttton

+0

Preferisci convertire il formato .info di lcov direttamente in cobertura. Una ricerca su google mi ha portato qui: https: // github.com/eriwen/lcov-to-cobertura-xml –

+0

Grazie. Ho appena provato e funziona davvero per la fusione dei dati gcov, ma non ho trovato un buon modo per convertire i dati di lcov in cobertura. Ho provato gli strumenti citati ma getta via molte informazioni, non ci sono informazioni sulle filiali nell'xml generato. –