コード カバレッジを使用した、テストされるコード割合の確認Use Code Coverage to determine how much code is being tested

単体テストなどのコード化されたテストによって実際にテストされるプロジェクトのコードの割合を調べるには、Visual Studio のコード カバレッジ機能を使用できます。To determine what proportion of your project's code is actually being tested by coded tests such as unit tests, you can use the code coverage feature of Visual Studio. バグから効果的に保護するには、コードの大部分を "カバー" するようにテストを実行する必要があります。To guard effectively against bugs, your tests should exercise or 'cover' a large proportion of your code.

コード カバレッジ分析は、マネージ (CLI) コードにもアンマネージ (ネイティブ) コードにも適用できます。Code coverage analysis can be applied to both managed (CLI) and unmanaged (native) code.

コード カバレッジは、テスト エクスプローラーを使用してテスト メソッドを実行する場合のオプションです。Code coverage is an option when you run test methods using Test Explorer. 結果テーブルには、各アセンブリ、クラス、およびメソッドで実行されたコードの割合が表示されます。The results table shows the percentage of the code that was run in each assembly, class, and method. また、ソース エディターには、どのコードがテストされたかが表示されます。In addition, the source editor shows you which code has been tested.

色分けされたコード カバレッジの結果

必要条件Requirements

  • Visual Studio EnterpriseVisual Studio Enterprise

テスト エクスプローラーで単体テストのコード カバレッジを分析するにはTo analyze code coverage on unit tests in Test Explorer

  1. [テスト] メニューの [コード カバレッジの分析] を選択します。On the Test menu, choose Analyze Code Coverage.

  2. 実行された行を表示するには、[コード カバレッジの色分けを表示] アイコン[コード カバレッジの色分け表示] を選択します。To see which lines have been run, choose Show Code Coverage Coloring IconShow Code Coverage Coloring.

    色を変更したり太字を使用したりする場合は、[ツール][オプション][環境][フォントおよび色][設定の表示: テキスト エディター] の順に選択します。To alter the colors, or to use bold face, choose Tools > Options > Environment > Fonts and Colors > Show settings for: Text Editor. [表示項目] でカバレッジ項目を調整します。Under Display Items, adjust the Coverage items.

  3. 結果が低カバレッジを示していた場合は、コードのどの部分が実行されていないかを調べ、その部分をカバーするテストをさらに作成します。If the results show low coverage, investigate which parts of the code are not being exercised, and write more tests to cover them. 開発チームは、通常、約 80% のコード カバレッジを目標にします。Development teams typically aim for about 80% code coverage. 状況によっては、より低いカバレッジでも許容されます。In some situations, lower coverage is acceptable. たとえば、一部のコードが標準テンプレートから生成される場合は、より低いカバレッジでも許容されます。For example, lower coverage is acceptable where some code is generated from a standard template.

ヒント

  • コンパイラの最適化がオフになっていることを確認します。make sure that compiler optimization is turned off
  • アンマネージ (ネイティブ) コードを操作している場合は、デバッグ ビルドを使用します。if you are working with unmanaged (native) code, use a debug build
  • 各アセンブリのシンボル (.pdb) ファイルが生成されていることを確認します。make sure that you are generating .pdb (symbol) files for each assembly.

期待した結果が得られない場合は、「トラブルシューティング コード カバレッジIf you don't get the results you expect, see Troubleshooting Code Coverage. である必要があります。. コードを更新した後は、コード カバレッジを忘れずに再度実行します。Don't forget to run code coverage again after updating your code. コードの変更後やテストの実行後に、カバレッジ結果とコードの色分けは自動的には更新されません。Coverage results and code coloring are not automatically updated after you modify your code or when you run tests.

ブロック単位または行単位で報告するReport in blocks or lines

コード カバレッジは、ブロック単位でカウントされます。Code coverage is counted in blocks. ブロックは、エントリ ポイントと終了ポイントを 1 つだけ持つ、コードの部分です。A block is a piece of code with exactly one entry and exit point. プログラムの制御フローがテストの実行中にブロックを通過すると、そのブロックはカバー済みとしてカウントされます。If the program's control flow passes through a block during a test run, that block is counted as covered. ブロックが使用された回数は、結果には影響しません。The number of times the block is used has no effect on the result.

