web-dev-qa-db-ja.com

2つの実行可能ファイルのカバレッジデータをgcov / gcovrとマージすることは可能ですか?

1つのプロジェクトで、異なるオプションでコンパイルされた3つの異なる実行可能ファイルでテストケースを実行しています。オプションに応じて、いくつかのコードパスが使用されるかどうかが決まります。現在、1つの実行可能ファイルのカバレッジデータのみを使用しています。

私はgcovrを使用してXMLを生成し、それをSonarで解析しています。

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

Gcdaファイルとgcnoファイルのセットが3つありますが、それらのグローバルレポートを生成する方法がわかりません。

それを行う方法はありますか?

21
Baptiste Wicht

「さまざまなオプションでコンパイルする」とは、前処理後にさまざまな出力が得られるようにコンパイルすることを意味すると仮定します。lcov(k0n3ruで説明)を使用して、それを実行できました。ファイル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;
}

sut.hはfooの宣言のみを提供し、test.cにはfooを呼び出して結果を出力する単純なメインを提供します。次に、この一連のコマンドを使用して、sut.cを100%カバーするtotal.infoファイルを作成できました。

> 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

次に、sut.cの場合、次の結果が表示されます。

enter image description here

編集(この部分を追加することを思い出させてくれたGlutttonに感謝します):ここで提供される「lcovからcobertura XMLコンバーター」の助けを借りて、lcov形式のtotal.infoファイルからCobertura XML出力に移動できるはずです(ただし、まだ試していません): https://github.com/eriwen/lcov-to-cobertura-xml

ただし、カバレッジ情報のマージが可能であるという事実は、それが良い考えであることを確かに意味するわけではありません。カバレッジ、IMOは、テストスイートの品質に関して限られた有益な価値しかありません。異なるプリプロセッサ出力からのカバレッジ結果をマージすると、この値はさらに減少します。

これは、開発者が考慮していないシナリオについて学習する可能性が低くなるためです。条件付きコンパイルを使用することにより、コードの制御構造とデータフローは、プリプロセッサ出力間で大幅に異なる可能性があります。テストの結果を「オーバーレイ」した結果のカバレッジ情報です。異なるプリプロセッサ出力に対して実行すると、結果の意味のある解釈が不可能になる可能性があります。

5
Dirk Herrmann