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


Настройка и использование Live Unit Testing

При разработке приложения Live Unit Testing автоматически запускает все затронутые модульные тесты в фоновом режиме и отображает результаты и покрытие кода в режиме реального времени. При изменении кода Live Unit Testing предоставляет отзывы о том, как изменения повлияли на существующие тесты и о том, охватывает ли добавленный новый код одним или несколькими существующими тестами. Этот отзыв напоминает вам писать модульные тесты при исправлении ошибок или добавлении новых функций.

При использовании Live Unit Testing для тестов сохраняется данные о состоянии тестов. Использование сохраненных данных позволяет Live Unit Testing обеспечить более высокую производительность при динамическом выполнении тестов в ответ на изменения кода.

Live Unit Testing доступен только в выпуске Enterprise Visual Studio для проектов, предназначенных для .NET Core или .NET Framework.

Поддерживаемые платформы тестирования

Live Unit Testing работает с тремя популярными платформами модульного тестирования, перечисленными в следующей таблице. Также показана минимальная поддерживаемая версия своих адаптеров и платформ. Платформы модульного тестирования доступны в NuGet.org.

Тестовая платформа Минимальная версия адаптера Visual Studio Минимальная версия платформы
xUnit.net xunit.runner.visualstudio версии 2.2.0-beta3-build1187 xunit 1.9.2
NUnit NUnit3TestAdapter версии 3.5.1 NUnit версии 3.5.0
MSTest MSTest.TestAdapter 1.1.4-preview MSTest.TestFramework 1.0.5-preview

Если у вас есть старые тестовые проекты на основе MSTest, ссылающиеся на Microsoft.VisualStudio.QualityTools.UnitTestFramework, и вы не хотите переходить к новым пакетам NuGet MSTest, обновите до Visual Studio 2019 или Visual Studio 2017.

В некоторых случаях для работы средства Live Unit Testing может потребоваться явно восстановить пакеты NuGet, на которые ссылается проект. У вас есть два варианта:

  • Восстановите, выполнив явную сборку решения. Выберите Сборка>Перестроить решение в меню Visual Studio верхнего уровня.
  • Восстановите пакеты в решении. Щелкните решение правой кнопкой мыши и выберите "Восстановить пакеты NuGet".

Настройка

При первом запуске Live Unit Testing для решения мастер настройки поможет сконфигурировать процесс сборки и выполнения тестов.

При остановке Live Unit Testing можно также открыть мастер установки, перейдя в раздел Тест>Live Unit Testing>Настроить Live Unit Testing для решения.

При запуске Live Unit Testing создается рабочая область, которая является копией исходного репозитория. Затем Live Unit Testing применяет любые несохраненные изменения, внесенные в Visual Studio в рабочую область, выполняет сборку, выполняет тестовый запуск и сообщает о последнем охвате кода.

Первое, что нужно настроить с помощью мастера, — это откуда и куда должны копироваться файлы.

Снимок экрана, на котором показан мастер настройки Live Unit Testing 1.

Корневой каталог репозитория

Корневой каталог репозитория указывает папку, которая будет скопирована для создания рабочей области Live Unit Testing. Это должна быть корневая папка репозитория, то есть она должна содержать все источники, двоичные файлы и средства. В случаях, когда файл решения отсутствует в корневом каталоге репозитория, может потребоваться изменить корневой каталог репозитория.

Корневой каталог рабочей области

Корневой каталог рабочей области указывает папку, в которой Live Unit Testing сохраняет клон репозитория. Следите за исключениями, указывающими на то, что путь слишком длинный. По умолчанию корневой каталог создается в домашней папке. Однако в качестве примера, если обычно необходимо создать репозиторий на диске C, корень рабочей области может быть изменен на что-то подобное C:\lut\Repo.

Указание исключенных файлов

