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


Используйте покрытие кода, чтобы определить, насколько тестируется код

Чтобы определить, какая доля кода проекта тестируется с помощью закодированных тестов, таких как модульные тесты, можно использовать функцию покрытия кода Visual Studio. Чтобы надёжно защититься от ошибок, ваши тесты должны проверять или "охватывать" большую часть вашего кода.

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

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

Требования

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

Заметка

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

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

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

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

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

    Совет

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

  2. После выполнения тестов, чтобы увидеть, какие строки были выполнены, выберите Снимок экрана меню ПОКАЗАТЬ ЦВЕТ ПОКРЫТИЯ КОДА в окне Результаты покрытия кода. По умолчанию код, охватываемый тестами, выделен в светло-синем цвете.

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

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

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

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

    Скриншот, показывающий шрифты и цвета покрытия кода

    Снимок экрана, показывающий шрифты и цвета покрытия кода.

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

Совет

Чтобы оптимизировать покрытие кода, выполните следующее:

  • Отключите оптимизацию компилятора.
  • Если вы работаете с неуправляемыми (машинным) кодом, используйте отладочную сборку.
  • Создайте PDB-файлы (символ) для каждой сборки.

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

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

Совет

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

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

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

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

Совет

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

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

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

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

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

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

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

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

Управление результатами покрытия кода

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

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

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

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

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

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

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

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

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

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

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

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

Используйте экспорт результатов для сохранения результатов операции слияния.

Ограничения при слиянии

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

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

  • При слиянии результатов тестов проекта 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( имя исключения, L"имя функции");

ExcludeSourceFromCodeCoverage( Имя исключения, L"SourceFilePath");

  • Имя исключения — это любое уникальное имя.

  • 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, чтобы получить наиболее up-to-date и комплексное представление о охвате всего проекта. Покрытие кода в 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 параметрах командной строки.

Поиск и устранение неисправностей

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