コード カバレッジのトラブルシューティング

適用対象: Visual Studio

Visual Studio のコード カバレッジ分析ツールは、ネイティブ アセンブリとマネージド アセンブリ (.dll または .exe ファイル) のデータを収集します。 ただし、場合によっては、[ コード カバレッジの結果 ] ウィンドウに "生成された空の結果: ..." のようなエラーが表示されます。 この記事は、空の結果が発生する可能性があるさまざまな理由のトラブルシューティングと解決に役立ちます。

何が表示されますか?

[テスト] メニューで [コード カバレッジの分析] コマンドを選択し、ビルドとテストが正常に実行された場合は、[コード カバレッジ] ウィンドウに結果の一覧が表示されます。 詳細を表示するには、項目を展開する必要がある場合があります。

色分けされたコード カバレッジの結果を示すスクリーンショット。

詳細については、「 コード カバレッジを使用してテストされているコードの量を確認する」を参照してください。

結果または古い結果が表示されない可能性のある理由

Visual Studio の適切なエディションを使用していない

Visual Studio Enterpriseが必要です。

テストは実行されませんでした

分析

出力ウィンドウを確認します。 [ 出力元の表示 ] ドロップダウン リストで、[ テスト] を選択します。 ログに記録された警告またはエラーがあるかどうかを確認します。

説明

コード カバレッジ分析は、テストの実行中に実行されます。 これには、テストの実行時にメモリに読み込まれるアセンブリのみが含まれます。 どのテストも実行されない場合は、コード カバレッジを報告する必要はありません。

解決策

[テスト エクスプローラー] で、[すべて実行] を選択して、テストが正常に実行されることを確認します。 コード カバレッジの分析を使用する前にエラーを修正します。

前の結果を確認しています

テストを変更して再実行すると、以前の実行のコードの色分けなど、以前のコード カバレッジの結果が引き続き表示される可能性があります。 問題を解決するには、次の手順に従います。

  1. [コード カバレッジの分析] を実行します
  2. [ コード カバレッジの結果 ] ウィンドウで、最新の結果セットが選択されていることを確認します。

.pdb (シンボル) ファイルは使用できません

分析

コンパイル先フォルダー (通常は bin\debug) を開き、アセンブリごとに、.dll または .exe ファイルと同じディレクトリに .pdb ファイルがあることを確認します。

説明

コード カバレッジ エンジンでは、テストの実行中にすべてのアセンブリに関連付けられた .pdb ファイルにアクセスできる必要があります。 特定のアセンブリの .pdb ファイルがない場合、アセンブリは分析されません。

.pdb ファイルは、.dllまたは.exe ファイルと同じビルドから生成する必要があります

解決策

ビルド設定で .pdb ファイルが生成されていることを確認します。

  • プロジェクトのビルド時に .pdb ファイルが更新されない場合は、プロジェクトのプロパティを開き、[ ビルド ] ページを選択し、[ 詳細設定] を選択して、[ デバッグ情報] を調べます。

  • Visual Studio 2022 以降のバージョンでは、.NET Core または .NET 5 以降を対象とする C# プロジェクトの場合、プロジェクトのプロパティを開き、[ ビルド ] タブを選択し、[ 全般] を選択して、[ デバッグ シンボル] を調べます。

  • C++ プロジェクトの場合は、生成された .pdb ファイルに完全なデバッグ情報があることを確認します。 プロジェクトのプロパティを開き、リンカー>デバッグの[デバッグ情報の>生成] が [共有と公開用に最適化されたデバッグ情報の生成 (/DEBUG:FULL)] に設定されていることを確認します。

.pdb ファイルと .dll ファイルまたは .exe ファイルが別の場所にある場合は、.pdb ファイルを同じディレクトリにコピーします。 別の場所で .pdb ファイルを検索するようにコード カバレッジ エンジンを構成することもできます。 詳細については、「 コード カバレッジ分析をカスタマイズする」を参照してください。

インストルメント化または最適化されたバイナリが使用されます

分析

バイナリがプロファイルガイド付き最適化などの高度な最適化を行ったか、vsinstr.exeや vsperfmon.exe などのプロファイリング ツールによってインストルメント化されているかどうかを判断 します

