Тестирование приложений WinUI 3 с помощью MSTest и Microsoft. Testing.Platform

Используйте Microsoft. Testing.Platform (MTP) для запуска тестов MSTest в приложении WinUI 3. Приложение WinUI выступает в качестве тестового узла. Он владеет точкой входа приложения, потоком пользовательского интерфейса и временем существования процесса.

Выберите две модели развертывания WinUI 3:

  • Распаковка приложения выполняется как обычный исполняемый файл Windows.
  • Упакованое приложение с полным доверием сохраняет удостоверение пакета MSIX и использует экспериментальное Microsoft.Testing.Extensions.PackagedApp расширение для регистрации и активации тестового узла.

Important

Расширение packaged-app поддерживает упакованные классические приложения с полным доверием. Он не поддерживает UWP или другие тестовые узлы AppContainer.

Активация AUMID с полным доверием реализована в microsoft/testfx репозитории, но недоступна в общедоступном пакете NuGet с 6 августа 2026 г. Текущие 1.0.0-alpha пакеты не содержат реализацию активации Windows. Используйте упаковаемую настройку только после выпуска пакета идентифицирует поддержку регистрации MSIX с полным доверием и активации AUMID.

Выбор модели развертывания

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

Требование Выберите Запуск тестового узла
Тесты не требуют удостоверения пакета или API, для которых требуется удостоверение пакета. Распаковка MTP запускает исполняемый файл приложения напрямую.
Для тестов требуется удостоверение пакета MSIX или поведение упаковаемого приложения. Упакованое полное доверие после того, как предварительная версия MTP станет общедоступной Расширение packaged-app регистрирует выходные данные сборки и активирует приложение с помощью идентификатора пользовательской модели приложения (AUMID).
Тесты должны выполняться в UWP или другом AppContainer. VSTest Расширение пакета приложения MTP не поддерживает изоляцию AppContainer.

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

Пока общедоступная предварительная версия MTP не включает регистрацию MSIX с полным доверием и активацию AUMID, используйте VSTest для упакованных тестов WinUI 3 с полным доверием.

Общие сведения о границе UWP

Не рассматривайте UWP как другую упаковаемую модель WinUI 3. Оба классических проекта UWP, предназначенные для UAP 10 и современных .NET проектов UWP, которые настроены UseUwp на true запуск в AppContainer. Упаковка классического приложения WinUI 3 не размещает его в этой модели приложения.

Используйте VSTest для классических тестов UWP и современных .NET UWP. Средство запуска упаковаемых приложений MTP предназначено для узлов компьютеров с полным доверием. Он не может доставлять свои аргументы активации или подключение контроллера к узлу AppContainer.

Современные .NET конфигурации UWP см. в примере MSTest .NET 9 UWP.

Настройка тестового узла WinUI

Обе модели развертывания используют одну и ту же локальную настройку MTP.

Задание общих свойств проекта

Задайте эти свойства в тестовом проекте WinUI:

<OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<UseWinUI>true</UseWinUI>
<EnableMSTestRunner>true</EnableMSTestRunner>
<GenerateTestingPlatformEntryPoint>false</GenerateTestingPlatformEntryPoint>

Используйте .NET 8 или более поздней поддерживаемой версии .NET. Пример предназначен для Windows версии платформы10.0.19041.0. Для расширения packaged-app требуется эта версия или более поздняя.

Сохраните элемент WinUI ApplicationDefinition , указывающий на XAML-файл тестового приложения. WinUI создает точку входа из этого элемента. Чтобы предотвратить создание второй точки входа MTP, задайте значение GenerateTestingPlatformEntryPointfalse.

Добавьте ссылки на пакеты в текущие совместимые версии MSTest и Microsoft. WindowsAppSDK.

Узел MTP из приложения

Переопределите OnLaunched в классе WinUI Application . Создайте и активируйте тестовое окно, а затем опубликуйте очередь диспетчера:

_window = new UnitTestAppWindow();
_window.Activate();
UITestMethodAttribute.DispatcherQueue = _window.DispatcherQueue;

Добавьте using Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer; для UITestMethodAttribute.

Создайте приложение MTP из аргументов командной строки. Затем зарегистрируйте расширения, которые msBuild вносит:

string[] cliArgs = Environment.GetCommandLineArgs().Skip(1)
    .Where(arg => !arg.Contains("EnableMSTestRunner")).ToArray();
ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(cliArgs);
builder.AddSelfRegisteredExtensions(cliArgs);
using ITestApplication app = await builder.BuildAsync();

Добавьте using Microsoft.Testing.Platform.Builder; для типов построителя MTP. Сборка WinUI добавляется EnableMSTestRunner в аргументы процесса. Так как это не параметр командной строки MTP, удалите его перед созданием тестового приложения.

Проект отключает созданную точку входа MTP, поэтому вызывается AddSelfRegisteredExtensions. Для упаковаемого приложения метод также регистрирует Microsoft.Testing.Extensions.PackagedApp средство запуска.

В OnLaunchedблоке поместите тестовое try создание и выполнение приложения. Назначьте результат await app.RunAsync()Environment.ExitCode. В блоке finally закройте окно и вызовите метод приложения Exit .

Этапы жизненного цикла обеспечивают две гарантии:

  • Процесс возвращает код выхода MTP, поэтому неудачный тест создает код выхода ненулевого процесса.
  • Цикл сообщений WinUI останавливается после выполнения вместо активного процесса тестирования.

Предупреждение

Не добавляйте [assembly: WinUITestTarget(...)] в тестовое приложение WinUI для локального размещения. Атрибут запускает приложение WinUI для отдельного тестового узла. Сначала локальное приложение вызывает Application.Start . Затем атрибут пытается запустить второе приложение в том же процессе.

