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

Функция объема протестированного кода в Visual Studio позволяет определить, какая доля кода в вашем проекте охватывается закодированными тестами, например модульными тестами. Чем больше эта доля, тем эффективнее защита от ошибок.

Анализ покрытия кода можно проанализировать как для управляемого (CLR), так и неуправляемого (машинного) кода. Поддерживаются статические и динамические инструментирование. Чтобы использовать покрытие кода в сценариях командной строки, используйте средство vstest.console.exe или Microsoft.CodeCoverage.Console, которое является расширением для dotnet-coverage, который также поддерживает машинный код.

Эта функция доступна в меню "Тестирование" при запуске методов тестов в Обозревателе тестов. Таблица результатов отображает процент кода, выполняемого в каждой сборке, каждом классе и каждой процедуре. В редакторе исходного кода выделяется протестированный код. Результаты можно экспортировать в популярных форматах, таких как Cobertura.

Требования

Функция проверки объема протестированного кода доступна только в выпуске Visual Studio Enterprise.

Примечание.

Для покрытия кода .NET можно также использовать средство командной строки dotnet-coverage.

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

  1. В меню Тестирование выберите Анализ покрытия кода для всех тестов.

    Снимок экрана меню

    Снимок экрана меню

    Совет

    Анализ объема протестированного кода также можно запускать в окне средства Обозреватель тестов.

  2. После выполнения тестов, чтобы узнать, какие строки были запущены, в окне "Результаты покрытия кода" выберите Снимок экрана: меню "Показать цветпокрытия кода". По умолчанию код, охватываемый тестами, выделяется голубым цветом.

    Снимок экрана с выделенным объемом протестированного кода.

    Снимок экрана с выделенным объемом протестированного кода.

    В раскрывающемся списке для параметра цвета покрытия кода можно выбрать, применяется ли цвет к строкам кода, глифам в левом поле или обоим.

  3. Чтобы изменить цвета или использовать полужирное лицо, выберите "Параметры>параметров среды>">"Шрифты и цвета>" для: текстовый редактор. В разделе Отображаемые элементы настройте параметры для элементов покрытия, например Области вне покрытия кода.

    Снимок экрана с шрифтами и цветами для объема протестированного кода.

    Снимок экрана с шрифтами и цветами для объема протестированного кода.

  4. Если результаты показывают малый объем протестированного кода, определите, какие части кода не обрабатываются, и напишите дополнительные тесты для их охвата. Команды разработчиков обычно стремятся покрыть около 80 % кода. В некоторых случаях допустимо более низкое покрытие. Например, более низкое покрытие допустимо, когда некоторый код создается из стандартного шаблона.

Совет

Чтобы оптимизировать объем протестированного кода:

  • отключите оптимизацию компилятора;
  • при работе с неуправляемым (машинным) кодом используйте отладочную сборку;
  • создавайте для каждой сборки файлы символов .pdb.

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

Не забудьте снова выполнить покрытие кода после обновления кода. Когда вы модифицируете код или запускаете тесты, предыдущие результаты и цвета объема протестированного кода автоматически не обновляются.

Совет

Начиная с Visual Studio 2022 с обновлением 2 можно ускорить результаты теста покрытия кода, выбрав Сервис > Параметры > Среда > Предварительные версии функций , а затем нажав Улучшения возможностей покрытия кода и перезапустив Visual Studio.

Отчеты в блоках или строках

Покрытие кода измеряется в блоках. Блок — это часть кода строго с одной точкой входа и точкой выхода. Если поток управления программы проходит через блок во время тестового запуска, то этот блок учитывается как покрытый. То, сколько раз используется блок, не влияет на результат.

Можно также отобразить результаты для строк, выбрав Добавить или удалить столбцы в заголовке таблицы. Некоторые пользователи предпочитают считать в строках, поскольку процентные соотношения более точно соответствуют размеру фрагментов, которые можно увидеть в исходном коде. Длинный блок вычислений учитывается как единый блок, даже если он занимает большое количество строк.

Совет

Строка кода может содержать более одного блока кода. В этом случае, если во время тестового запуска все блоки кода были обработаны в любой строке, она учитывается как одна строка. Если обработаны только некоторые блоки в строке, она считается частичной строкой.

Фильтрация результатов покрытия кода

В окне "Результаты покрытия кода" обычно отображается результат для всего решения. Результаты можно отфильтровать, чтобы отобразить результаты только для файлов, которые были обновлены в текущей ветви.

  • Чтобы просмотреть отчет об изменении, щелкните значок "Настройка представлений покрытия кода" в окне "Результаты покрытия кода". Затем выберите "Отчет об изменениях" в раскрывающемся списке содержимого отчета. Обновите активный репозиторий и базовую ветвь, чтобы сравнить с ним, чтобы предоставить отчет о сравнении.

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

  • Чтобы выполнить поиск по имени (показать только те, которые совпадают со строкой поиска в окне), введите строку поиска в поле поиска.
  • Чтобы отфильтровать по типу , введите имя типа в поле поиска.
  • Чтобы отобразить все поля поиска, удалите его.
  • Чтобы показать 100 % полностью охваченного, в поле поиска введите "Покрыто (%Линии)":"100".
  • Чтобы показать (0% && < 100%) частично охвачено, введите "Частично покрытые (>%линии)":"<#"#", заменив ## процентом, охваченным процентом.
  • Чтобы показать 0 % покрытия, в поле поиска введите "Не охвачено (%Линии)":"0".

Управление результатами по объемам протестированного кода

В окне Результаты покрытия кода, как правило, отображается результат последнего запуска. Результаты изменятся, если изменить данные тестов или если каждый раз выполнять только часть тестов.