テーブル ヘッダーで [列の追加と削除] を選択して、結果を行単位で表示することもできます。You can also have the results displayed in terms of lines by choosing Add/Remove Columns in the table header. テストの実行がコードのいずれかの行内のすべてのコード ブロックを処理すると、1 行としてカウントされます。If the test run exercised all the code blocks in any line of code, it is counted as one line. 実行されたコード ブロックと実行されなかったコード ブロックが行内に含まれている場合は、部分行としてカウントされます。Where a line contains some code blocks that were exercised and some that were not, that is counted as a partial line.

行単位での割合の方が、ソース コードで見ることができるフラグメントのサイズに正確に対応するため、一部のユーザーは行単位でのカウントを選びます。Some users prefer a count of lines because the percentages correspond more closely to the size of the fragments that you see in the source code. 計算の長いブロックは、複数の行にわたっていても、1 つのブロックとしてカウントされます。A long block of calculation would count as a single block even if it occupies many lines.

コード カバレッジの結果を管理するManage code coverage results

[コード カバレッジの結果] ウィンドウには、通常、最新の実行の結果が表示されます。The Code Coverage Results window usually shows the result of the most recent run. 結果は、テスト データを変更したり、テストの一部だけを実行したりすると、そのたびに異なります。The results will vary if you change your test data, or if you run only some of your tests each time.

コード カバレッジ ウィンドウを使用して、以前の結果や、他のコンピューター上で取得した結果を表示することもできます。The code coverage window can also be used to view previous results, or results obtained on other computers.

いくつかの実行 (たとえば、異なるテスト データを使用した実行) の結果をマージできます。You can merge the results of several runs, for example from runs that use different test data.

  • 以前の結果のセットを表示するには、それをドロップダウン メニューから選択します。To view a previous set of results, select it from the drop-down menu. メニューには一時的な一覧が表示され、新しいソリューションを開くとクリアされます。The menu shows a temporary list that is cleared when you open a new solution.

  • 以前のセッションの結果を表示するには[コード カバレッジの結果のインポート] を選択し、ソリューションの TestResults フォルダーに移動して、.coverage ファイルをインポートします。To view results from a previous session, choose Import Code Coverage Results, navigate to the TestResults folder in your solution, and import a .coverage file.

    .coverage ファイルの生成後、ソース コードを変更した場合は、カバレッジの色分けが正しくない場合があります。The coverage coloring might be incorrect if the source code has changed since the .coverage file was generated.

  • 結果をテキストとして読みやすくするには[コード カバレッジの結果のエクスポート] を選択します。To make results readable as text, choose Export Code Coverage Results. 他のツールで処理したり電子メールで簡単に送信したりすることができる、読める形式の .coveragexml ファイルが生成されます。This generates a readable .coveragexml file which you could process with other tools or send easily in mail.

  • 結果を他のユーザーに送信するには、.coverage ファイルまたはエクスポートされた .coveragexml ファイルを送信します。To send results to someone else, send either a .coverage file or an exported .coveragexml file. 受け取ったユーザーは、ファイルをインポートできます。They can then import the file. 同じバージョンのソース コードを持っていれば、カバレッジの色分けも表示できます。If they have the same version of the source code, they can see coverage coloring.

さまざまな実行による結果をマージするMerge results from different runs

状況によっては、テスト データに応じて、コード内の異なるブロックが使用されます。In some situations, different blocks in your code will be used depending on the test data. そのため、異なるテスト実行の結果を結合する必要がある場合があります。Therefore, you might want to combine the results from different test runs.

