Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare Microsoft. Testing.Platform (MTP) per eseguire test MSTest all'interno di un'app WinUI 3. L'app WinUI funge da host di test. Possiede il punto di ingresso dell'applicazione, il thread dell'interfaccia utente e la durata del processo.
Scegliere tra due modelli di distribuzione WinUI 3:
- Un'app non in pacchetto viene eseguita come normale eseguibile Windows.
-
Un'app full-trust in pacchetto mantiene l'identità del pacchetto MSIX e usa l'estensione sperimentale
Microsoft.Testing.Extensions.PackagedAppper registrare e attivare l'host di test.
Importante
L'estensione packaged-app supporta le app desktop in pacchetto con attendibilità completa. Non supporta la piattaforma UWP o altri host di test AppContainer.
L'attivazione AUMID con attendibilità totale in pacchetto viene implementata nel microsoft/testfx repository, ma non è disponibile in un pacchetto NuGet pubblico a partire dal 6 agosto 2026. I pacchetti correnti 1.0.0-alpha non contengono l'implementazione di attivazione specifica del Windows. Usare l'installazione in pacchetto solo dopo una versione del pacchetto che identifica il supporto per la registrazione MSIX con attendibilità completa e l'attivazione AUMID.
Scegliere un modello di distribuzione
Scegliere il modello di distribuzione prima di configurare il progetto di test.
| Requisito | Scegli | Testare l'avvio dell'host |
|---|---|---|
| I test non richiedono l'identità del pacchetto o le API che richiedono l'identità del pacchetto. | Unpackaged | MTP avvia direttamente l'eseguibile dell'app. |
| I test richiedono l'identità del pacchetto MSIX o il comportamento dell'app in pacchetto. | Attendibilità totale in pacchetto dopo che l'anteprima mtp diventa disponibile pubblicamente | L'estensione packaged-app registra l'output di compilazione e attiva l'app in base all'ID modello utente applicazione (AUMID). |
| I test devono essere eseguiti in UWP o in un altro AppContainer. | VSTest | L'estensione MTP packaged-app non supporta l'isolamento AppContainer. |
A meno che i test non richiedano l'identità del pacchetto, usare un'app non in pacchetto. Il modello non in pacchetto non richiede la registrazione del pacchetto, la modalità sviluppatore o l'estensione sperimentale di app in pacchetto.
Fino a quando un'anteprima MTP pubblica include la registrazione MSIX con attendibilità completa e l'attivazione AUMID, usare VSTest per i test WinUI 3 con attendibilità completa.
Comprendere il limite UWP
Non considerare la piattaforma UWP come un altro modello WinUI 3 in pacchetto. Entrambi i progetti UWP classici destinati a UAP 10 e moderni .NET progetti UWP impostati UseUwp per l'esecuzione true in un AppContainer. La creazione di un pacchetto di un'app desktop WinUI 3 non la inserisce nel modello di app.
Usare VSTest per la piattaforma UWP classica e i test UWP moderni .NET. L'utilità di avvio di MTP packaged-app è destinata a host desktop con attendibilità totale. Non può recapitare gli argomenti di attivazione o la connessione del controller a un host AppContainer.
Per una configurazione UWP .NET moderna, vedi l'esempio msTest .NET 9 UWP.
Configurare l'host di test WinUI
Entrambi i modelli di distribuzione usano la stessa configurazione MTP self-hosted.
Impostare le proprietà comuni del progetto
Impostare queste proprietà nel progetto di test WinUI:
<OutputType>Exe</OutputType>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<UseWinUI>true</UseWinUI>
<EnableMSTestRunner>true</EnableMSTestRunner>
<GenerateTestingPlatformEntryPoint>false</GenerateTestingPlatformEntryPoint>
Usare .NET 8 o versione successiva supportata .NET. L'esempio è destinato Windows versione 10.0.19041.0della piattaforma . L'estensione packaged-app richiede questa versione o versione successiva.
Mantenere l'elemento WinUI ApplicationDefinition che punta al file XAML dell'app di test. WinUI genera un punto di ingresso da tale elemento. Per impedire a MTP di generare un secondo punto di ingresso, impostare su GenerateTestingPlatformEntryPointfalse.
Aggiungere riferimenti al pacchetto alle versioni compatibili correnti di MSTest e Microsoft. WindowsAppSDK.
Host MTP dall'applicazione
Eseguire l'override OnLaunched nella classe WinUI Application . Creare e attivare la finestra di test e quindi pubblicare la coda del dispatcher:
_window = new UnitTestAppWindow();
_window.Activate();
UITestMethodAttribute.DispatcherQueue = _window.DispatcherQueue;
Aggiungere using Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer; per UITestMethodAttribute.
Creare l'applicazione MTP dagli argomenti della riga di comando. Registrare quindi le estensioni che MSBuild contribuisce:
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();
Aggiungere using Microsoft.Testing.Platform.Builder; per i tipi di generatore MTP. La compilazione WinUI aggiunge EnableMSTestRunner agli argomenti del processo. Poiché non è un'opzione della riga di comando MTP, rimuoverla prima di creare l'applicazione di test.
Il progetto disabilita il punto di ingresso MTP generato, quindi chiamare AddSelfRegisteredExtensions. Per un'app in pacchetto, il metodo registra anche l'utilità Microsoft.Testing.Extensions.PackagedApp di avvio.
In OnLaunchedinserire la creazione e l'esecuzione dell'applicazione di test in un try blocco. Assegnare il risultato di await app.RunAsync() a Environment.ExitCode. In un finally blocco chiudere la finestra e chiamare il metodo dell'applicazione Exit .
I passaggi del ciclo di vita offrono due garanzie:
- Il processo restituisce il codice di uscita MTP, quindi un test non riuscito produce un codice di uscita del processo diverso da zero.
- Il ciclo di messaggi WinUI si arresta dopo l'esecuzione anziché lasciare attivo il processo di test.
Avvertimento
Non aggiungere [assembly: WinUITestTarget(...)] a un'app di test WinUI self-hosted. L'attributo avvia un'applicazione WinUI per un host di test separato. Un'app self-hosted chiama Application.Start prima di tutto. L'attributo tenta quindi di avviare una seconda applicazione nello stesso processo.
Per un'implementazione completa, vedi l'esempio di WinUI senza pacchetti e l'esempio di WinUI in pacchetto.
Eseguire test nel thread dell'interfaccia utente
Usare UITestMethod per un test che crea o accede a oggetti WinUI. MSTest pianifica il test nella coda dispatcher assegnata durante OnLaunched.
[UITestMethod]
public void CreatesControlOnUiThread()
{
var grid = new Grid();
Assert.IsTrue(grid.DispatcherQueue.HasThreadAccess);
}
Una normale TestMethod non viene eseguita nella coda del dispatcher WinUI. Usarlo per i test che non richiedono il thread dell'interfaccia utente.
Configurare un'app di test non in pacchetto
Per un'app non in pacchetto, aggiungere queste proprietà:
<WindowsPackageType>None</WindowsPackageType>
<EnableMsixTooling>false</EnableMsixTooling>
Non fare riferimento Microsoft.Testing.Extensions.PackagedAppa . L'app non in pacchetto non ha identità MSIX o AppxManifest.xml nell'output, quindi MTP può avviare direttamente il file eseguibile.
Per impostazione predefinita, il SDK per app di Windows inserisce il relativo inizializzatore bootstrap quando il progetto soddisfa queste condizioni:
-
WindowsPackageTypeèNone. -
OutputTypeèExeoWinExe. -
WindowsAppSDKSelfContainednon ètrue.
Se un host che non è un'app SDK per app di Windows carica la libreria di test, impostare su WindowsAppSdkBootstrapInitializetrue nella libreria.
Note
VSTest non supporta questa configurazione winUI non in pacchetto. Eseguire il progetto con MTP.
Configurare un'app di test full-trust in pacchetto
Mantenere la configurazione WinUI in pacchetto predefinita:
- Non impostare
WindowsPackageTypesuNone. - Mantenere e gli
Package.appxmanifestasset del pacchetto nel progetto. - Impostare
EnableMsixToolingsutruese il progetto usa gli strumenti di creazione pacchetti MSIX a progetto singolo.
Dopo un'anteprima che include la registrazione MSIX con attendibilità completa e l'attivazione AUMID diventa disponibile, aggiungere tale versione specifica del Microsoft. Pacchetto Testing.Extensions.PackagedApp. Non usare un pacchetto precedente 1.0.0-alpha per questa configurazione.
Le proprietà MSBuild del pacchetto registrano l'utilità di avvio tramite AddSelfRegisteredExtensions. Non chiamare AddPackagedAppDeploymentanche . Un'esecuzione MTP può registrare una sola utilità di avvio host di test.
L'utilità di avvio esegue queste azioni:
- Verifica la presenza di un oggetto
AppxManifest.xmlche descrive l'eseguibile di test. - Registra il layout dell'output di compilazione con Windows.
- Risolve l'AUMID dell'app dal pacchetto registrato e dall'ID applicazione manifesto.
- Attiva l'app tramite AUMID e connette il processo attivato al controller MTP.
L'utilità di avvio ignora un manifesto non correlato in una directory predecessore, a meno che non punti Application di ingresso all'eseguibile di test. Un'app non in pacchetto che fa riferimento al pacchetto indirettamente rimane sul percorso di avvio diretto.
Prima di eseguire un'app di test in pacchetto, soddisfare questi requisiti:
- Usare un framework di destinazione specifico di Windows con versione
10.0.19041.0della piattaforma o versione successiva. - Per registrare il layout di output di compilazione non firmato, abilitare la modalità sviluppatore o configurare il trasferimento locale.
- Usa un'app desktop in pacchetto con attendibilità completa. L'estensione non supporta UWP o altri host AppContainer.
Caution
Microsoft.Testing.Extensions.PackagedApp e il ITestHostLauncher punto di estensione sono sperimentali. Una versione futura potrebbe modificare o rimuovere le API e il comportamento. Valutare i rischi prima di usare il modello in pacchetto nell'infrastruttura di test di produzione.
Esegui i test
Dalla directory contenente il progetto di test WinUI eseguire:
dotnet run
Per specificare il progetto, usare dotnet run --project .\WinUITests.csproj.
Per un'app non in pacchetto, MTP avvia direttamente il file eseguibile. Per un'app in pacchetto, l'utilità di avvio delle app in pacchetto registra il layout e attiva l'app tramite AUMID.
In entrambi i modelli viene visualizzata la finestra di test, MTP esegue i test e la finestra viene chiusa. Il terminale segnala quindi il riepilogo dei test. Un'esecuzione riuscita viene chiusa con il codice 0. Quando un test ha esito negativo, OnLaunched assegna il risultato diverso da zero RunAsync a Environment.ExitCode.
Usare dotnet run per entrambi i modelli. Per eseguire direttamente un'app non in pacchetto, usa l'eseguibile dell'app generata. Non usare dotnet exec perché WinUI risolve le risorse PRI relative al percorso del processo.
Risolvere i problemi di installazione
Usare questi controlli per individuare gli errori di installazione più comuni:
| Sintomo | Controlla |
|---|---|
L'app segnala più chiamate a Application.Start. |
Rimuovere l'attributo WinUITestTarget dall'app di test self-hosted. |
| L'esecuzione del test termina ma il processo rimane aperto. | Chiudere la finestra di test e chiamare Exit in un finally blocco dopo RunAsync. |
I test non superati restituiscono comunque il codice 0di uscita del processo . |
Assegnare il risultato di RunAsync a Environment.ExitCode. |
Un'esecuzione non in pacchetto ha esito negativo perché AppxManifest.xml manca. |
Verificare che il progetto abilita MTP e che l'esecuzione non usi VSTest. |
| Un'esecuzione in pacchetto non può registrare o attivare l'app. | Verificare il framework di destinazione specifico del Windows, la modalità sviluppatore o la configurazione sideload, il modello di app full-trust e la voce eseguibile del manifesto. |