Teste aplicações UWP e WinUI 3 com MSTest e Microsoft. Testing.Platform

Utilize o Microsoft.Testing.Platform (MTP) para executar testes MSTest em aplicações UWP e WinUI 3. A aplicação atua como anfitriã dos testes e controla a thread da interface do utilizador e o tempo de vida do processo.

Importante

A matriz completa de suporte a aplicações Windows descrita neste artigo está disponível com MSTest 4.5 e MTP 2.5. Até serem lançadas as versões estáveis, utilize pacotes de pré-visualização correspondentes da 4.5 e 2.5. Se gerir pacotes MTP diretamente, mantenha as versões da plataforma e dos pacotes de extensão alinhadas.

Escolha um modelo de aplicação

O MSTest.Sdk suporta os seguintes modelos de aplicações Windows através do MTP:

Modelo de aplicação Embalagem e confiança Arranque do host de teste Executar comando
UWP clássico (uap10.0) Contentor de Aplicações Empacotadas Um sidecar de confiança total regista o pacote e ativa a aplicação pelo ID do Modelo de Utilizador da Aplicação (AUMID). MSBuild com o InvokeTestingPlatform alvo
UWP moderno (.NET 10 com UseUwp) Contentor de Aplicações Empacotadas Um sidecar de confiança total regista o pacote e ativa a aplicação pela AUMID. MSBuild com o InvokeTestingPlatform alvo
WinUI 3 empacotado Total confiança empacotada Um sidecar de confiança plena regista o pacote e ativa a aplicação através do AUMID. dotnet run ou dotnet test --project
WinUI 3 não empacotado Sem identidade de encomenda, confiança total O MTP inicia o executável da aplicação diretamente. dotnet run ou dotnet test --project
WinUI 3 packagedClassicApp com TrustLevel="appContainer" Contentor de Aplicações Empacotadas Um sidecar de confiança total ativa a aplicação e autoriza o identificador de segurança (SID) exato do pacote nos canais de comunicação MTP. dotnet msbuild com o InvokeTestingPlatform alvo

O empacotamento e o isolamento em sandbox são opções distintas. Uma aplicação WinUI 3 de ambiente de trabalho empacotada tem identidade de pacote, mas é executada como um processo com confiança total por predefinição. Uma aplicação UWP corre sempre no AppContainer. Uma aplicação WinUI 3 empacotada só corre no AppContainer quando o seu manifesto define TrustLevel="appContainer".

Para versões mais antigas do MSTest ou MTP, mantém a configuração VSTest existente para projetos UWP. A execução nativa de MTP para hosts UWP e AppContainer requer MSTest 4.5 e MTP 2.5.

Compreenda o modelo de sidecar da aplicação MTP

Para uma aplicação empacotada, o processo inicial da ferramenta de teste não pode correr dentro do pacote. O MSTest.Sdk inicia um controlador auxiliar com confiança total que:

  • Prepara argumentos da linha de comandos e é responsável pelo cancelamento, pelas novas tentativas, pelos relatórios e pelo tratamento do código de saída.
  • Regista o pacote build-output e ativa a aplicação manifesta exata pelo AUMID.
  • Autoriza apenas o SID do pacote selecionado quando um host AppContainer se liga a pipelines nomeados MTP.
  • Recupera artefactos TRX, dumps, de diagnóstico e de repetição do armazenamento pertencente ao pacote.

A aplicação de teste continua a alojar o MTP e o MSTest no seu próprio processo. A execução do UWP não requer Microsoft.NET.Test.Sdk, vstest.console, UwpTestHostRuntimeProvider, nem o runtime de implementação do Visual Studio.

Para um UWP windowsApp, o Windows fornece uma cadeia de caracteres de ativação através de LaunchActivatedEventArgs.Arguments, em vez dos argumentos normais do processo. Chama PackagedAppExtensions.GetTestApplicationArguments antes de criar o criador MTP. A extensão packaged-app restaura o array original de argumentos e os metadados da ligação ao controlador.

