単体テスト スイートを実行した後に gcovr を実行すると、インライン メンバー関数定義が配置されているヘッダー ファイルのカバレッジに間違った番号が表示されます。例えば:
----------------------------------------------------------------------------
File Lines Exec Cover Missing
------------------------------------------------------------------------------
include/analysis/dataobjects/DetailedHit.h 6 2 33% 41-43,45
include/analysis/dataobjects/Hit.h 19 0 0% 31-33,35-36,42-43,50-51,58-59,74-75,82-83,90-91,98-99
報告されたカバレッジは 0% ですが、cout を配置するとコンソール出力に表示されるためHit.h
、単体テストの実行中にそのヘッダーの少なくとも一部のコードが実行されると確信しています。Web では、関数呼び出しが生成されず、カバレッジ ツールが実行を追跡しないように、コンパイラがメンバー関数コードをインライン化するという事実に起因する問題であることがよく示唆されています。だから私はフラグを追加しました:
-fno-inline -fno-inline-small-functions -fno-default-inline
コンパイラ (gcc 8.2.1) の呼び出しまでですが、同じカバレッジ レポートが表示されます。だから私は何が起こっているのか理解していません。
私を最も困惑させているのは、gcovr が 2 つのカバーされた行を報告する理由ですDetailedHit.h
。このヘッダーは非常に似てHit.h
いるため、報告されたカバレッジが 0% の場合でも同じ動作が期待されますが、このメンバー関数は次のとおりです。
const std::vector<Herd::ParticleHit> ParticleHits() const {
return _particleHits;
}
結果を 10 回実行します。これは単純な関数なので、 のようにインライン化する必要がありますがHit.h
、それでもカバーされる結果になります。重要な場合、Hit は DetailedHit の具象基本クラスであり、どちらも仮想メソッドを持ちません。
gcov と gcovr がどのように機能するかについての重要な知識が欠けていると思いますが、ウェブ上で関連する手がかりを見つけることができなかったので、これについて何か助けていただければ幸いです。ありがとう。