コード カバレッジ分析のカスタマイズCustomize code coverage analysis

既定では、Visual Studio Code カバレッジ ツールは、単体テスト中に読み込まれるすべてのソリューション アセンブリを分析します。By default, the Visual Studio Code Coverage tool analyzes all solution assemblies that are loaded during unit tests. 多くの場合は、この設定が効果的なので、既定のままにしておくことをお勧めします。We recommend that you retain this default, because it works well most of the time. 詳細については、「コード カバレッジを使用した、テストされるプロジェクトのコード割合の確認」を参照してください。For more information, see Using Code Coverage to Determine How Much Code is being Tested.

コード カバレッジの動作をカスタマイズする前に、次のようないくつかの代替手段を検討してください。Before customizing the code coverage behavior, consider some alternatives:

  • コード カバレッジの結果からテスト コードを除外して、アプリケーションのコードのみを含めます。I want to exclude the test code from the code coverage results and include only the application code.

    テスト クラスに ExcludeFromCodeCoverage Attribute を追加します。Add the ExcludeFromCodeCoverage Attribute to your test class.

  • ソリューションの一部ではないアセンブリを含めます。I want to include assemblies that are not part of my solution.

    これらのアセンブリの .pdb ファイルを取得し、アセンブリ .dll ファイルと同じフォルダーにコピーします。Obtain the .pdb files for these assemblies and copy them into the same folder as the assembly .dll files.

コード カバレッジの動作をカスタマイズするには、このトピックの最後にあるサンプルをコピーし、ファイル拡張子を .runsettings にしてソリューションに追加します。To customize the code coverage behavior, copy the sample at the end of this topic and add it to your solution, using the file extension .runsettings. ニーズに合わせて編集し、[テスト] メニューで [テストの設定][テスト設定ファイルの選択] の順に選択します。Edit it to your own needs, and then on the Test menu, choose Test Settings, Select Test Settings file. この記事の残りの部分では、この手順を詳しく説明します。The remainder of this article describes this procedure in more detail.

実行設定ファイルThe run settings file

詳細なコード カバレッジの設定は、.runsettings ファイルで指定されます。Advanced code coverage settings are specified in a .runsettings file. 実行設定ファイルは、単体テスト ツールによって使用される構成ファイルです。The run settings file is the configuration file used by unit testing tools. このトピックの最後にあるサンプルをコピーし、ニーズに合わせて編集することをお勧めします。We recommend you copy the sample at the end of this topic and edit it to suit your own needs.

コード カバレッジをカスタマイズするには、ソリューションに実行設定ファイルを追加します。To customize code coverage, add a run settings file to your solution:

  1. .runsettings という拡張子で、ソリューション項目として .xml ファイルを追加します。Add an .xml file as a solution item with the extension .runsettings:

    ソリューション エクスプローラーでソリューションのショートカット メニューを開き、[追加][新しい項目][XML ファイル] の順に選択します。In Solution Explorer, on the shortcut menu of your solution, choose Add > New Item, and select XML File. 末尾が CodeCoverage.runsettings などになる名前でファイルを保存します。Save the file with a name ending such as CodeCoverage.runsettings.

  2. この記事の最後にあるサンプルの内容を追加し、後続の各セクションの説明に従って、ニーズに合わせてカスタマイズします。Add the content from the example at the end of this article, and then customize it to your needs as described in the sections that follow.

  3. [テスト] メニューで [テストの設定][テスト設定ファイルの選択] の順に選択し、ファイルを選択します。On the Test menu, choose Test Settings > Select Test Settings File and select the file.

  4. これで、[コード カバレッジの分析] を実行すると、この実行設定ファイルが動作を制御するようになります。Now when you run Analyze Code Coverage, the run settings file will control its behavior. コード カバレッジを必ず再実行してください。Don't forget that you must run code coverage again. 前のカバレッジの結果とコードの色分けは、テストを実行したりコードを更新したりしても、自動的に非表示にはなりません。The previous coverage results and code coloring aren't automatically hidden when you run tests or update your code.

  5. カスタム設定のオンとオフを切り替えるには、[テストの設定] メニューの [テスト] でファイルを選択したり選択解除したりします。To turn the custom settings off and on, deselect or select the file in the Test > Test Settings menu.

    カスタム設定ファイルを持つ [テストの設定] メニュー