たとえば、入力が "2" のテストを実行したときに、特定の関数の 50% がカバーされるとします。For example, suppose that when you run a test with input "2", you find that 50% of a particular function is covered. 入力を "-2" にして再度テストを実行すると、カバレッジの色分けビューで、関数の残りの 50% がカバーされていることがわかるとします。When you run the test a second time with the input "-2" you see in the coverage coloring view that the other 50% of the function is covered. ここで、2 つのテスト実行の結果をマージすると、レポートやカバレッジの色分けビューで、関数の 100% がカバーされたことが表示されます。Now you merge the results from the two test runs, and the report and coverage coloring view show that 100% of the function was covered.

そのためには、[コード カバレッジ] ウィンドウの [マージ] ボタンのアイコン[コード カバレッジの結果のマージ] を使用します。Use Icon for Merge button in Code Coverage windowMerge Code Coverage Results to do this. 最新の実行またはインポートされた結果を任意の組み合わせで選択できます。You can choose any combination of recent runs or imported results. エクスポートされた結果を結合する場合は、まず、それらをインポートする必要があります。If you want to combine exported results, you must import them first.

マージ操作の結果を保存するには、[コード カバレッジの結果のエクスポート] を使用します。Use Export Code Coverage Results to save the results of a merge operation.

マージの制限事項Limitations in merging

  • バージョンが異なるコードのカバレッジ データをマージすると、結果は個別に表示され、結合はされません。If you merge coverage data from different versions of the code, the results are shown separately, but they are not combined. 完全に結合された結果を取得するには、同じビルドのコードを使用し、テスト データだけを変更します。To get fully combined results, use the same build of the code, changing only the test data.

  • エクスポートしてからインポートされた結果ファイルをマージした場合は、行単位の結果のみを表示でき、ブロック単位の結果は表示できません。If you merge a results file that has been exported and then imported, you can only view the results by lines, not by blocks. 行データを表示するには、[列の追加と削除] コマンドを使用します。Use the Add/Remove Columns command to show the line data.

  • ASP.NET プロジェクトのテスト結果をマージした場合は、個別のテストの結果は表示されますが、結合された結果は表示されません。If you merge results from tests of an ASP.NET project, the results for the separate tests are displayed, but not combined. このようになるのは、ASP.NET の成果物自体だけです。他のアセンブリの結果は結合されます。This applies only to the ASP.NET artifacts themselves: results for any other assemblies will be combined.

コード カバレッジの結果から要素を除外するExclude elements from the code coverage results

コードがテキスト テンプレートから生成された場合のように、コード内の特定の要素をカバレッジのスコアから除外する必要があることがあります。You might want to exclude specific elements in your code from the coverage scores, for example if the code is generated from a text template. その場合は、コード要素であるクラス、構造体、メソッド、プロパティ、プロパティ set または get アクセス操作子、およびイベントに、属性 System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage を追加します。Add the attribute System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage to any of the following code elements: class, struct, method, property, property setter or getter, event. クラスを除外しても、派生クラスは除外されないことに注意してください。Note that excluding a class does not exclude its derived classes.

例:For example:


using System.Diagnostics.CodeAnalysis;
...
public class ExampleClass1
{
    [ExcludeFromCodeCoverage]
    void ExampleMethod() {...}

    [ExcludeFromCodeCoverage] // exclude property
    int ExampleProperty1
    { get {...} set{...}}

    int ExampleProperty2
    {
        get
        {
            ...
        }
        [ExcludeFromCodeCoverage] // exclude setter
        set
        {
            ...
        }
    }

}
[ExcludeFromCodeCoverage]
class ExampleClass2 { ... }
Imports System.Diagnostics.CodeAnalysis

Class ExampleClass1
    <ExcludeFromCodeCoverage()>
    Public Sub ExampleSub1()
        ...
    End Sub

    ' Exclude property
    < ExcludeFromCodeCoverage()>
    Property ExampleProperty1 As Integer
        ...
    End Property

    ' Exclude setter
    Property ExampleProperty2 As Integer
        Get
            ...
        End Get
        <ExcludeFromCodeCoverage()>
        Set(ByVal value As Integer)
            ...
        End Set
    End Property
End Class