Не все файлы должны быть скопированы в рабочую область Live Unit Testing. Все артефакты, созданные во время сборки, должны быть исключены из копирования, чтобы обычные сборки не мешали сборкам Live Unit Testing. Кроме того, обычная nuget restore команда не должна мешать команде Live Unit Testing nuget restore .

По умолчанию Live Unit Testing исключает один из двух шаблонов файлов:

  • Для репозиториев Git файлы, указанные в файле gitignore , не копируются в рабочую область Live Unit Testing.
  • Для репозиториев, отличных от Git, базовый список папок, таких как bin/ и obj/, не копируются в рабочую область Live Unit Testing.

Для более сложных репозиториев может потребоваться указать собственный файл игнорирования. <Выберите параметр "Custom"> в мастере. После того, как вы выберете Далее, отобразится содержимое настраиваемого файла исключений, созданного Live Unit Testing после завершения мастера. Это файл lutignore .

Замечание

Для некоторых репозиториев Git требуется пользовательский файл lutignore , так как можно проверить файлы в репозитории Git, которые также игнорируются файлом Gitignore . Без пользовательского файла lutignore Live Unit Testing не копирует эти файлы, что может привести к сбоям сборки.

Структура файлов Lutignore

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

[Bb]in
[Oo]bj
# WILL NOT COPY ANY BIN AND OBJ FOLDERS TO THE LIVE UNIT TESTING WORKSPACE

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

[Aa]rtifacts/
# WILL NOT COPY THE ARTIFACTS FOLDER TO THE LIVE UNIT TESTING WORKSPACE

Если репозиторий включает в папку сборки другие средства, эти средства следует исключить в наборе соответствующих шаблонов:

[Aa]rtifacts/
![Aa]rtifacts/tools/
# WILL NOT COPY THE ARTIFACTS FOLDER TO THE LIVE UNIT TESTING WORKSPACE
# HOWEVER IT WILL COPY THE TOOLS SUBFOLDER THAT MIGHT CONTAIN TOOLS AND UTILITIES

Параметры сборки

Вторая часть страницы конфигурации мастера — это настройка параметров сборки:

  • Создание PDB-файлов: Чтобы ускорить сборку, Live Unit Testing не создает PDB-файлы во время сборки. Эти файлы символов позволяют переходить к трассировкам стека при возникновении сбоев в тестах.
  • Сборка с помощью нескольких ядер ЦП. По умолчанию Live Unit Testing выполняет сборки с помощью нескольких ядер ЦП, что улучшает время сборки. Если компьютер замедляет работу или если решение не будет создано с помощью нескольких процессоров, не выбирайте этот параметр.

Параметры тестового запуска

Последняя часть страницы конфигурации мастера — настройка параметров тестового запуска:

  • Тайм-аут теста: Некоторые тесты могут выполняться длительное время. Установка этого поля автоматически прерывает выполнение, если любой из тестов превышает определенное время. Тесты можно отменить автоматически.
  • Использование нескольких процессоров. По умолчанию Live Unit Testing пытается использовать несколько процессоров для ускорения выполнения производительности. Если компьютер замедляет работу или если решение не может выполнять тесты параллельно, не выбирайте этот параметр. Например, эти сценарии могут произойти, если несколько тестов пытаются записывать и считывать данные из одного пути к файлам.

Дополнительная конфигурация

Настройте Live Unit Testing, выбрав"Параметры>" в строке меню Visual Studio верхнего уровня.

В области параметров разверните Все настройки>Тест>Живое модульное тестирование.

Снимок экрана: параметры конфигурации Live Unit Testing.

В диалоговом окне "Параметры" разверните раздел"Общие>".

Снимок экрана: параметры конфигурации Live Unit Testing.

После включения Динамического модульного тестирования (см. раздел "Пуск", "Приостановить" и "Остановить Live Unit Testing") можно снова открыть параметры, выбравпараметры>>.

