Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье рассматриваются дополнительные параметры конфигурации для MSTest.Sdk. Основные сведения о настройке и начале работы см. в разделе Начало работы с помощью MSTest.
Внимание
По умолчанию MSTest.Sdk использует тестовый ранер MSTest с MTP, в том числе с dotnet test. Для этого требуется изменить вызовы CI и локального CLI, а также влияет на доступные записи в файле .runsettings. Вы можете сохранить старые интеграции и средства, переключившись на VSTest.
MSTest.Sdk устанавливает EnableMSTestRunner и TestingPlatformDotnetTestSupport в значение true по умолчанию. Дополнительные сведения о dotnet test и его различных режимах см. в разделе "Тестирование с помощью dotnet test".
Вспомогательные библиотеки для тестирования утилит
Если проект, использующий MSTest.Sdk, предназначен для того, чтобы быть вспомогательной библиотекой для тестирования и сам по себе не содержит выполняемых тестов, проект должен иметь <IsTestApplication>false</IsTestApplication>.
Выберите бегуна
По умолчанию пакет SDK MSTest использует MTP, но можно переключиться на VSTest , добавив свойство <UseVSTest>true</UseVSTest>.
Расширение MTP
Интерфейс MTP можно настроить с помощью набора расширений пакетов NuGet. Чтобы упростить и улучшить этот интерфейс, пакет SDK MSTest представляет две функции:
Microsoft.Testing.Platform профиль
Понятие profiles позволяет выбрать набор конфигураций и расширений по умолчанию, которые будут применяться к тестовому проекту.
Профиль можно задать с помощью свойства TestingExtensionsProfile одним из следующих трех профилей:
None— расширения не включены.Default— включает рекомендуемые расширения для этой версии MSTest.SDK. Это значение по умолчанию, если свойство не задано явным образом.Включает следующие расширения:
- покрытие кода
- Отчет Trx
- отчет Azure DevOps (MSTest.Sdk 4.3.0+)
- отчет GitHub Actions (экспериментальный и предварительный выпуск, MSTest.Sdk 4.3.0+)
AllMicrosoft— включает расширения Microsoft, выбранные для широкого использования по умолчанию, включая расширения с ограничительной лицензией. Экспериментальные расширения и расширения, доступные только через API, по-прежнему могут требовать явного подтверждения.Включает все расширения из
Defaultпрофиля, а также следующие расширения:- дамп памяти при сбое
- Поддельные (MSTest.Sdk 3.7.0+)
- дамп зависания
- Горячая перезагрузка
- HTML-отчет
- повторная попытка
В версиях MSTest.Sdk с 3.11.0 по 4.2.x расширение Azure DevOps Report включено только в
AllMicrosoft.
Примечание.
Профили ссылаются на пакеты Azure DevOps Report и GitHub Actions Report, но формирование отчетов остается отключенным во время выполнения. Передайте --report-azdo, чтобы включить отчетность Azure DevOps. Чтобы включить отчётность GitHub Actions, запустите тесты в GitHub Actions и передайте параметр --report-gh.
Ниже приведен полный пример использования None профиля:
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<TestingExtensionsProfile>None</TestingExtensionsProfile>
</PropertyGroup>
</Project>
| Расширение или профиль | Никакой | По умолчанию | AllMicrosoft |
|---|---|---|---|
| покрытие кода | ✔️ | ✔️ | |
| дамп памяти при сбое | ✔️ | ||
| Подделки | ✔️¹ | ||
| дамп зависания | ✔️ | ||
| Горячая перезагрузка | ✔️ | ||
| HTML-отчет | ✔️ | ||
| Отчет GitHub Actions | ✔️³ | ✔️³ | |
| повторная попытка | ✔️ | ||
| Trx | ✔️ | ✔️ | |
| отчет Azure DevOps | ✔️³ | ✔️² |
¹ MSTest.Sdk 3.7.0+ ² MSTest.Sdk 3.11.0+ ³ MSTest.Sdk 4.3.0+
Включение или отключение расширений
Расширения можно включить и отключить с помощью свойств MSBuild с шаблоном Enable[NugetPackageNameWithoutDots].
Например, чтобы включить расширение аварийного дампа (пакет NuGet Microsoft. Testing.Extensions.CrashDump) можно использовать следующее свойство EnableMicrosoftTestingExtensionsCrashDump для параметра true:
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCrashDump>true</EnableMicrosoftTestingExtensionsCrashDump>
</PropertyGroup>
</Project>
Список всех доступных расширений см. в разделе "Функции MTP".
Некоторые расширения MTP остаются необязательными и не включены в профили Default или AllMicrosoft:
- Начиная с MSTest.Sdk 4.3, задайте
<EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport>, а затем передайте--report-junit. - Начиная с предварительной версии MSTest.Sdk 4.4, задайте
<EnableMicrosoftTestingExtensionsCtrfReport>true</EnableMicrosoftTestingExtensionsCtrfReport>, а затем передайте--report-ctrf. - Чтобы сослаться на расширение OpenTelemetry, задайте значение
<EnableMicrosoftTestingExtensionsOpenTelemetry>true</EnableMicrosoftTestingExtensionsOpenTelemetry>. Так как расширение требует конфигурации API, зарегистрируйте его в пользовательской точке входа, как описано в openTelemetry.
Эти расширения доступны только с помощью MTP.
Предупреждение
Важно проверить условия лицензирования для каждого расширения, так как они могут отличаться.
Включенные и отключенные расширения объединяются с дополнениями, предоставляемыми выбранным профилем дополнений.
Этот шаблон свойства можно использовать для включения дополнительного расширения поверх неявного профиля Default (как показано в предыдущем примере CrashDumpExtension).
Вы также можете отключить расширение, которое поступает из выбранного профиля. Например, отключите MS Code Coverage расширение, задав :<EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnableMicrosoftTestingExtensionsCodeCoverage>false</EnableMicrosoftTestingExtensionsCodeCoverage>
</PropertyGroup>
</Project>
В MSTest.Sdk 4.3.0 и более поздних версиях профиль Default включает ссылки на пакеты Azure DevOps Report и GitHub Actions Report. Чтобы удалить ссылку на пакет, задать <EnableMicrosoftTestingExtensionsAzureDevOpsReport>false</EnableMicrosoftTestingExtensionsAzureDevOpsReport> или <EnableMicrosoftTestingExtensionsGitHubActionsReport>false</EnableMicrosoftTestingExtensionsGitHubActionsReport>. Если сохранить ссылки на пакеты, отчёт Azure DevOps запускается только при передаче --report-azdo. Формирование отчетов в GitHub Actions начинается только тогда, когда вы запускаете тесты в GitHub Actions и передаете --report-gh.
Функции
Помимо выбора двигателей и расширений, специфичных для них, MSTest.Sdk также предоставляет дополнительные функции, упрощающие и повышающие возможности вашего тестирования.
Тестирование с помощью Aspire
Aspire — это облачный, готовый к эксплуатации и отслеживаемый стек для создания распределённых приложений. Aspire поставляется через коллекцию пакетов NuGet, которые решают специфические задачи, нативные для облака. Дополнительные сведения см. в Aspire документации.
Примечание.
Эта функция доступна в MSTest.Sdk 3.4.0.
Присвоив свойству EnableAspireTesting значение true, можно получить все необходимые зависимости и директивы по умолчанию using для тестирования с помощью Aspire и MSTest.
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnableAspireTesting>true</EnableAspireTesting>
</PropertyGroup>
</Project>
Тестирование с помощью Playwright
Playwright позволяет проводить надежное сквозное тестирование для современных веб-приложений. Официальную документацию Playwright см. для получения дополнительной информации.
Примечание.
Эта функция доступна в MSTest.Sdk 3.4.0.
Установив свойство EnablePlaywright в true, вы можете обеспечить все необходимые зависимости и директивы по умолчанию using для тестирования с помощью Playwright и MSTest.
<Project Sdk="MSTest.Sdk/4.1.0">
<PropertyGroup>
<TargetFramework>net10.0</TargetFramework>
<EnablePlaywright>true</EnablePlaywright>
</PropertyGroup>
</Project>
Перейти на MSTest SDK
Рассмотрим следующие шаги, необходимые для миграции в пакет SDK MSTest.
Обновите ваш проект
При переносе существующего тестового проекта MSTest в пакет SDK MSTest сначала замените запись Sdk="Microsoft.NET.Sdk" в верхней части тестового проекта Sdk="MSTest.Sdk"
- Sdk="Microsoft.NET.Sdk"
+ Sdk="MSTest.Sdk"
Добавьте версию в global.json.
{
"msbuild-sdks": {
"MSTest.Sdk": "4.1.0"
}
}
Затем можно начать упрощение проекта.
Удалите свойства по умолчанию:
- <EnableMSTestRunner>true</EnableMSTestRunner>
- <OutputType>Exe</OutputType>
- <IsPackable>false</IsPackable>
- <IsTestProject>true</IsTestProject>
Удаление ссылок на пакет по умолчанию:
- <PackageReference Include="MSTest"
- <PackageReference Include="MSTest.TestFramework"
- <PackageReference Include="MSTest.TestAdapter"
- <PackageReference Include="MSTest.Analyzers"
- <PackageReference Include="Microsoft.NET.Test.Sdk"
Наконец, на основе используемого профиля расширений можно также удалить некоторые пакеты Microsoft.Testing.Extensions.*.
Обновление CI
После обновления проектов, если вы используете MTP (по умолчанию) и полагаетесь на dotnet test для запуска тестов, необходимо обновить конфигурацию CI. Дополнительные сведения и руководство по пониманию всех необходимых изменений см. в статье dotnet test integration.
Если вы используете режим VSTest dotnet test, ниже приведен пример обновления при использовании задачи DotNetCoreCLI в Azure DevOps:
Профиль расширения MSTest.Sdk по умолчанию предоставляет пакеты Microsoft.Testing.Extensions.TrxReport и Microsoft.Testing.Extensions.CodeCoverage, требуемые добавленными параметрами. Если вы выберете профиль None, включите оба расширения или укажите ссылки на них, прежде чем использовать эти параметры.
\- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: '**/**.sln'
- arguments: '--configuration Release'
+ arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'
Генератор источника отражения
Внимание
Следующее поведение MSTest 4.4 доступно только в предварительных сборках до выпуска MSTest 4.4.0.
MSTest 4.3 добавил генератор исходного кода на основе рефлексии в экспериментальный пакет MSTest.SourceGeneration с собственным версионированием. Начиная с MSTest 4.4, пакет выходит из экспериментального статуса и использует версию MSTest.
Проекты Native AOT автоматически включают генератор исходного кода. Для проекта, не использующего NativeAOT, но использующего MSTest.Sdk, включите это с помощью <EnableMSTestSourceGeneration>true</EnableMSTestSourceGeneration>. MSTest.Sdk согласует версии MSTest.SourceGeneration, MSTest.TestFramework и MSTestVersion через MSTest.TestAdapter.
Пакет SDK также поддерживает создание источников в многократно используемых библиотеках тестов и проектах, использующих централизованное управление пакетами. Он предоставляет соответствующие MSTest.TestAdapter хуки времени выполнения и создает необходимые PackageVersion элементы.
.NET Standard не поддерживает эти хуки среды выполнения. Если включить генерацию исходного кода для целевой платформы .NET Standard, SDK выдает следующую ошибку:
Генерация исходного кода MSTest не поддерживается для целевых платформ .NET Standard, так как необходимые хуки среды выполнения MSTest.TestAdapter недоступны.
Генератор источника обнаруживает тесты во время компиляции. Если генератор активен, классы тестов должны объявлять [TestClass] непосредственно, а не наследовать его. Анализатор MSTEST0069 отмечает классы, которые зависят от унаследованного [TestClass].
Начиная с MSTest 4.3.2, для проектов с trimming и Native AOT значение MSTestSourceGenMode по умолчанию равно ReflectionFree. В этом режиме используются сгенерированные метаданные и средства вызова там, где поддерживается структура теста. В средах выполнения, поддерживающих рефлексию, MSTest использует рефлексию в качестве резервного механизма для неподдерживаемых или отсутствующих сгенерированных записей.
Начиная с MSTest 4.4, генерация без использования рефлексии формирует полный набор метаданных унаследованных атрибутов, включая AttributeUsage и AllowMultiple. В MTP это может обойти обнаружение и проверку среды выполнения для простых синхронных [TestMethod] и [DataRow] методов. Асинхронные тесты, пользовательские атрибуты тестовых методов, DynamicData, пользовательские реализации ITestDataSource и неоднозначные формы тестов используют резервный механизм. VSTest также сохраняет существующий путь.
Режим без отражения сообщает следующие диагностические данные:
| Идентификатор | Неподдерживаемая форма теста |
|---|---|
AOTSG0001 |
Статический класс теста |
AOTSG0002 |
Открытый обобщённый тестовый класс, включая класс, вложенный в обобщённый тип |
AOTSG0003 |
Класс, который создал код, не может получить доступ, включая локальный класс файла или частный или закрытый вложенный объект. |
AOTSG0004 |
Универсальный метод теста |
AOTSG0005 |
Метод тестирования с параметром in, out или ref |
Экспериментальные функции
Следующие функции MSTest 4.3 являются экспериментальными. Их публичные API могут измениться и доступны только через экспериментальные диагностические функции. Чтобы принять участие, подтвердите соответствующий идентификатор диагностики.
Программная фильтрация тестов с помощью ITestFilter
Примечание.
Добавлено в MSTest 4.3.0 (экспериментальная возможность).
Экспериментальная точка расширения ITestFilter, зарегистрированная с помощью [TestFilterProviderAttribute], позволяет программно определить, будет ли выполняться каждый тест, до загрузки любого тестового класса. Это полезно для пользовательской логики выбора, которая не может быть выражена с фильтрами командной строки.
Реализуйте ITestFilter.Filter(TestFilterContext) для проверки метаданных без загрузки тестового класса:
public sealed class MyFilter : ITestFilter
{
public TestFilterResult Filter(TestFilterContext context) =>
context.DisplayName.Contains("Nightly", StringComparison.Ordinal)
? TestFilterResult.Run : TestFilterResult.Drop;
}
Выберите TestFilterResult.Run, чтобы запустить тест, Drop — чтобы пропустить его без указания результата, или Skip(reason) — чтобы указать, что результат: «пропущен». MSTest может одновременно вызывать один экземпляр фильтра, поэтому реализации должны быть потокобезопасны. Фильтры командной строки и обозревателя тестов применяются до ITestFilter, а [Ignore] оценивается после этого.
Начиная с MSTest 4.4, .NET проекты могут использовать универсальную, типобезопасную форму [assembly: TestFilterProvider<MyFilter>]регистрации. Затем компилятор проверяет, что MyFilter реализует ITestFilter и имеет общедоступный конструктор без параметров. Универсальный атрибут недоступен для платформы .NET Framework. Для многоцелевой проекта выберите универсальную или не универсальную форму с символом препроцессора целевой платформы.
#if NET
[assembly: TestFilterProvider<MyFilter>]
#else
[assembly: TestFilterProvider(typeof(MyFilter))]
#endif
Начиная с MSTest 4.4 анализатор MSTEST0081 полностью проверяет форму не универсальной регистрации. Для обобщённого варианта он по-прежнему сообщает об обобщённых типах фильтров и сборках, регистрирующих более одного поставщика.
TestRun.Current и запланированные тесты
Примечание.
Добавлено в MSTest 4.3.0 (экспериментальная возможность).
Экспериментальный API TestRun.Current (из RFC 014) предоставляет информацию о текущем запуске, включая набор запланированных тестов, чтобы расширения и фикстуры могли проверить, что запланировано к выполнению.
Известные ограничения
Пакеты SDK для NuGet, предоставляемые MSBuild (включая MSTest.Sdk), имеют ограниченную поддержку инструментов при обновлении их версии, что означает, что стандартное обновление NuGet и пользовательский интерфейс Visual Studio для управления пакетами NuGet не работает должным образом. Необходимо вручную обновить версию в файле global.json и в файле project. (Это применимо, даже если вы используете Dependabot из-за проблем dependabot-core#12824 и dependabot-core#8615.)
См. также
- Свойства, связанные с MTP
- свойства, связанные с VSTest