Полный пример Реализации см. в примере с распаковкой WinUI и пакетном примере WinUI.

Выполнение тестов в потоке пользовательского интерфейса

Используйте UITestMethod для теста, создающего или обращающееся к объектам WinUI. MSTest планирует тест в очереди диспетчера, назначенной во время OnLaunched.

[UITestMethod]
public void CreatesControlOnUiThread()
{
    var grid = new Grid();
    Assert.IsTrue(grid.DispatcherQueue.HasThreadAccess);
}

Обычное TestMethod выполнение не выполняется в очереди диспетчера WinUI. Используйте его для тестов, которые не требуют потока пользовательского интерфейса.

Настройка непакованного тестового приложения

Для распаковки приложения добавьте следующие свойства:

<WindowsPackageType>None</WindowsPackageType>
<EnableMsixTooling>false</EnableMsixTooling>

Не ссылайтесь Microsoft.Testing.Extensions.PackagedApp. Распаковываемое приложение не имеет удостоверения MSIX или AppxManifest.xml выходных данных, поэтому MTP может запускать исполняемый файл напрямую.

По умолчанию Windows App SDK внедряет инициализатор начальной загрузки при выполнении проекта следующих условий:

  • WindowsPackageType равно None.
  • OutputType — это Exe или WinExe.
  • WindowsAppSDKSelfContained не является true.

Если узел, который не является Windows App SDK приложение загружает тестовую библиотеку, установите значение WindowsAppSdkBootstrapInitializetrue в библиотеке.

Note

VSTest не поддерживает эту конфигурацию WinUI для распаковки. Запустите проект с помощью MTP.

Настройка упаковаемого тестового приложения полного доверия

Сохраните конфигурацию WinUI по умолчанию:

  • Не устанавливайте WindowsPackageType на None.
  • Сохраняйте и храните Package.appxmanifest ресурсы пакета в проекте.
  • true Установите значение, EnableMsixTooling если в проекте используются средства упаковки MSIX с одним проектом.

После предварительной версии, которая включает регистрацию MSIX с полным доверием и активацию AUMID, добавьте определенную версию Microsoft. Пакет Testing.Extensions.PackagedApp. Не используйте предыдущий 1.0.0-alpha пакет для этой установки.

Пропс пакета MSBuild регистрирует средство запуска.AddSelfRegisteredExtensions Не вызывайте AddPackagedAppDeployment. Запуск MTP может зарегистрировать только один средство запуска тестового узла.

Средство запуска выполняет следующие действия:

  1. Он проверяет наличие AppxManifest.xml тестового исполняемого файла.
  2. Он регистрирует макет выходных данных сборки с помощью Windows.
  3. Он разрешает AUMID приложения из зарегистрированного пакета и идентификатора приложения манифеста.
  4. Он активирует приложение по AUMID и подключает активированный процесс к контроллеру MTP.

Средство запуска игнорирует несвязанный манифест в каталоге предков, если Application не указывает на тестовый исполняемый файл. Распаковка приложения, которое ссылается на пакет косвенно, остается на пути прямого запуска.

Перед запуском упаковаемого тестового приложения выполните следующие требования:

  • Используйте целевую платформу для Windows с версией платформы 10.0.19041.0 или более поздней.
  • Чтобы зарегистрировать макет выходных данных сборки без знака, включите режим разработчика или настройте неопубликованную загрузку.
  • Используйте упакованое классическое приложение с полным доверием. Расширение не поддерживает UWP или другие узлы AppContainer.

Предостережение

Microsoft.Testing.Extensions.PackagedApp ITestHostLauncher и точка расширения экспериментальна. Будущий выпуск может изменить или удалить их API и поведение. Оцените риски перед использованием упакованного модели в рабочей тестовой инфраструктуре.

Выполнение тестов

Из каталога, содержащего тестовый проект WinUI, выполните следующую команду:

dotnet run

Чтобы указать проект, используйте dotnet run --project .\WinUITests.csproj.

Для распаковываемого приложения MTP запускает исполняемый файл напрямую. Для упаковаемого приложения средство запуска упаковаемого приложения регистрирует макет и активирует приложение по AUMID.

В обоих моделях откроется окно тестирования, MTP запускает тесты, а окно закрывается. Затем терминал сообщает сводку теста. Успешный запуск завершается с кодом 0. Если тест завершается сбоем, OnLaunched назначает ненулевому RunAsync результату Environment.ExitCode.

Используется dotnet run для любой модели. Чтобы запустить распаковку приложения напрямую, используйте созданный исполняемый файл приложения. Не используйте dotnet exec , так как WinUI разрешает ресурсы PRI относительно пути процесса.

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

Используйте эти проверки для наиболее распространенных сбоев установки:

Симптом Проверьте
Приложение сообщает о нескольких вызовах Application.Start. WinUITestTarget Удалите атрибут из локального тестового приложения.
Выполнение теста завершается, но процесс остается открытым. Закройте окно теста и вызовите Exit блок finally после RunAsync.
Неудачные тесты по-прежнему возвращают код 0выхода процесса. Назначьте результат RunAsyncEnvironment.ExitCode.
Неупакованный запуск завершается ошибкой, так как AppxManifest.xml отсутствует. Убедитесь, что проект включает MTP и что выполнение не использует VSTest.
Пакетный запуск не может зарегистрировать или активировать приложение. Подтвердите целевую платформу Windows, режим разработчика или неопубликованную конфигурацию, модель приложения полного доверия и запись исполняемого файла манифеста.

См. также