К настраиваемым параметрам относятся:

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

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

  • Возможность удаления всех сохраненных данных. Эта возможность полезна, если Live Unit Testing работает в непредсказуемом или неожиданном способе, что свидетельствует о том, что сохраненные данные повреждены.

  • Максимальный объем памяти, которую могут использовать процессы Live Unit Testing.

  • Уровень информации, записываемой в окно выходных данных Live Unit Testing.

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

    Вы также можете отобразить подробный вывод в окне Live Unit Testing Output, назначив значение 1 переменной среды уровня пользователя, названной VS_UTE_DIAGNOSTICS. Затем перезапустите Visual Studio.

    Чтобы записать подробные сообщения журнала MSBuild из Live Unit Testing в файле, задайте LiveUnitTesting_BuildLog для переменной среды уровня пользователя имя файла, чтобы он содержал журнал.

Настройте сборку для Live Unit Testing

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

Добавить переопределения для Live Unit Testing

Если для решения требуются пользовательские шаги для создания инструментирования (Live Unit Testing), которые не требуются для обычной неинструментируемой сборки, вы можете добавить код в ваш проект или .targets файлы, который проверяет наличие BuildingForLiveUnitTesting свойства и выполняет пользовательские шаги перед сборкой и после неё.

Например, можно написать следующий пример, чтобы добавить еще один целевой объект, выполняемый только для Live Unit Testing:

<Target Name="GenerateNuGetPackages" BeforeTargets="AfterBuild" Condition="'$(BuildingForLiveUnitTesting)' == 'true'">
    <Exec Command='"$(MSBuildThisFileDirectory)..\tools\GenPac" '/>
</Target>

Свойство можно использовать BuildingForLiveUnitTesting для отключения некоторых задач, которые не должны выполняться для тестовых сборок. Например, Live Unit Testing устанавливается для отключения анализаторов в тестах.

Зависимости тестов Live Unit Testing

Возможно, не все файлы были скопированы, необходимые для выполнения тестов. Live Unit Testing создает отдельную папку, в которой выполняется тестирование. Это позволяет выполнять сборки во время выполнения тестов, но не все файлы из папки сборки копируются в тестовую папку.

Как правило, вы добавляете тестовые зависимости по одной из двух причин:

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

Замечание

Тестовые зависимости должны существовать в каталоге, указанном в качестве корневого каталога в мастере установки.

В обоих случаях Live Unit Testing по умолчанию не копирует эти файлы для минимизации количества файлов, которые необходимо скопировать для выполнения теста. Эти файлы необходимо явно указать с помощью LiveUnitTestingTestDependency свойства, если они необходимы для тестового запуска. Например, предположим, что у нас есть следующий макет:

SRC/
  CONSOLE_UTILITY/
  TEST_PROJECT/
ARTIFACTS/
  CONSOLE_UTILITY/NET472/DEBUG/
  TEST_PROJECT/NET472/DEBUG/

По умолчанию, при сборке этих проектов с помощью Live Unit Testing, элемент Artifacts/Test_Project копируется только в тестовую папку. Чтобы добавить источники или "console_utility" в тестовую папку, вставьте следующий пример в test_project.csproj:

<LiveUnitTestingTestDependency Include=”$(RepoRoot)/Src/ConsoleUtility” />
<LiveUnitTestingTestDependency Include=”$(RepoRoot)/Artifacts/ConsoleUtility/net472/$(Configuration)/</LiveUnitTestingTestDependency” />

Запуск, приостановка и остановка

Чтобы включить Live Unit Testing, выберите "Тест>Live Unit Testing>Start " в меню Visual Studio верхнего уровня. Если Live Unit Testing включен, параметры, доступные в меню Live Unit Testing, изменяются с одного элемента Запустить на Пауза и Остановить:

  • Приостановка временно приостанавливает динамическое модульное тестирование.

    При приостановке Динамического модульного тестирования визуализация покрытия не отображается в редакторе, но все собранные данные сохраняются. Чтобы возобновить Live Unit Testing, выберите "Продолжить " в меню Live Unit Testing . Live Unit Testing выполняет необходимую работу, чтобы догнать все изменения, сделанные во время приостановки, и соответствующим образом обновляет глифы.

  • Остановка полностью останавливает Live Unit Testing. Live Unit Testing удаляет все собранные данные.