<ExcludeFromCodeCoverage()>
Class ExampleClass2
...
End Class
// A .cpp file compiled as managed (CLI) code.
using namespace System::Diagnostics::CodeAnalysis;
...
public ref class ExampleClass1
{
  public:
    [ExcludeFromCodeCoverage]
    void ExampleFunction1() { ... }

    [ExcludeFromCodeCoverage]
    property int ExampleProperty2 {...}

    property int ExampleProperty2 {
      int get() { ... }
     [ExcludeFromCodeCoverage]
      void set(int value) { ...  }
   }
}

[ExcludeFromCodeCoverage]
public ref class ExampleClass2
{ ... }

ネイティブ C++ コード内の要素を除外するExclude elements in Native C++ code

C++ コードでアンマネージ (ネイティブ) 要素を除外するには:To exclude unmanaged (native) elements in C++ code:

#include <CodeCoverage\CodeCoverage.h>
...

// Exclusions must be compiled as unmanaged (native):
#pragma managed(push, off)

// Exclude a particular function:
ExcludeFromCodeCoverage(Exclusion1, L"MyNamespace::MyClass::MyFunction");

// Exclude all the functions in a particular class:
ExcludeFromCodeCoverage(Exclusion2, L"MyNamespace::MyClass2::*");

// Exclude all the functions generated from a particular template:
ExcludeFromCodeCoverage(Exclusion3, L"*::MyFunction<*>");

// Exclude all the code from a particular .cpp file:
ExcludeSourceFromCodeCoverage(Exclusion4, L"*\\unittest1.cpp");

// After setting exclusions, restore the previous managed/unmanaged state:
#pragma managed(pop)

以下のマクロを使用します。Use the following macros:

ExcludeFromCodeCoverage( ExclusionName , L" FunctionName ");ExcludeFromCodeCoverage( ExclusionName , L" FunctionName ");

ExcludeSourceFromCodeCoverage( ExclusionName , L" SourceFilePath ");ExcludeSourceFromCodeCoverage( ExclusionName , L" SourceFilePath ");

  • ExclusionName は任意の一意の名前です。ExclusionName is any unique name.

  • FunctionName は完全修飾関数名です。FunctionName is a fully qualified function name. ワイルドカードを含めることができます。It may contain wildcards. たとえば、クラスのすべての関数を除外するには、MyNamespace::MyClass::* と記述します。For example, to exclude all the functions of a class, write MyNamespace::MyClass::*

  • SourceFilePath は .cpp ファイルのローカル パスまたは UNC パスです。SourceFilePath is the local or UNC path of a .cpp file. ワイルドカードを含めることができます。It may contain wildcards. たとえば、\\MyComputer\Source\UnitTests\*.cpp と記述すると、特定のディレクトリ内のすべてのファイルが除外されます。The following example excludes all files in a particular directory: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • 除外マクロの呼び出しは、いずれかの名前空間またはクラス内ではなく、グローバル名前空間に配置します。Place calls to the exclusion macros in the global namespace, not within any namespace or class.

  • 除外は単体テスト コード ファイルまたはアプリケーション コード ファイル内に配置できます。You can place the exclusions either in the unit test code file or the application code file.

  • 除外は、コンパイラ オプションを設定するか、#pragma managed(off) を使用して、アンマネージ (ネイティブ) コードとしてコンパイルする必要があります。The exclusions must be compiled as unmanaged (native) code, either by setting the compiler option or by using #pragma managed(off).

注意

C++/CLI コード内の関数を除外するには、関数に [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] 属性を適用します。To exclude functions in C++/CLI code, apply the attribute [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] to the function. これは、C# の場合と同じです。This is the same as for C#.

追加の要素を含めるか、除外するInclude or exclude additional elements

コード カバレッジ分析の対象となるのは、読み込まれ、.dll または .exe ファイルと同じディレクトリ内の .pdb ファイルを利用できるアセンブリだけです。Code coverage analysis is performed only on assemblies that are loaded and for which a .pdb file is available in the same directory as the .dll or .exe file. そのため、状況によっては、適切な .pdb ファイルのコピーを取得することによって、対象となるアセンブリのセットを拡張できます。Therefore in some circumstances, you can extend the set of assemblies that is included by getting copies of the appropriate .pdb files.