説明

アセンブリが既に別のプロファイリング ツールによってインストルメント化または最適化されている場合、アセンブリはコード カバレッジ分析から省略されます。 このようなアセンブリに対してコード カバレッジ分析を実行することはできません。

解決策

最適化をオフにし、新しいビルドを使用します。

コードが管理されていない (.NET) コードまたはネイティブ (C++) コード

分析

マネージド コードまたは C++ コードでいくつかのテストを実行しているかどうかを判断します。

説明

Visual Studio のコード カバレッジ分析は、マネージド コードとネイティブ (C++) コードでのみ使用できます。 サード パーティ製ツールを使用している場合、コードの一部または全部が別のプラットフォームで実行される可能性があります。

解決策

使用できません。

プロジェクト名に 'DataCollector' が含まれている

プロジェクト名に DataCollector を使用するプロジェクトは、コード カバレッジによって識別されません。

アセンブリは NGen によってインストールされています

分析

アセンブリがネイティブ イメージ キャッシュから読み込まれるかどうかを判断します。

説明

パフォーマンス上の理由から、ネイティブ イメージ アセンブリは分析されません。 詳細については、「 Ngen.exe (ネイティブ イメージ ジェネレーター)」を参照してください。

解決策

アセンブリの MSIL バージョンを使用します。 NGen で処理しないでください。

カスタム .runsettings ファイルに構文の問題があります

分析

カスタム .runsettings ファイルを 使用している場合は、構文エラーが含まれている可能性があります。 コード カバレッジは実行されません。また、テスト実行の最後にコード カバレッジ ウィンドウが開かないか、古い結果が表示されます。

説明

カスタム の .runsettings ファイルを使用して単体テストを実行して、コード カバレッジ オプションを構成できます。 オプションを使用すると、ファイルを含めたり除外したりできます。 詳細については、「 コード カバレッジ分析をカスタマイズする」を参照してください。

Resolution

次の 2 種類の障害が考えられます。

  • XML エラー

    Visual Studio XML エディターで .runsettings ファイルを開きます。 エラーの兆候を探します。

  • 正規表現エラー

    ファイル内の各文字列は正規表現です。 各エラーを確認し、特に次を探します。

    • かっこの不一致 (...) またはエスケープされていないかっこ \(...\)。 検索文字列内のかっこと一致させる場合は、エスケープする必要があります。 たとえば、関数と一致するには、次を使用します。 .*MyFunction\(double\)
    • 式の先頭にアスタリスクまたはプラス記号を付けます。 任意の文字列と一致するには、ドットの後にアスタリスクを付けます。 .*

誤った除外を含むカスタム .runsettings ファイル

分析

カスタム .runsettings ファイルを 使用している場合は、アセンブリが含まれていることを確認します。

説明

カスタム の .runsettings ファイルを使用して単体テストを実行して、コード カバレッジ オプションを構成できます。 オプションを使用すると、ファイルを含めたり除外したりできます。 詳細については、「 コード カバレッジ分析をカスタマイズする」を参照してください。

解決策

.runsettings ファイルからすべてのIncludeノードを削除し、すべてのノードをExclude削除します。 問題が解決した場合は、段階的に戻します。

DataCollectors ノードでコード カバレッジが指定されていることを確認します。 コード カバレッジ分析のカスタマイズに関するページのサンプルと比較します。

一部のコードは常にカバーされていないと表示されます

ネイティブ DLL の初期化コードは、インストルメンテーションの前に実行されます

分析

静的にリンクされたネイティブ コードでは、初期化関数 DllMain と呼び出すコードの一部が、コードが実行されている場合でも、カバーされていないと表示されることがあります。

説明

コード カバレッジ ツールは、アプリケーションの実行を開始する直前に、アセンブリにインストルメンテーションを挿入することで機能します。 事前に読み込まれたアセンブリでは、 DllMain の初期化コードは、アセンブリが読み込まれるとすぐに実行され、アプリケーションが実行される前に実行されます。 そのコードはカバーされていないように見えます。これは通常、静的に読み込まれたアセンブリに適用されます。

解決策

なし。

関連情報