Para um WinUI 3 packagedClassicApp, incluindo um que corre em AppContainer, use os argumentos normais do processo.

Cumprir os pré-requisitos

Use os pré-requisitos que se aplicam ao seu projeto:

  • Use o .NET SDK 10 ou posterior para a cadeia de ferramentas MSTest 4.5 e dotnet test --project.
  • Para UWP, use o MSBuild para ambiente de trabalho do Visual Studio com a carga de trabalho Plataforma Universal do Windows e o SDK do Windows necessário. Estes componentes fornecem apenas suporte em tempo de construção.
  • Para o WinUI 3, instale as ferramentas de desenvolvimento de aplicações Windows e consulte uma versão compatível do SDK de Aplicações Windows.
  • Para aplicações de teste empacotadas, ative o Modo Desenvolvedor do Windows ou configure o sideloading para que o Windows possa registar um layout de saída de compilação sem assinatura.
  • Para aplicações de teste do AppContainer, execute o controlador como um utilizador sem privilégios elevados.

Configurar testes UWP

Configurar um projeto UWP moderno

Utilize o MSTest.Sdk 4.5 ou posterior, defina o .NET 10 como destino com uma versão de plataforma do Windows e defina UseUwp como true. Mantenha o seu UWP XAML, MSIX e arquitetura existentes, bem como as suas definições do Native AOT.

O Visual Studio normalmente ativa UseUwpTools durante a compilação. O MSTest.Sdk seleciona o modelo de aplicação UWP quando UseUwpTools está true, ou quando UseUwp está true e UseUwpTools ainda não está definido.

Se só precisar de referências UWP numa aplicação de teste MTP que não seja UWP, defina UseUwpTools para false. O SDK utiliza então o executor MTP direto, a menos que outro modelo de aplicação empacotada exija o sidecar.

Para um projeto completo, consulte o exemplo moderno do UWP MTP.

Configurar um projeto clássico UWP

Mantém a estrutura existente uap10.0 do projeto, a cadeia de ferramentas do MSBuild para o ambiente de trabalho e o SDK da extensão UWP. Importa MSTest.Sdk 4.5 ou posterior, e ativa o runner MSTest e o MTP. O MSTest.Sdk fornece o bootstrap, adaptador e ativos de runtime compatíveis com UAP.

Para um projeto completo, veja o exemplo clássico do UWP MTP.

Executar testes UWP

Abre um PowerShell para desenvolvedores no Visual Studio. Constrói a solução para uma arquitetura de betão e depois invoca o MTP:

msbuild UwpTests.sln /restore /p:Configuration=Release /p:Platform=x64
msbuild UwpTests.csproj /t:InvokeTestingPlatform /p:Configuration=Release /p:Platform=x64 /p:TestingPlatformCommandLineArguments="--report-trx"

O segundo comando regista o pacote, ativa a aplicação pelo AUMID, executa testes regulares e UI-thread, copia artefactos de resultados do armazenamento do pacote e devolve o código de saída da execução do teste.

Configurar testes do WinUI 3

Use o MSTest.Sdk 4.5 ou posterior, defina UseWinUI para true, e aponte um framework de destino específico do Windows. Para ativação em pacotes, use a versão 10.0.19041.0 da plataforma Windows ou posterior.

Alojar MTP na aplicação WinUI

Para uma aplicação de teste WinUI autoalojada, crie e ative a janela de teste em OnLaunched e, em seguida, publique a sua fila do dispatcher:

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

Execute o assistente MTP gerado, atribua o seu resultado a Environment.ExitCode, feche a janela e chame Exit:

Environment.ExitCode = await MicrosoftTestingPlatformApplication.RunAsync(
    Environment.GetCommandLineArgs()[1..]);

Use UITestMethod para testes que criam ou acedam a objetos WinUI. Utilize TestMethod para testes que não exigem a thread da IU.

Warning

Não adicione [assembly: WinUITestTarget(...)] a uma aplicação de teste WinUI autoalojada. Este atributo inicia uma aplicação WinUI num host de teste separado, mas a aplicação auto-hospedada já invocou Application.Start.

