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


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

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

Анализ покрытия кода могут применяться и к управлянному CLI () и неуправляемый (собственный код).

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

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

Требования

  • Visual Studio Ultimate, Visual Studio Premium

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

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

  2. Чтобы увидеть, какие строки были выполнены, выберите Значок цветов отображения покрытия кодаЦвета отображения покрытия кода.

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

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

СоветСовет

Чтобы получить точные результаты:

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

    При работе с собственным кодом (автономные), используйте построение отладки.

  • Убедитесь, что файлы .pdb (символов) создаются для каждой сборки.

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

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

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

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

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

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

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

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

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

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

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

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

  • Чтобы представить результаты в виде текста, выберите пункт Экспортировать результаты покрытия кода.Это приведёт к созданию доступного для чтения .coveragexml-файла, который можно обрабатывать с другими инструментами или легко отправлять по почте.

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

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

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

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

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

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

Dd537628.collapse_all(ru-ru,VS.110).gifОграничения слияния

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

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

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

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

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

Например:

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

Dd537628.collapse_all(ru-ru,VS.110).gifИсключение элементов в неуправляемом коде C++

Чтобы исключить неуправляемые элементы в коде C++:

#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)

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

-
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#.

Dd537628.collapse_all(ru-ru,VS.110).gifВключение и исключение дополнительных элементов

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

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

Анализ покрытия кода в службе построения

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

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

  2. На странице Процесс разверните Автоматизированные тесты, Источник тестов, Параметры запуска.Установите Тип файла параметров запуска в Покрытие кода включено.

    Если определений источников тестов больше одного, повторите этот шаг для каждого.

    • Однако не существует поля с именем Тип файла параметров запуска.

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

Задание определения построения для покрытия кода

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

Анализ покрытия кода в командной строке

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

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

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

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

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage

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

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

Внешние ресурсы

Dd537628.collapse_all(ru-ru,VS.110).gifРуководство

Проверка непрерывной работы с Visual Studio 2012 – Chapter 2: Модульное тестирование: Тестирование внутри

См. также

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

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

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

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