Поделиться через


Настройка анализа покрытия кода

По умолчанию средство покрытия кода Visual Studio 2012 позволяет проанализировать все сборки решения (.exe/.dll), загруженные во время модульных тестов.Рекомендуется оставить настройки по умолчанию, поскольку это работает правильно большую часть времени.Для получения дополнительной информации см. Использование покрытия кода для определения объема протестированного кода.

Прежде чем настроить поведение покрытия кода, рассмотрите некоторые альтернативы:

  • Я хочу исключить код теста из результатов покрытия кода и включить только код приложения.

    Добавьте ExcludeFromCodeCoverage Attribute в ваш класс теста.

  • Я хочу включить сборки, которые не являются частью моего решения.

    Получите PDB-файлы для этих сборок и скопируйте их в ту же папку, что и DLL-файлы сборки.

Для настройки поведения покрытия кода скопируйте пример в конце этого раздела и добавьте его к решению, используя расширение файла .runsettings.Измените его в соответствии с собственными требованиями, а затем в меню Тест выберите Параметры тестирования и файл Выбрать параметры тестирования.В оставшейся части этого раздела подробно описывается данная процедура.

Файл .runsettings

Дополнительные параметры покрытия кода определяются в файле .runsettings.Это файл конфигурации, используемый с помощью средств модульного тестирования.Рекомендуется скопировать пример в конце этого раздела и изменить его в соответствии с собственными требованиями.

  • Что произошло с файлом .testsettings, который использовался в Visual Studio 2010?

    В Visual Studio 2010 файл .testsettings применяется только к модульным тестам на основе платформы MSTest.В Visual Studio 2012 набор средств тестирования применяется не только на платформе MSTest, но также и на других платформах, например, NUnit и xUnit.net.Файл .testsettings не будет работать с ними.Файл .runsettings предназначен для настройки средства тестирования таким образом, чтобы оно работало на всех платформах для тестирования.

Для настройки покрытия кода необходимо добавить файл .runsettings к решению:

  1. Добавьте файл xml в качестве элемента решения с расширением .runsettings:

    В обозревателе решений в контекстном меню выберите Добавить, далее Создать элемент и выберите XML-файл.Сохраните файл с именем, заканчивающимся как CodeCoverage.runsettings.

  2. Добавьте содержимое, данное в образце в конце данного раздела, а затем настройте его в соответствии с собственными нуждами так, как описано в следующих разделах.

  3. В меню Тест выберите Параметры тестирования, затем Выбрать файл параметров тестирования и выберите файл.

  4. Теперь при запуске Тест, Анализ покрытия кода этот файл .runsettings будет управлять его поведением.

  5. Для включения и выключения пользовательских параметров выберите или отмените файл в меню Тест, Параметры тестирования.

Меню параметров тестирования с пользовательским файлом параметров

Другие аспекты модульных тестов можно настроить в одном файле .runsettings.Для получения дополнительной информации см. Проверка кода при помощи модульных тестов.

JJ159530.collapse_all(ru-ru,VS.110).gifУказание пути поиска символов

Покрытию кода необходимо присутствие символов (файлы .pdb) в сборках.Для сборок, созданных решением, файлы символов обычно присутствуют вместе с бинарными файлами, и покрытие кода работает автоматически.Однако в некоторых случаях может потребоваться включить связанные сборки в анализ покрытия кода.В таких случаях файлы .pdb могут не быть рядом с бинарными, но можно указать путь поиска символов в файле .runsettings.

         <SymbolSearchPaths>              
               <Path>\\mybuildshare\builds\ProjectX</Path>
               <!--More paths if required-->
         </SymbolSearchPaths>
Предупреждающее замечаниеВнимание

Разрешение символов может занять время, особенно при использовании удаленного расположения файла с несколькими сборками.Поэтому рекомендуется скопировать удаленные файлы .pdb в одно и то же локальное расположение как двоичные файлы (.dll и .exe).

JJ159530.collapse_all(ru-ru,VS.110).gifИсключение и включение

Можно исключить указанные сборки из анализа покрытия кода.Например:

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

В качестве альтернативы можно определить, какие сборки должны быть включены.Данный подход имеет недостаток — при добавлении дополнительных сборок необходимо не забывать добавлять их в список.

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