.runsettings ファイルを記述すると、コード カバレッジ分析の対象としてどのアセンブリと要素を選択するかをより詳細に制御できます。You can exercise more control over which assemblies and elements are selected for code coverage analysis by writing a .runsettings file. たとえば、クラスに属性を追加せずに、特定の種類のアセンブリを除外できます。For example, you can exclude assemblies of particular kinds without having to add attributes to their classes. 詳細については、「コード カバレッジ分析のカスタマイズ」を参照してください。For more information, see Customizing Code Coverage Analysis.

ビルド サービスでコード カバレッジを分析するAnalyze code coverage in the build service

コードをチェックインすると、テストがビルド サーバー上で、他のチーム メンバーによる他のすべてのテストと共に実行されます。When you check in your code, your tests will run on the build server, along with all the other tests from other team members. まだこの設定を行っていない場合は、「ビルド プロセスでのテストの実行」を参照してください。これによって、プロジェクト全体のカバレッジに関する最新の全体像が得られるため、ビルド サービスのコード カバレッジを分析する場合に便利です。(If you haven't already set this up, see Run tests in your build process.) It's useful to analyze code coverage on the build service, because that gives the most up-to-date and comprehensive picture of coverage in the whole project. これには、自動化されたシステム テストと、通常は開発用コンピューターでは実行しない、その他のコード化されたテストも含まれます。It will also include automated system tests and other coded tests that you don't usually run on the development machines.

  1. チーム エクスプローラーで、[ビルド] を開き、ビルド定義を追加または編集します。In Team Explorer, open Builds, and then add or edit a build definition.

  2. [プロセス] ページで [自動テスト][テスト ソース][実行設定] の順に展開します。On the Process page, expand Automated Tests, Test Source, Run Settings. [実行設定の種類][コード カバレッジの有効化] に設定します。Set Type of Run Settings File to Code Coverage Enabled.

    複数のテスト ソース定義がある場合は、各定義に対してこの手順を繰り返します。If you have more than one Test Source definition, repeat this step for each one.

    コード カバレッジのビルド定義の設定

ヒント

実行設定ファイルの種類」という名前のフィールドがない場合、[テスト ランナー] プロパティを変更します。If there's no field named Type of Run Settings File, change the Test Runner property. [自動テスト] の下の [テスト アセンブリ] を選択し、行の末尾の省略記号 ([...]) ボタンを選択します。Under Automated Tests, select Test Assembly and choose the ellipsis button [...] at the end of the line. [テストの実行の追加と編集] ダイアログ ボックスで、[テスト ランナー] の下の [Visual Studio テスト ランナー] を選択します。In the Add/Edit Test Run dialog box, under Test Runner, choose Visual Studio Test Runner.

ビルドの実行後、コード カバレッジの結果はテスト実行にアタッチされ、ビルドの概要に表示されます。After the build runs, the code coverage results are attached to the test run and appear in the build summary.

コマンド ラインでコード カバレッジを分析するAnalyze Code Coverage in a Command Line

コマンド ラインからテストを実行するには、vstest.console.exe を使用します。To run tests from the command line, use vstest.console.exe. コード カバレッジは、vstest.console.exe ユーティリティのオプションです。Code coverage is an option of the vstest.console.exe utility.

  1. Visual Studio 開発者コマンド プロンプトを起動します。Launch the Visual Studio Developer Command Prompt:

    Windows の [スタート] メニューから、[Visual Studio 2017] > [開発者コマンド プロンプト for VS 2017] の順に選択します。On the Windows Start menu, choose Visual Studio 2017 > Developer Command Prompt for VS 2017.

  2. 次のコマンドを実行します。Run the following command:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage

トラブルシューティングTroubleshoot

コード カバレッジの結果が表示されない場合、コード カバレッジのトラブルシューティングに関するトピックが役に立つことがあります。If you do not see code coverage results, the Troubleshooting Code Coverage topic might help you.

関連項目See also