Если вы запускаете Live Unit Testing в решении, не включающем проект модульного теста, параметры приостановки и остановки отображаются в меню Live Unit Testing, но Live Unit Testing не запускается. В окне вывода отображается сообщение, которое начинается: "В этом решении не ссылаются поддерживаемые адаптеры тестирования...".

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

Включение и исключение тестовых проектов и методов тестирования

При запуске Live Unit Testing откроется окно средства Live Unit Testing и предложит выбрать набор тестов, которые вы хотите протестировать с помощью Live Unit Testing.

Снимок экрана: окно средства, показанное при первом запуске Live Unit Testing.

Для небольших решений, где модульные тесты выполняются за короткое время, выберите "Включить все тесты", что заставляет Live Unit Testing выполнять все тесты.

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

Вы выбираете, какую функцию Live Unit Testing следует запустить, изменив список воспроизведения Live Unit Testing, функцию, которая работает так же, как списки воспроизведения в обозревателе тестов.

Существует несколько способов редактирования списка воспроизведения Live Unit Testing:

  • Окно средства Динамического модульного тестирования
  • Окно редактора кода
  • Обозреватель решений
  • Программно в тестовом коде

Live Unit Testing сохраняет состояние включения и исключения в качестве параметра пользователя и запоминает его при закрытии и повторном открытии решения.

Окно средства Динамического модульного тестирования

Редактор плейлистов вкладки Live Unit Testing можно использовать для включения или исключения проектов, пространств имен или классов из выполнения. Выберите "Изменить список воспроизведения " в окне инструментов.

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

Снимок экрана редактора списка воспроизведения для Live Unit Testing.

Окно редактора кода

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

  • Динамическое модульное тестирование>Включить <выбранный метод>
  • Динамическое модульное тестирование>Исключить <выбранный метод>
  • Live Unit Testing>Исключить все кроме <выбранного метода>

Обозреватель решений

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

  1. Щелкните правой кнопкой мыши на решение в Обозревателе решений и выберите Live Unit Testing>Исключить, чтобы исключить все решение.
  2. Щелкните правой кнопкой мыши каждый тестовый проект, который требуется включить в тесты, и выберите Live Unit Testing>Include.

Программно в тестовом коде

Вы можете применить атрибут ExcludeFromCodeCoverageAttribute для программного исключения методов, классов или структур из отчетов о покрытии в Live Unit Testing.

Используйте следующие атрибуты, чтобы исключить отдельные методы из Live Unit Testing:

  • xUnit: [Trait("Category", "SkipWhenLiveUnitTesting")]
  • NUnit: [Category("SkipWhenLiveUnitTesting")]
  • MSTest: [TestCategory("SkipWhenLiveUnitTesting")]

Используйте следующие атрибуты, чтобы исключить всю сборку тестов из Live Unit Testing:

  • xUnit: [assembly: AssemblyTrait("Category", "SkipWhenLiveUnitTesting")]
  • NUnit: [assembly: Category("SkipWhenLiveUnitTesting")]
  • MSTest: [assembly: TestCategory("SkipWhenLiveUnitTesting")]

Просмотр визуализации покрытия

После включения Live Unit Testing обновляет визуальное отображение каждой строки кода в редакторе Visual Studio, чтобы показать, покрыт ли код модульными тестами и проходят ли тесты, охватывающие его.

На следующем рисунке показаны строки кода с успешными и неудачными проверками, а также строки кода, не охваченные тестами. Линии с зеленым "✓ охватываются только прохождением тестов. Линии с красным "x" охватываются одним или несколькими неудачными тестами. Линии с синим "➖" не охватываются никаким тестом.

