このソナー ページでは基本的に、さまざまなコード カバレッジ分析ツールで採用されているさまざまな方法をリストしています。
- ソース コード インストルメンテーション( Cloverで使用)
- オフライン バイト コード インストルメンテーション( Coberturaで使用)
- オンザフライのバイト コード インストルメンテーション( Jacocoで使用)
これらの 3 つの方法とは何ですか?また、どれが最も効率的で、その理由は?
ソース コードの計測は、ソース コードをコンパイルする前に、ソース コードに命令を追加することで構成されます。これらの命令は、コードのどの部分が実行されたかを追跡するために使用されます。
オフラインのバイトコード インスツルメンテーションは、それらと同じ命令を追加することで構成されますが、コンパイル後にバイトコードに直接追加します。
オンザフライのバイトコード インスツルメンテーションは、同じ命令をバイトコードに追加することで構成されますが、JVM によってバイトコードがロードされる実行時に動的に追加されます。
このページには、メソッド間の比較があります。Clover のドキュメントの一部であるため、偏っている可能性があります。
「効率的」の定義に応じて、最も気に入ったものを選択してください。大きな違いは得られないと思います。それらはすべて仕事をし、どの方法を使用しても全体像は同じです。
一般に、カバレッジへの影響は同じです。
コードブロックの粒度はソース行に関してのみ記録されるため、バイトコード計測はソース行内の構造を区別できないため、ソースコード計測は優れたレポート結果を提供できます。
1 行に 2 つの入れ子になった if ステートメント (または同等のif (a && b) ... * ) があるとします。ソース コード インストルメンタはこれらを確認し、ソース行内の if 内の複数のアームのカバレッジ情報を提供できます。行と列に基づいてブロックを報告できます。バイト コード インストルメンターは、条件を囲む 1 行のみを認識します。条件 a が実行されたが false の場合、その行は「カバーされている」と報告されますか?
これはまれな状況であり (おそらくそうである)、あまり有用ではないと主張するかもしれません。偽の報道に続いて現場での失敗が続くと、有用性について考えが変わるかもしれません。
バイトコードのカバレッジがどのように switch ステートメントのカバレッジを正しくするかについての良い例と説明があり、非常に困難です。
ソース コード インストルメンターは、インストルメント化されたコードの最適化を支援するコンパイラを備えているため、より高速なテスト実行も実現できます。特に、バイナリ インストルメンタによってループ内に挿入されたプローブは、JIT コンパイラによってループ内でコンパイルされる場合があります。優れた Java コンパイラは、インストルメンテーションがループ不変の結果を生成することを確認し、インストルメンテーションをループから持ち上げます。(JIT コンパイラーも間違いなくこれを行うことができます。問題は、実際にそうするかどうかです)。