Если <Include> пуст, то обработка покрытия кода включает все сборки (файлы .dll и .exe), которые уже загружены и для которых можно найти файлы .pdb, за исключением элементов, которые соответствуют конструкции в списке <Exclude>.

Include обрабатывается перед Exclude.

JJ159530.collapse_all(ru-ru,VS.110).gifРегулярные выражения

Узлы включения и исключения используют регулярные выражения.Для получения дополнительной информации см. Использование регулярных выражений в Visual Studio.Регулярные выражения не равнозначны подстановочным знакам.В частности:

  1. .* соответствует строке любых символов.

  2. \. соответствует точке ".".

  3. \ (\) соответствует скобкам "()".

  4. \\ соответствует разделителю пути к файлу "\".

  5. ^ соответствует началу строки.

  6. $ соответствует концу строки.

Шаблоны сравнения рассматриваются без учета регистра.

Например:

<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>
Предупреждающее замечаниеВнимание

Если в регулярном выражении есть ошибка, такая как несоответствующие или незакрытые скобки, то анализ покрытия кода не выполняется.

JJ159530.collapse_all(ru-ru,VS.110).gifДругие способы включения или исключения элементов

Примеры см. в образцах в конце этого раздела.

  • ModulePath – сборки, определенные путем файла сборки.

  • CompanyName – соответствует сборкам по атрибуту Company.

  • PublicKeyToken – соответствует подписанным сборкам по токену открытого ключа.Например, чтобы соответствовать всем компонентам и расширениям Visual Studio, используйте <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>.

  • Source – соответствует элементам по имени пути файла источника, в котором они определены.

  • Attribute – соответствует элементам, в которые вложен указанный атрибут.Укажите полное имя атрибута, включая "Attribute" в конце имени.

  • Function – соответствует процедурам, функциям или методам по полному имени.

Соответствие имени функции

Ваше регулярное выражение должно соответствовать полному имени функции, включая пространство имен, имя класса, имя метода и список параметров.Например:

  • C# или Visual Basic: 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>

Определение файлов .runsettings при выполнении тестов

JJ159530.collapse_all(ru-ru,VS.110).gifНастройка параметров запуска в тестах Visual Studio

В меню Тест выберите Параметры тестирования, затем Выбрать файл параметров тестирования и выберите файл .runsettings.В меню "Параметры тестирования" появится файл, и его можно будет выбрать или отменить.Пока он выбран, ваш файл .runsettings применяется при использовании Анализа покрытия кода.

JJ159530.collapse_all(ru-ru,VS.110).gifНастройка параметров запуска в командной строке для тестирования

Для выполнения тестов из командной строки используйте vstest.console.exe.Файл настроек является параметром этой служебной программы.Для получения дополнительной информации см. Использование VSTest.Console из командной строки.

  1. Откройте окно командной строки разработчиков Visual Studio:

    В меню Пуск Windows выберите Все программы, Microsoft Visual Studio, Microsoft Visual Studio Tools, Developer Command Prompt.

  2. Запустить:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage /Settings:CodeCoverage.runsettings

JJ159530.collapse_all(ru-ru,VS.110).gifНастройка параметров запуска в определении построения

Можно получить данные о покрытии кода из командного построения.

Задание параметров запуска в определении построения

  1. Убедитесь, что файл .runsettings выделен.

  2. В Team Explorer откройте Построения, а затем добавьте или измените определение построения.

  3. На странице Процесс разверните Автоматизированные тесты, Источник тестов, Параметры запуска.Выберите файл .runsettings.

    • Но Сборка теста появится вместо Источника теста.При попытке установки поля Параметры запуска можно выбрать только файлы .testsettings.

      В Автоматизированных тестах выберите Сборка теста и выберите [...] в конце строки.В диалоговом окне Добавить/редактировать запуск тестов установите Средство запуска тестов как Средство выполнения тестов Visual Studio.

Результаты отображаются в сводном разделе отчета о построении.

Образец файла .runsettings

Скопируйте этот код и отредактируйте его в соответствии с собственными требованиями.Это файл .runsettings по умолчанию.

<?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 https://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>

См. также

Основные понятия

Проверка кода при помощи модульных тестов

Другие ресурсы

Использование покрытия кода для определения объема протестированного кода