Configurar uma aplicação não embalada

Defina WindowsPackageType como None. A aplicação não tem identidade MSIX nem AppxManifest.xml, por isso o MTP inicia o seu executável diretamente. Não adicione manualmente a extensão de aplicação empacotada.

O SDK de Aplicações Windows normalmente injeta o seu inicializador de arranque quando o projeto cumpre estas condições:

  • WindowsPackageType é None.
  • OutputType é Exe ou WinExe.
  • WindowsAppSDKSelfContained não é true.

Se um host que não é uma aplicação do SDK de Aplicações Windows carregar a tua biblioteca de teste, define WindowsAppSdkBootstrapInitialize para true dentro da biblioteca.

O VSTest não suporta aplicações de teste WinUI 3 não empacotadas porque o seu fornecedor WinUI exige um manifesto do AppX.

Para um projeto completo, veja o exemplo não embalado do WinUI MTP.

Configurar uma aplicação empacotada de confiança total

Mantém a configuração predefinida do WinUI incluída no pacote e o respetivo Package.appxmanifest. O MSTest.Sdk faz automaticamente referência a Microsoft.Testing.Extensions.PackagedApp e regista-o no projeto empacotado.

Também não ligues AddPackagedAppDeployment. Uma execução MTP só pode registar um lançador de host de teste. Defina EnableMicrosoftTestingExtensionsPackagedApp como false apenas quando um iniciador personalizado controla a ativação empacotada.

Para um projeto completo, veja o exemplo de MTP do WinUI incluído.

Configurar uma aplicação AppContainer

No manifesto do pacote WinUI, configure a aplicação como packagedClassicApp e defina TrustLevel="appContainer". O MTP 2.5 autoriza o SID exato do pacote no controlador e nos tubos de extensão. Não concede ALL APPLICATION PACKAGES nem exige uma isenção de loopback.

Faz o sidecar funcionar sem elevação. Utilize o destino InvokeTestingPlatform para que o sidecar possa copiar os resultados e os diagnósticos a partir do pacote LocalState para o diretório de resultados solicitado.

Para um projeto completo, veja o exemplo do AppContainer WinUI MTP.

Executar testes WinUI 3

Constrói para uma arquitetura em betão. Para uma aplicação full-trust ou não empacotada, execute:

dotnet build -p:Platform=x64
dotnet test --project . --no-build -p:Platform=x64

Você também pode usar dotnet run --no-build -p:Platform=x64.

Para uma aplicação WinUI do AppContainer, use o alvo do sidecar e um diretório de resultados absolutos:

dotnet msbuild .\WinUITests.csproj -t:InvokeTestingPlatform -p:Platform=x64 "-p:TestingPlatformCommandLineArguments=--report-trx --results-directory C:\TestResults"

Não uses dotnet exec para uma aplicação WinUI. O WinUI resolve recursos PRI relativamente ao caminho do processo.

Resolver problemas de configuração

Symptom Verificar
A aplicação reporta múltiplas chamadas para Application.Start. Remova o WinUITestTarget atributo de uma aplicação de teste WinUI auto-hospedada.
O teste termina, mas o processo mantém-se aberto. Feche a janela de teste e chame Exit depois de concluída a execução do MTP.
Testes falhados devolvem o código 0de saída do processo. Atribuir o resultado da execução MTP a Environment.ExitCode.
Uma execução do WinUI sem empacotamento indica a ausência de AppxManifest.xml. Confirma que o projeto usa MTP em vez de VSTest.
Uma execução empacotada não pode registar nem ativar a aplicação. Confirme o framework de destino do Windows, o Modo de Programador ou a política de instalação lateral, a arquitetura e a entrada do executável no manifesto.
Um host AppContainer não consegue ligar-se ao controlador. Utilize o MSTest 4.5 e o MTP 2.5 ou posterior, e execute o controlador sem privilégios elevados.
Um relatório AppContainer não é copiado para o diretório solicitado. Use InvokeTestingPlatform e especifique um diretório de resultados absolutos.

Consulte também