Окно Результаты покрытия кода также позволяет просмотреть результаты, полученные ранее или на других компьютерах.

Можно объединить результаты нескольких запусков, например тех, что используют различные данные теста.

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

  • Чтобы просмотреть результаты предыдущего сеанса, щелкните Импортировать результаты покрытия кода, перейдите к папке TestResults в своем решении и импортируйте файл COVERAGE.

    Цвета отображения покрытия могут быть неверными, если исходный код был изменен с момента создания файла COVERAGE.

  • Чтобы представить результаты в виде текста, щелкните Экспортировать результаты покрытия кода. Будет создан удобочитаемый файл с расширением .coveragexml, который можно обработать в других инструментах или отправить по почте. Вы также можете выбрать форматы экспорта, такие как Cobertura.

  • Чтобы отправить результаты другому пользователю, отправьте файл COVERAGE или экспортированный файл COVERAGEXML. Получатели могут затем импортировать файл. Если у них та же версия исходного кода, то они смогут увидеть цвета отображения покрытия.

Объединение результатов различных запусков

В некоторых ситуациях будут использоваться разные блоки в коде в зависимости от данных теста. Поэтому может потребоваться объединить результаты различных тестовых запусков.

Например, предположим, что при выполнении теста со входными данными "2" обнаружилось, что покрыто 50 % определенной функции. А при повторном выполнении теста со входными данными "-2" вы видите, что проверены остальные 50 % функции. Теперь вы можете объединить результаты двух тестовых запусков, и тогда в отчете и представлении цветов покрытия кода будет видно, что охвачено 100 % данной функции.

Для этого используйте Значок кнопки слияния в окне покрытия кода.результаты покрытия кода слиянием. Можно выбрать любые сочетания последних запусков или импортированных результатов. Если требуется объединить экспортированные результаты, в первую очередь необходимо их импортировать.

Щелкните Экспортировать результаты покрытия кода, чтобы сохранить результаты операции слияния.

Ограничения объединения

  • При объединении данных объема протестированного кода из разных версий кода результаты будут отображаются отдельно, а не в совокупности. Чтобы получить полностью объединенные результаты, используйте одну ту же сборку кода и изменяйте только данные теста.

  • При слиянии файла результатов, который был экспортирован, а затем импортирован, результаты можно просматривать только по строкам, но не по блокам. Используйте команду Добавить или удалить столбцы, чтобы отобразить данные по строкам.

  • При объединении результатов тестов проекта ASP.NET результаты отдельных тестов будут отображаться, но не объединяться. Это действует только непосредственно для артефактов ASP.NET: результаты всех других сборок будут объединяться.

Исключение элементов из результатов покрытия кода

Иногда требуется исключить конкретные элементы в коде из результатов покрытия, например, если код создан из текстового шаблона. Добавьте атрибут System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute в любой из таких элементов кода: класс, структура, метод, свойство, метод задания свойства или метод получения свойства, событие.

Совет

Исключение класса не исключает его производные классы.

Например:

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 { ... }

Используйте следующие макросы:

ExcludeFromCodeCoverage(ExclusionName, L"FunctionName");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");

  • ExclusionName — любое уникальное имя.

  • FunctionName — полное имя функции. Оно может содержать знаки подстановки. Например, чтобы исключить все функции класса, напишите MyNamespace::MyClass::*

  • SourceFilePath — локальный или UNC-путь к файлу .cpp. Оно может содержать знаки подстановки. В следующем примере исключаются все файлы из определенного каталога: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • Поместите вызовы макроса исключения в глобальное пространство имен, а не внутри любого пространства имен или класса.

  • Исключения можно поместить в файл кода модульного теста или в файл кода приложения.

  • Исключения должны компилироваться как неуправляемый (машинный) код с помощью настройки параметра компилятора или с помощью #pragma managed(off).

Примечание.

Чтобы исключить функции в коде C++/CLI, примените атрибут [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] к функции. Эта процедура не отличается от C#.

Включение или исключение дополнительных элементов

Анализ покрытия кода выполняется только для загруженных сборок, для которых PDB-файл доступен в том же каталоге, что и DLL-файл или EXE-файл. Поэтому в некоторых обстоятельствах можно расширить набор сборок, включенный путем получения копий соответствующих PDB-файлов.

Можно обеспечить более полное управление выбором сборок и элементов для включения в анализ покрытия кода путем записи файла RUNSETTINGS. Например, можно исключить сборки определенных типов, не добавляя атрибуты к их классам. См. дополнительные сведения по настройке анализа объема протестированного кода.

Анализ покрытия кода в Azure Pipelines

После возврата измененного кода ваши тесты будут выполняться на сервере сборки вместе с тестами других членов команды. Анализ объема протестированного кода в Azure Pipelines дает наиболее актуальное и исчерпывающее представление о тестировании в масштабе всего проекта. Такой анализ также включает автоматические системные тесты и другие закодированные тесты, которые обычно не выполняются на компьютерах разработчиков.

Анализ объема протестированного кода в командной строке

Для выполнения тестов из командной строки используйте служебную программу vstest.console.exe. Объем протестированного кода вызывается в vstest.console.exe с помощью параметра /EnableCodeCoverage.

  1. Запустите командную строку разработчика Visual Studio.

    В меню Пуск Windows выполните поиск по тексту Developer Command Prompt for VS и выберите соответствующее приложение в результатах.

  2. В командной строке введите следующую команду:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

    Совет

    Начальный каталог оболочки PowerShell для разработчика — это расположение проекта Visual Studio. Замените MyTestAssembly.dll на путь и имя тестового файла. Дополнительные сведения см. в статье Параметры командной строки для VSTest.Console.exe.

Устранение неполадок

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