単体テストのその他の面も、同じ実行設定ファイルで構成できます。Other aspects of unit tests can be configured in the same run settings file. 詳しくは、「コードの単体テストUnit Test Your Code」をご覧ください。For more information, see Unit Test Your Code.

シンボル検索パスの指定Specifying symbol search paths

コード カバレッジでは、アセンブリのシンボル (.pdb ファイル) が存在している必要があります。Code coverage requires symbols (.pdb files) for assemblies to be present. ソリューションによってビルドされたアセンブリには、通常、バイナリ ファイルと共にシンボル ファイルも存在しており、コード カバレッジは自動的に動作します。For assemblies built by your solution, symbol files are usually present alongside the binary files, and code coverage works automatically. ただし、場合によっては、参照されるアセンブリをコード カバレッジ分析に追加したいこともあります。But in some cases, you might want to include referenced assemblies in your code coverage analysis. そのような場合、.pdb ファイルがバイナリと同じ場所にないこともありますが、シンボル検索パスを .runsettings ファイルで指定できます。In such cases, the .pdb files might not be adjacent to the binaries, but you can specify the symbol search path in the .runsettings file.

<SymbolSearchPaths>
      <Path>\\mybuildshare\builds\ProjectX</Path>
      <!--More paths if required-->
</SymbolSearchPaths>

警告

シンボルの解決には、特に多数のアセンブリでリモートのファイルの場所を使用している場合、時間がかかることがあります。Symbol resolution can take time, especially when using a remote file location with many assemblies. そのため、リモート .pdb ファイルをバイナリ (.dll または .exe) ファイルと同じローカルの場所にコピーすることを検討してください。Therefore, consider copying remote .pdb files to the same local location as the binary (.dll and .exe) files.

除外と包含Excluding and including

指定したアセンブリをコード カバレッジ分析から除外できます。You can exclude specified assemblies from code coverage analysis. 例:For example:

<ModulePaths>
  <Exclude>
   <ModulePath>Fabrikam.Math.UnitTest.dll</ModulePath>
   <!-- Add more ModulePath nodes here. -->
  </Exclude>
</ModulePaths>

逆に、どのアセンブリが包含されるかを指定することもできます。As an alternative, you can specify which assemblies should be included. ソリューションにアセンブリを追加するときに、一覧にも忘れずに追加しなければならないのが、この方法の欠点です。This approach has the drawback that when you add more assemblies to the solution, you have to remember to add them to the list:

<ModulePaths>
  <Include>
   <ModulePath>Fabrikam.Math.dll</ModulePath>
   <!-- Add more ModulePath nodes here. -->
  </Include>
</ModulePaths>

<Include> が空の場合、コード カバレッジの処理には、読み込まれ、.pdb ファイルが見つかるすべてのアセンブリが含まれます。If <Include> is empty, then code coverage processing includes all assemblies that are loaded, and for which .pdb files can be found. コード カバレッジには、<Exclude> 一覧の句に一致する項目が含まれません。Code coverage does not include items that match a clause in an <Exclude> list.

Include は、Exclude の前に処理されます。Include is processed before Exclude.

正規表現Regular expressions

Include ノードと Exclude ノードでは、正規表現を使用できます。Include and exclude nodes use regular expressions. 詳細については、「Visual Studio での正規表現の使用」を参照してください。For more information, see Using Regular Expressions in Visual Studio. 正規表現は、ワイルドカードと同じではありません。Regular expressions are not the same as wildcards. 特に次の点に注意してください。In particular:

  • .\* は任意の文字の文字列と一致します.\* matches a string of any characters

  • \.\. はピリオド "." と一致しますmatches a dot ".")

  • \( \) は "( )" と一致します\( \) matches parentheses "( )"

  • \\ はファイル パス区切り記号 "\" と一致します\\ matches a file path delimiter "\"

  • ^ は文字列の先頭と一致します^ matches the start of the string

  • $ は文字列の末尾と一致します$ matches the end of the string

すべての一致で、大文字と小文字が区別されます。All matches are case-insensitive.

例:For example:

<ModulePaths>
  <Include>
    <!-- Include all loaded .dll assemblies (but not .exe assemblies): -->
    <ModulePath>.*\.dll$</ModulePath>
  </Include>
  <Exclude>
    <!-- But exclude some assemblies: -->
    <ModulePath>.*\\Fabrikam\.MyTests1\.dll$</ModulePath>
    <!-- Exclude all file paths that contain "Temp": -->
    <ModulePath>.*Temp.*</ModulePath>
  </Exclude>
