WINUI 3 uygulamalarını MSTest ve Microsoft ile test edin. Testing.Platform

Microsoft kullanın. Bir WinUI 3 uygulamasında MSTest testlerini çalıştırmak için Testing.Platform (MTP). WinUI uygulaması, test konağı işlevi görür. Uygulama giriş noktasının, ui iş parçacığının ve işlem ömrünün sahibidir.

İki WinUI 3 dağıtım modeli arasından seçim yapın:

  • Paketlenmemiş bir uygulama, normal bir Windows yürütülebilir dosyası olarak çalışır.
  • Paketlenmiş bir tam güven uygulaması MSIX paket kimliğini korur ve test konasını kaydetmek ve etkinleştirmek için deneysel Microsoft.Testing.Extensions.PackagedApp uzantıyı kullanır.

Important

Paketlenmiş uygulama uzantısı, tam güven paketlenmiş masaüstü uygulamalarını destekler. UWP veya diğer AppContainer test konaklarını desteklemez.

Paketlenmiş tam güven AUMID etkinleştirmesi depoda microsoft/testfx uygulanır ancak 6 Ağustos 2026'dan itibaren genel NuGet paketinde kullanılamaz. Geçerli 1.0.0-alpha paketler Windows özgü etkinleştirme uygulamasını içermiyor. Paketlenmiş kurulumu yalnızca bir paket sürümü tam güven MSIX kaydı ve AUMID etkinleştirme desteği tanımladıktan sonra kullanın.

Dağıtım modeli seçme

Test projesini yapılandırmadan önce dağıtım modelini seçin.

Requirement Seç Ana bilgisayar başlatmayı test et
Testlerinizin paket kimliğine veya paket kimliği gerektiren API'lere ihtiyacı yoktur. Unpackaged MTP, uygulama yürütülebilir dosyasını doğrudan başlatır.
Testleriniz IÇIN MSIX paket kimliği veya paketlenmiş uygulama davranışı gerekir. MTP önizlemesi genel kullanıma sunulduktan sonra paketlenmiş tam güven Paketlenmiş uygulama uzantısı derleme çıkışını kaydeder ve uygulamayı Uygulama Kullanıcı Modeli Kimliği (AUMID) ile etkinleştirir.
Testlerinizin UWP veya başka bir AppContainer'da çalıştırılması gerekir. VSTest MTP paketlenmiş uygulama uzantısı AppContainer yalıtımını desteklemez.

Testleriniz paket kimliği gerektirmediği sürece paketlenmemiş bir uygulama kullanın. Paketlenmemiş model için paket kaydı, Geliştirici Modu veya deneysel paketlenmiş uygulama uzantısı gerekmez.

Genel MTP önizlemesi tam güven MSIX kaydı ve AUMID etkinleştirmesi içerene kadar, paketlenmiş tam güven WinUI 3 testleri için VSTest kullanın.

UWP sınırını anlama

UWP'ye başka bir paketlenmiş WinUI 3 modeli olarak davranmayın. Hem UAP 10'u hedefleyen klasik UWP projeleri hem de AppContainer'da çalışacak şekilde ayarlanan UseUwptrue modern .NET UWP projeleri. WinUI 3 masaüstü uygulamasını paketlemek, uygulamayı bu uygulama modeline yerleştirmez.

Klasik UWP ve modern .NET UWP testleri için VSTest kullanın. MTP paketlenmiş uygulama başlatıcısı, tam güven paketlenmiş masaüstü konaklarını hedefler. Etkinleştirme bağımsız değişkenlerini veya denetleyici bağlantısını bir AppContainer konağına iletemez.

Modern .NET UWP yapılandırması için bkz. MSTest .NET 9 UWP örneği.

WinUI test ana bilgisayarını yapılandırma

Her iki dağıtım modeli de aynı şirket içinde barındırılan MTP kurulumunu kullanır.

Ortak proje özelliklerini ayarlama

WinUI test projesinde şu özellikleri ayarlayın:

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

.NET 8 veya sonraki bir desteklenen .NET sürümünü kullanın. Örnek, Windows platform sürümünü 10.0.19041.0hedefler. Paketlenmiş uygulama uzantısı bu sürümü veya sonraki bir sürümü gerektirir.

Test uygulamanızın XAML dosyasına işaret eden WinUI ApplicationDefinition öğesini saklayın. WinUI bu öğeden bir giriş noktası oluşturur. MTP'nin ikinci bir giriş noktası oluşturmasını önlemek için olarak falseayarlayınGenerateTestingPlatformEntryPoint.

