Использование покрытия кода для определения объема протестированного кода
Чтобы определить, какая часть кода проекта в действительности тестируется закодированными тестами, такими как модульные тесты, можно воспользоваться функцией покрытия кода в Visual Studio.Для обеспечения эффективной защиты от ошибок тесты должны выполнять ("покрывать") большую часть кода.
Анализ покрытия кода может применяться и к управляемому (CLI), и к неуправляемому (машинному) коду.
Покрытие кода возможно при выполнении методов тестов с помощью обозревателя тестов.В таблице результатов отображается процент кода, который был выполнен в каждой сборке, классе и методе.Кроме того, редактор исходного кода показывает, какой код был протестирован.
Требования
- Visual Studio Ultimate, Visual Studio Premium
Анализ покрытия кода в модульных тестах в обозревателе тестов
В меню Тест щелкните Анализ покрытия кода.
Чтобы просмотреть, какие строки были выполнены, щелкните Цвета отображения покрытия кода.
Чтобы изменить цвета или использовать полужирный шрифт, последовательно щелкните Сервис, Параметры, Среда, Шрифты и цвета, Параметры для, Текстовый редактор.В разделе Отображаемые элементы настройте элементы покрытия.
Если результаты показывают низкое покрытие, проверьте, какие части кода не обрабатываются, и напишите несколько дополнительных тестов для их покрытия.Команды разработчиков обычно стремятся покрыть около 80 % кода.В некоторых случаях допустимо более низкое покрытие.Например, более низкое покрытие допустимо, когда некоторый код создается из стандартного шаблона.
Совет |
---|
Чтобы получить точные результаты, выполните следующие действия.
Если полученный результат отличается от желаемого, см. раздел Устранение неполадок с покрытием кода. .Не забудьте снова выполнить покрытие кода после обновления кода.Результаты покрытия и цвета кода не обновляются автоматически после изменения кода или при выполнении тестов. |
Отчеты в блоках или строках
Объем покрытого кода подсчитывается в блоках.Блок — это часть кода с одной точкой входа и точкой выхода. Если поток управления программы проходит через блок во время тестового запуска, то этот блок учитывается как покрытый.Количество раз, когда используется блок, не влияет на результат.
Результаты также можно отобразить в виде строк, щелкнув Добавить или удалить столбцы в заголовке таблицы.Если во время тестового запуска все блоки кода были обработаны в любой строке кода, она учитывается как одна строка.Если строка содержит несколько блоков кода, одни из которых были обработаны, а другие — нет, то она учитывается как частичная строка.
Некоторые пользователи предпочитают считать в строках, поскольку процентные соотношения более точно соответствуют размеру фрагментов, которые можно увидеть в исходном коде.Длинный блок вычислений учитывается как единый блок, даже если он занимает большое количество строк.
Управление результатами покрытия кода
В окне "Результаты покрытия кода", как правило, отображается результат последнего запуска.Результаты изменятся, если изменить данные тестов или если каждый раз выполнять только часть тестов.
Окно покрытия кода также можно использовать для просмотра предыдущих результатов или результатов, полученных на других компьютерах.
Можно объединить результаты нескольких запусков, например тех, что используют различные данные теста.
Чтобы просмотреть предыдущий набор результатов, выберите его в раскрывающемся меню.В меню отображается временный список, который очищается при открытии нового решения.
Чтобы просмотреть результаты предыдущего сеанса, щелкните Импортировать результаты покрытия кода, перейдите к папке TestResults в своем решении и импортируйте COVERAGE-файл.
Цвета отображения покрытия могут быть неверными, если исходный код был изменен с момента создания COVERAGE-файла.
Чтобы представить результаты в виде текста, щелкните Экспортировать результаты покрытия кода.Это приведет к созданию доступного для чтения COVERAGEXML-файла, который можно обработать другими средствами или легко отправить по почте.
Чтобы отправить результаты другому пользователю, отправьте COVERAGE-файл или экспортированный COVERAGEXML-файл.Получатели могут затем импортировать файл.Если у них та же версия исходного кода, то они смогут увидеть цвета отображения покрытия.
Объединение результатов различных запусков
В некоторых ситуациях будут использоваться разные блоки в коде в зависимости от данных теста.Поэтому может потребоваться объединить результаты различных тестовых запусков.
Например, предположим, что при выполнении теста со входными данными "2" обнаружилось, что покрыто 50 % определенной функции.При выполнении теста во второй раз со входными данными "-2 " в представлении расцветки покрытия видно, что покрыты другие 50% данной функции.Теперь можно объединить результаты двух тестовых запусков, чтобы в отчете и представлении расцветки покрытия было видно, что покрыто 100 % данной функции.
Для этого щелкните Объединить результаты покрытия кода.Можно выбрать любые сочетания последних запусков или импортированных результатов.Если требуется объединить экспортированные результаты, в первую очередь необходимо их импортировать.
Щелкните Экспортировать результаты покрытия кода, чтобы сохранить результаты операции объединения.
Ограничения объединения
При объединении данных покрытия из различных версий кода результаты отображаются отдельно, но они не объединяются.Чтобы получить полностью объединенные результаты, используйте одну ту же сборку кода и изменяйте только данные теста.
При объединении файла результатов, который был экспортирован, а затем импортирован, результаты можно просматривать только по строкам, но не по блокам.Используйте команду Добавить или удалить столбцы для отображения данных по строкам.
При объединении результатов тестов проекта 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
{ ... }
Исключение элементов в машинном коде 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#. |
Включение или исключение дополнительных элементов
Анализ покрытия кода выполняется только для загруженных сборок, для которых PDB-файл доступен в том же каталоге, что и DLL-файл или EXE-файл.Поэтому в некоторых обстоятельствах можно расширить набор сборок, включенный путем получения копий соответствующих PDB-файлов.
Можно обеспечить более полное управление выбором сборок и элементов для включения в анализ покрытия кода путем записи RUNSETTINGS-файла.Например, можно исключить сборки определенных типов, не добавляя атрибуты к их классам.Дополнительные сведения см. в разделе Настройка анализа покрытия кода.
Анализ покрытия кода в службе сборки
При проверке кода тесты будут выполняться на сервере сборки вместе с другими тестами от других членов команды. (Если вы еще это не настроили, см. раздел Выполнение тестов в процессе сборки.) Анализировать покрытие кода в службе сборки полезно, поскольку это дает наиболее актуальную и исчерпывающую картину покрытия во всем проекте.Сюда также входят автоматические системные тесты и другие закодированные тесты, которые обычно не выполняются на компьютерах разработчиков.
В Team Explorer откройте меню Сборки, а затем добавьте или измените определение сборки.
На странице Процесс разверните Автоматизированные тесты, Исходный код теста, Параметры запуска.Задайте для параметра Тип файла параметров запуска значение Покрытие кода включено.
При наличии нескольких определений исходного кода теста повторите этот шаг для каждого из них.
Однако не существует поля с именем Тип файла параметров запуска.
В разделе Автоматизированные тесты щелкните Тестовая сборка и нажмите кнопку с многоточием [...] в конце строки.В диалоговом окне Добавить/изменить тестовый запуск в разделе Средство выполнения тестов щелкните Средство выполнения тестов Visual Studio.
После выполнения сборки результаты покрытия кода присоединяются к тестовому запуску и отображаются в сводке сборки.
Анализ покрытия кода в командной строке
Для выполнения тестов из командной строки используйте vstest.console.exe.Покрытие кода входит в возможности этой служебной программы.Дополнительные сведения см. в разделе Параметры командной строки для VSTest.Console.exe.
Запустите командную строку разработчика Visual Studio.
В меню Пуск Windows последовательно щелкните Все программы, Microsoft Visual Studio, Инструменты Visual Studio, Командная строка разработчика.
Выполните следующий файл.
vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
Устранение неполадок
Если результаты покрытия кода не отображаются, см. раздел Устранение неполадок с покрытием кода.
Внешние ресурсы
Руководство
См. также
Основные понятия
Настройка анализа покрытия кода