</ModulePaths>

警告

正規表現にエラー (エスケープされず、一致しないかっこなど) がある場合、コード カバレッジ分析は実行されません。If there is an error in a regular expression, such as an unescaped and unmatched parenthesis, then code coverage analysis will not run.

要素を包含または除外するための別の方法Other ways to include or exclude elements

例については、このトピックの末尾のサンプルを参照してください。See the sample at the end of this topic for examples.

  • ModulePath - アセンブリ ファイル パスで指定されたアセンブリ。ModulePath - Assemblies specified by assembly file path.

  • CompanyName - 会社名属性でアセンブリと一致します。CompanyName - matches assemblies by the Company attribute.

  • PublicKeyToken - 公開キー トークンで、署名付きアセンブリと一致します。PublicKeyToken - matches signed assemblies by the public key token. たとえば、すべての Visual Studio コンポーネントおよび拡張機能と一致させるには、<PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken> を使用します。For example to match all Visual Studio components and extensions, use <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>.

  • Source - 要素が定義されているソース ファイルのパス名で要素と一致します。Source - matches elements by the path name of the source file in which they are defined.

  • Attribute - 特定の属性のアタッチ先の要素と一致します。Attribute - matches elements to which a particular attribute is attached. 属性の完全名を指定し、名前の末尾に "Attribute" を含めます。Specify the full name of the attribute, including "Attribute" at the end of the name.

  • Function - 完全修飾名でプロシージャ、関数、またはメソッドに一致します。Function - matches procedures, functions, or methods by fully qualified name.

関数名の一致Matching a function name

正規表現が、名前空間、クラス名、メソッド名、およびパラメーター リストを含む関数の完全修飾名と一致する必要があります。Your regular expression must match the fully qualified name of the function, including namespace, class name, method name, and parameter list. たとえば、オブジェクトに適用されたFor example,

  • C# または Visual Basic: Fabrikam.Math.LocalMath.SquareRoot(double)C# or Visual Basic: Fabrikam.Math.LocalMath.SquareRoot(double)

  • C++: Fabrikam::Math::LocalMath::SquareRoot(double)C++: Fabrikam::Math::LocalMath::SquareRoot(double)