MSTest ve Microsoft'in geçerli uyumlu sürümlerine paket başvuruları ekleyin. WindowsAppSDK.

Uygulamadan MTP barındırma

WinUI Application sınıfında geçersiz kılınOnLaunched. Test penceresini oluşturup etkinleştirin ve ardından dağıtıcı kuyruğunu yayımlayın:

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

için UITestMethodAttributeekleyinusing Microsoft.VisualStudio.TestTools.UnitTesting.AppContainer;.

Komut satırı bağımsız değişkenlerinden MTP uygulamasını oluşturun. Ardından MSBuild'in katkıda bulunan uzantılarını kaydedin:

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();

MTP oluşturucu türleri için ekleyin using Microsoft.Testing.Platform.Builder; . WinUI derlemesi, işlem bağımsız değişkenlerine ekler EnableMSTestRunner . Bu bir MTP komut satırı seçeneği olmadığından, test uygulamasını oluşturmadan önce kaldırın.

Proje, oluşturulan MTP giriş noktasını devre dışı bırakır, bu nedenle öğesini çağırın AddSelfRegisteredExtensions. Paketlenmiş bir uygulama için yöntemi başlatıcıyı Microsoft.Testing.Extensions.PackagedApp da kaydeder.

içinde OnLaunched, test uygulaması oluşturma ve yürütmeyi bir try bloğuna yerleştirin. sonucunu öğesine atayın await app.RunAsync()Environment.ExitCode. Bir finally blokta pencereyi kapatın ve uygulamanın yöntemini çağırın Exit .

Yaşam döngüsü adımları iki garanti sağlar:

  • İşlem MTP çıkış kodunu döndürür, bu nedenle başarısız bir test sıfır olmayan bir işlem çıkış kodu üretir.
  • WinUI ileti döngüsü, test işlemini etkin bırakmak yerine çalıştırmadan sonra durur.

Warning

Şirket içinde barındırılan bir WinUI test uygulamasına eklemeyin [assembly: WinUITestTarget(...)] . özniteliği, ayrı bir test konağı için bir WinUI uygulaması başlatır. Şirket içinde barındırılan bir uygulama önce çağrılar Application.Start . Öznitelik daha sonra aynı işlemde ikinci bir uygulama başlatmayı dener.

Eksiksiz bir uygulama için paketlenmemiş WinUI örneğine ve paketlenmiş WinUI örneğine bakın.

Ui iş parçacığında testleri çalıştırma

WinUI nesneleri oluşturan veya bu nesnelere erişen bir test için kullanın UITestMethod . MSTest, testi sırasında OnLaunchedatadığınız dağıtıcı kuyruğunda zamanlar.

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

WinUI dağıtıcısı kuyruğunda bir normal TestMethod çalıştırılmıyor. Ui iş parçacığı gerektirmeyen testler için kullanın.

Paketlenmemiş test uygulamasını yapılandırma

Paketlenmemiş bir uygulama için şu özellikleri ekleyin:

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

öğesine başvurmayın Microsoft.Testing.Extensions.PackagedApp. Paketlenmemiş uygulamanın msix kimliği veya AppxManifest.xml çıkışı yoktur, bu nedenle MTP doğrudan yürütülebilir dosyasını başlatabilir.

Varsayılan olarak, proje şu koşulları karşıladığında Windows Uygulama SDK'sı bootstrap başlatıcısını eklenir:

  • WindowsPackageType, None'e eşittir.
  • OutputTypeveya ExeşeklindedirWinExe.
  • WindowsAppSDKSelfContained, true değildir.

Windows Uygulama SDK'sı uygulaması olmayan bir konak test kitaplığınızı yüklerse, kitaplıkta olarak true ayarlayınWindowsAppSdkBootstrapInitialize.

Note

VSTest bu paketlenmemiş WinUI yapılandırmasını desteklemez. Projeyi MTP ile çalıştırın.

Paketlenmiş tam güven testi uygulamasını yapılandırma

Varsayılan paketlenmiş WinUI yapılandırmasını koruyun:

  • WindowsPackageType öğesini None olarak ayarlamayın.
  • Ve paket varlıklarını projede tutun Package.appxmanifest .
  • true Projenizin tek projeli MSIX paketleme araçlarını kullanıp kullanmayacağını olarak ayarlayınEnableMsixTooling.

