NCoverのようなコードカバレッジツールは、コードのどの部分が実行され、どの部分が実行されなかったかをどのようにして知るのですか?
任意の言語のテストカバレッジツールを実装する方法 に関するテクニカルペーパーを以下に示します。
私の会社では、この原則に基づいて、Java、C#、C++、PHP、COBOL、PLSQLなどのテストカバレッジツールのファミリを構築しています。
NCoverから直接引用 [〜#〜] faq [〜#〜] :NCoverは、コードの分岐の割合をレポートします。自動テスト。これは、各ブランチでソースコードをインスツルメントし、「ヒット」ポイントをファイルに書き込むことでこれを実現します。次に、これらの「ヒット」ポイントは、「ヒット」であった可能性のある合計ポイントと比較されます。
私はこれが古い問題であることを知っていますが、それでも興味がある場合は、オープンソースプロジェクト OpenCover を見ると、.NETアプリケーションでこのようなインスツルメンテーションがどのように実行されるかの例を確認できます。
OpenCoverは、コードの重要なポイントにインストルメンテーションポイントを挿入します。
これらのルールはすべて、Mono.Cecilを使用して適切なポイントが特定され、コンソールホストからプロファイラーに渡された後、 CoverageInstrumentation.cpp に適用されます。
(示されているように)PartCoverのソースコードも利用できますが、これは追跡するのがはるかに困難ですが、PDBからのシーケンスポイントを使用して、コードをインストルメントする場所を決定します。
From this ソース:
NCoverは、.NET FrameworkプロファイラーAPIを使用して、アプリケーションの実行を監視します。メソッドがCLRによって読み込まれると、NCoverがILを取得し、インストルメントされたILコードに置き換えます
要するに、ジャストインタイムのコンパイルにフックします。
ただし、すべてのツールが同じように機能するわけではありません。他のツールは、コードのコンパイル後にアプリケーションのバイトコードを変更することで機能します。
コードカバレッジ分析を有効にしてテストを1回実行し、カバーされるブロック(つまり、スコープブロック)の数を数え、テストしているプロジェクトのブロックの総数と比較する必要があります。
基本的な理由は、コードブロックの可能な各組み合わせがカバーされる場合、すべてのコードパスがカバーされるということです1。コードカバレッジ数に過度の重みを付けることに対する主な議論は、ゲッターやセッターのような「簡単な」ブロックは、実際の値を与えず(そして、ほとんど失敗しない...)、エラーが発生しやすいコードのブロックと同じだけカウントするということです。 。
1)コメントの Ira Baxter で示されているように、この文の以前の表現は正しくありませんでした。これに関する議論についてはコメントを読んでください。