<Functions>
  <Include>
    <!-- Include methods in the Fabrikam namespace: -->
    <Function>^Fabrikam\..*</Function>
    <!-- Include all methods named EqualTo: -->
    <Function>.*\.EqualTo\(.*</Function>
  </Include>
  <Exclude>
    <!-- Exclude methods in a class or namespace named UnitTest: -->
    <Function>.*\.UnitTest\..*</Function>
  </Exclude>
</Functions>

テストの実行中に実行設定ファイルを指定する方法How to specify run settings files while running tests

Visual Studio テストで実行設定をカスタマイズするにはTo customize run settings in Visual Studio tests

[テスト][テストの設定][テスト設定ファイルの選択] の順に選択し、.runsettings ファイルを選択します。Choose Test > Test Settings > Select Test Settings File and select the .runsettings file. ファイルは、[テストの設定] メニューに表示され、選択したり取り消したりすることができます。The file appears on the Test Settings menu, and you can select or cancel it. 選択されている間、実行設定ファイルは、[コード カバレッジの分析] を使用するたびに適用されます。While selected, your run settings file applies whenever you use Analyze Code Coverage.

コマンド ライン テストで実行設定をカスタマイズするにはTo customize run settings in a command-line test

コマンド ラインからテストを実行するには、vstest.console.exe を使用します。To run tests from the command line, use vstest.console.exe. 設定ファイルは、このユーティリティのパラメーターです。The settings file is a parameter of this 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 /Settings:CodeCoverage.runsettings

ビルド定義で実行設定をカスタマイズするにはTo customize run settings in a build definition

チーム ビルドからコード カバレッジ データを取得できます。You can get code coverage data from a team build.

ビルド定義に実行設定を指定する

  1. 実行設定ファイルがチェックインされていることを確認します。Make sure your run settings file is checked in.

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

  3. [プロセス] ページで、[自動テスト] > [テスト ソース] > [実行設定] の順に展開します。On the Process page, expand Automated Tests > Test Source > Run Settings. .runsettings ファイルを選択します。Select the .runsettings file.

    ヒント

    Test AssemblyTest Source の代わりに表示され、.testsettings ファイルのみを選択できる場合、Test Runner プロパティを次のように設定します。If Test Assembly appears instead of Test Source, and you can only select .testsettings files, set the Test Runner property as follows. [自動テスト] の下の [テスト アセンブリ] を選択し、行の末尾の [...] ボタンを選択します。Under Automated Tests, select Test Assembly, and then choose [...] at the end of the line. [テストの実行の追加と編集] ダイアログ ボックスで、[テスト ランナー][Visual Studio テスト ランナー] に設定します。In the Add/Edit Test Run dialog box, set Test Runner to Visual Studio Test Runner.

結果は、ビルド レポートの概要セクションに表示されます。The results are visible in the summary section of the build report.

サンプル .runsettings ファイルSample .runsettings file

このコードをコピーし、独自のニーズに合わせて編集します。Copy this code and edit it to suit your own needs.

(.runsettings ファイルのその他の用途については、「.runsettings ファイルを使用して単体テストを構成する」を参照してください。)(For other uses of the run settings file, see Configure unit tests by using a run settings file.)

<?xml version="1.0" encoding="utf-8"?>
<!-- File name extension must be .runsettings -->
<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <Configuration>
          <CodeCoverage>
<!--
Additional paths to search for .pdb (symbol) files. Symbols must be found for modules to be instrumented.
If .pdb files are in the same folder as the .dll or .exe files, they are automatically found. Otherwise, specify them here.
Note that searching for symbols increases code coverage runtime. So keep this small and local.
-->
<!--
            <SymbolSearchPaths>
                   <Path>C:\Users\User\Documents\Visual Studio 2012\Projects\ProjectX\bin\Debug</Path>
                   <Path>\\mybuildshare\builds\ProjectX</Path>
            </SymbolSearchPaths>
-->

<!--
About include/exclude lists:
Empty "Include" clauses imply all; empty "Exclude" clauses imply none.
Each element in the list is a regular expression (ECMAScript syntax). See http://msdn.microsoft.com/library/2k3te2cs.aspx.
An item must first match at least one entry in the include list to be included.
Included items must then not match any entries in the exclude list to remain included.
-->

            <!-- Match assembly file paths: -->
            <ModulePaths>
              <Include>
                <ModulePath>.*\.dll$</ModulePath>
                <ModulePath>.*\.exe$</ModulePath>
              </Include>
              <Exclude>
                <ModulePath>.*CPPUnitTestFramework.*</ModulePath>
              </Exclude>
            </ModulePaths>

            <!-- Match fully qualified names of functions: -->
            <!-- (Use "\." to delimit namespaces in C# or Visual Basic, "::" in C++.)  -->
            <Functions>
              <Exclude>
                <Function>^Fabrikam\.UnitTest\..*</Function>
                <Function>^std::.*</Function>
                <Function>^ATL::.*</Function>
                <Function>.*::__GetTestMethodInfo.*</Function>
                <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
                <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
              </Exclude>
            </Functions>

            <!-- Match attributes on any code element: -->
            <Attributes>
              <Exclude>
                <!-- Don't forget "Attribute" at the end of the name -->
                <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.DebuggerNonUserCodeAttribute$</Attribute>
                <Attribute>^System\.Runtime\.CompilerServices.CompilerGeneratedAttribute$</Attribute>
                <Attribute>^System\.CodeDom\.Compiler.GeneratedCodeAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute>
              </Exclude>
            </Attributes>

            <!-- Match the path of the source files in which each method is defined: -->
            <Sources>
              <Exclude>
                <Source>.*\\atlmfc\\.*</Source>
                <Source>.*\\vctools\\.*</Source>
                <Source>.*\\public\\sdk\\.*</Source>
                <Source>.*\\microsoft sdks\\.*</Source>
                <Source>.*\\vc\\include\\.*</Source>
              </Exclude>
            </Sources>

            <!-- Match the company name property in the assembly: -->
            <CompanyNames>
              <Exclude>
                <CompanyName>.*microsoft.*</CompanyName>
              </Exclude>
            </CompanyNames>

            <!-- Match the public key token of a signed assembly: -->
            <PublicKeyTokens>
              <!-- Exclude Visual Studio extensions: -->
              <Exclude>
                <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
                <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
                <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
                <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
                <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
                <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
                <PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
              </Exclude>
            </PublicKeyTokens>

            <!-- We recommend you do not change the following values: -->
            <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
            <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
            <CollectFromChildProcesses>True</CollectFromChildProcesses>
            <CollectAspDotNet>False</CollectAspDotNet>

          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

関連項目See also