Tam güven MSIX kaydını ve AUMID etkinleştirmesini içeren bir önizleme kullanıma sunulduktan sonra, Microsoft belirli bir sürümünü ekleyin. Testing.Extensions.PackagedApp paketi. Bu kurulum için önceki 1.0.0-alpha bir paketi kullanmayın.

Paketin MSBuild props, başlatıcıyı aracılığıyla AddSelfRegisteredExtensionskaydeder. öğesini de çağırmayın AddPackagedAppDeployment. MTP çalıştırması yalnızca bir test ana bilgisayar başlatıcısı kaydedebilir.

Başlatıcı şu eylemleri gerçekleştirir:

  1. Test yürütülebilir dosyasını açıklayan bir AppxManifest.xml öğesini denetler.
  2. Derleme-çıkış düzenini Windows kaydeder.
  3. Kayıtlı paket ve bildirim uygulaması kimliğinden uygulamanın AUMID'sini çözümler.
  4. Uygulamayı AUMID ile etkinleştirir ve etkinleştirilmiş işlemi MTP denetleyicisine bağlar.

Başlatıcı, bir giriş test yürütülebilir dosyasını işaret etmediği sürece bir ata dizinindeki ilgisiz bildirimi Application yoksayar. Pakete dolaylı olarak başvuran paketlenmemiş bir uygulama doğrudan başlangıç yolunda kalır.

Paketlenmiş bir test uygulamasını çalıştırmadan önce şu gereksinimleri karşılayın:

  • Platform sürümü veya sonraki sürümlerle 10.0.19041.0 Windows özgü bir hedef çerçeve kullanın.
  • İmzasız derleme-çıkış düzenini kaydetmek için Geliştirici Modu'nu etkinleştirin veya dışarıdan yüklemeyi yapılandırın.
  • Tam güven paketine sahip bir masaüstü uygulaması kullanın. Uzantı UWP veya diğer AppContainer konaklarını desteklemez.

Caution

Microsoft.Testing.Extensions.PackagedApp ITestHostLauncher ve uzantı noktası deneyseldir. Gelecekteki bir sürüm API'lerini ve davranışlarını değiştirebilir veya kaldırabilir. Üretim testi altyapısında paketlenmiş modeli kullanmadan önce riskleri değerlendirin.

Testleri çalıştırma

WinUI test projesini içeren dizinden şunu çalıştırın:

dotnet run

Projeyi belirtmek için kullanın dotnet run --project .\WinUITests.csproj.

Paketlenmemiş bir uygulama için MTP yürütülebilir dosyayı doğrudan başlatır. Paketlenmiş bir uygulama için paketlenmiş uygulama başlatıcı düzeni kaydeder ve uygulamayı AUMID ile etkinleştirir.

Her iki modelde de test penceresi açılır, MTP testleri çalıştırır ve pencere kapanır. Terminal daha sonra test özetini bildirir. Başarılı bir çalıştırma koduyla 0çıkılır. Bir test başarısız olduğunda sıfır OnLaunched olmayan RunAsync sonucu öğesine Environment.ExitCodeatar.

Her iki model için de kullanın dotnet run . Paketlenmemiş bir uygulamayı doğrudan çalıştırmak için oluşturulan uygulama yürütülebilir dosyasını kullanın. WinUI, PRI kaynaklarını işlem yoluna göre çözümlediğinden kullanmayın dotnet exec .

Kurulum sorunlarını giderme

En yaygın kurulum hataları için şu denetimleri kullanın:

Belirti Kontrol
Uygulama, öğesine Application.Startbirden çok çağrı bildirir. Özniteliği şirket WinUITestTarget içinde barındırılan test uygulamasından kaldırın.
Test çalıştırması tamamlar, ancak işlem açık kalır. Test penceresini kapatın ve sonrasında RunAsyncbir finally blok içinde çağrısı Exit yapın.
Başarısız testler yine de işlem çıkış kodu 0döndürür. sonucunu öğesine atayın RunAsyncEnvironment.ExitCode.
Paketlenmemiş çalıştırma eksik olduğundan AppxManifest.xml başarısız oluyor. Projenin MTP'yi etkinleştirdiğini ve çalıştırmanın VSTest kullanmadığını onaylayın.
Paketlenmiş çalıştırma, uygulamayı kaydedemez veya etkinleştiremez. Windows özgü hedef çerçeveyi, Geliştirici Modu'nu veya dışarıdan yükleme yapılandırmasını, tam güven uygulama modelini ve bildirim yürütülebilir girdisini onaylayın.

Ayrıca bakınız