Снимок экрана, который показывает покрытие кода в Visual Studio.

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

Снимок экрана, показывающий покрытие кода в Visual Studio со значком таймера.

Получение сведений о состоянии теста

Наведите указатель мыши на символ успеха или провала в окне кода. Вы увидите, сколько тестов попадает в эту строку. Чтобы просмотреть состояние отдельных тестов, выберите символ.

Снимок экрана: состояние теста для символа в Visual Studio.

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

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

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

Снимок экрана, показывающий сведения о подсказке для сбойного теста в Visual Studio.

Когда вы перейдете к неудачному тесту, Live Unit Testing визуально указывает в подписи метода тесты, которые имеют:

  • Передано (обозначено полуполной мензуркой вместе с зеленым "✓").
  • Сбой (обозначается полуполной мензуркой вместе с красным "🞩").
  • Не участвуют в Live Unit Testing (обозначены полузаполненной мензуркой вместе с синим "➖").

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

Скриншот, показывающий тестовые методы в Visual Studio с символами, обозначающими успешные или неуспешные результаты.

Диагностика и исправление ошибок тестирования

Сбой теста позволяет легко отлаживать код продукта, вносить изменения и продолжать разработку приложения. Так как Live Unit Testing выполняется в фоновом режиме, во время отладки, редактирования и продолжения цикла не требуется останавливать и перезапустить Live Unit Testing.

Например, сбой теста, показанный на предыдущем изображении, был вызван неправильным предположением в методе теста, что неалфавитные символы возвращают true при передаче в метод System.Char.IsLower. После исправления метода теста все тесты должны пройти. Вам не нужно приостановить или остановить Live Unit Testing.

Окно Live Unit Testing

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

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

Вы можете запустить Live Unit Testing, выбрав "Тест>Live Unit Testing>Start" в меню Visual Studio верхнего уровня. Вы также можете открыть окно Live Unit Testing через Вид>Другие окна>Окно Live Unit Testing.

Вы можете заметить в окне Live Unit Testing , что некоторые тесты исчезают. Например, при остановке и перезапуске Live Unit Testing окно Live Unit Testing исчезает все тесты, как показано на следующем рисунке.

Устаревшие результаты теста указывают на то, что тест не был частью последнего запуска Live Unit Test. Тесты выполняются только при обнаружении изменений в тесте или его зависимостях. Если изменений нет, это позволяет избежать ненужного запуска теста. В этом случае затенённый результат теста по-прежнему считается актуальным, хотя он не был частью последнего запуска.

Снимок экрана, на котором показаны устаревшие тесты в обозревателе тестов.

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

Существуют некоторые различия между автоматическим запуском и обновлением результатов тестирования в Live Unit Testing и ручным выполнением тестов из обозревателя тестов. К таким различиям относятся:

  • Выполнение или отладка тестов из окна обозревателя тестов выполняет обычные двоичные файлы. Live Unit Testing запускает инструментированные двоичные файлы.
  • Live Unit Testing не создает новый домен приложения для выполнения тестов. Вместо этого он выполняет тесты из домена по умолчанию. Тесты, выполняемые в окне обозревателя тестов , создают новый домен приложения.
  • Live Unit Testing выполняет тесты в каждой тестовой сборке последовательно. В окне обозревателя тестов можно одновременно запускать несколько тестов.

Отменить выполнение тестов Live Unit Testing

Live Unit Testing постоянно выполняет тесты при внесении изменений в код. Если выполнение запущено, и вы вносите дополнительные изменения в код, Live Unit Testing ставит в очередь еще один запуск, пока дожидается завершения первого запуска.

При сохранении файлов Live Unit Testing отменяет первый запуск и немедленно планирует выполнение запланированной очереди. Этот процесс помогает в сценариях, когда первый запуск займет много времени.

См. также