Конфигурация пакета SDK MSTest

В этой статье рассматриваются дополнительные параметры конфигурации для 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. Это значение по умолчанию, если свойство не задано явным образом.

    Включает следующие расширения:

  • AllMicrosoft — включает расширения Microsoft, выбранные для широкого использования по умолчанию, включая расширения с ограничительной лицензией. Экспериментальные расширения и расширения, доступные только через API, по-прежнему могут требовать явного подтверждения.

    Включает все расширения из Default профиля, а также следующие расширения:

    В версиях 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:

\- task: DotNetCoreCLI@2
  inputs:
    command: 'test'
    projects: '**/**.sln'
-    arguments: '--configuration Release'
+    arguments: '--configuration Release -- --report-trx --results-directory $(Agent.TempDirectory) --coverage'

Экспериментальные функции

Следующие функции MSTest 4.3 являются экспериментальными. Их общедоступные API могут быть изменены, и они отображаются за экспериментальной диагностикой, поэтому выбор требует подтверждения соответствующего идентификатора диагностики. Используйте их с этим предостережением.

Генератор источника отражения

Примечание.

Добавлено в MSTest 4.3.0 (экспериментальная возможность).

Генератор исходного кода MSTest обнаруживает тесты во время компиляции, не полагаясь на рефлексию во время выполнения, что делает тестовые проекты совместимыми с триммингом и Native AOT. Включите его, добавив пакет MSTest.SourceGeneration . Если генератор исходного кода активен, классы тестов должны объявлять [TestClass] напрямую, а не наследовать его; анализатор MSTEST0069 помечает классы, которые полагаются на унаследованный [TestClass].

Начиная с MSTest 4.3.2, для проектов с trimming и Native AOT значение MSTestSourceGenMode по умолчанию равно ReflectionFree.

Начиная с MSTest 4.4, генерация без использования рефлексии формирует полный набор метаданных унаследованных атрибутов, включая AttributeUsage и AllowMultiple. Если генератор не может статически материализовать метаданные, MSTest использует рефлексию, если среда выполнения это поддерживает.

Программная фильтрация тестов с помощью 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.)

См. также