MSTest 및 Microsoft 사용하여 WinUI 3 앱을 테스트합니다. Testing.Platform

Microsoft 사용합니다. WinUI 3 앱 내에서 MSTest 테스트를 실행하는 MTP(Testing.Platform)입니다. WinUI 앱은 테스트 호스트 역할을 합니다. 애플리케이션 진입점, UI 스레드 및 프로세스 수명을 소유합니다.

두 WinUI 3 배포 모델 중에서 선택합니다.

  • 패키지되지 않은 앱은 일반 Windows 실행 파일로 실행됩니다.
  • 패키지된 완전 신뢰 앱은 MSIX 패키지 ID를 유지하고 실험적 Microsoft.Testing.Extensions.PackagedApp 확장을 사용하여 테스트 호스트를 등록하고 활성화합니다.

Important

패키지된 앱 확장은 완전 신뢰 패키지 데스크톱 앱을 지원합니다. UWP 또는 다른 AppContainer 테스트 호스트를 지원하지 않습니다.

패키지된 완전 신뢰 AUMID 활성화는 리포지토리에서 구현되지만 2026년 microsoft/testfx 8월 6일부터 퍼블릭 NuGet 패키지에서는 사용할 수 없습니다. 현재 1.0.0-alpha 패키지에는 Windows 특정 활성화 구현이 포함되어 있지 않습니다. 패키지 릴리스가 완전 신뢰 MSIX 등록 및 AUMID 활성화에 대한 지원을 식별한 후에만 패키지 설정을 사용합니다.

배포 모델 선택

테스트 프로젝트를 구성하기 전에 배포 모델을 선택합니다.

요구 사항 선택 호스트 시작 테스트
테스트에는 패키지 ID 또는 패키지 ID가 필요한 API가 필요하지 않습니다. Unpackaged MTP는 앱 실행 파일을 직접 시작합니다.
테스트에는 MSIX 패키지 ID 또는 패키지 앱 동작이 필요합니다. MTP 미리 보기를 공개적으로 사용할 수 있게 된 후 패키지된 완전 신뢰 패키지 앱 확장은 빌드 출력을 등록하고 AUMID(애플리케이션 사용자 모델 ID)로 앱을 활성화합니다.
테스트는 UWP 또는 다른 AppContainer에서 실행해야 합니다. VSTest MTP 패키지 앱 확장은 AppContainer 격리를 지원하지 않습니다.

테스트에 패키지 ID가 필요하지 않은 경우 패키지되지 않은 앱을 사용합니다. 패키지되지 않은 모델에는 패키지 등록, 개발자 모드 또는 실험적 패키지 앱 확장이 필요하지 않습니다.

퍼블릭 MTP 미리 보기에 완전 신뢰 MSIX 등록 및 AUMID 활성화가 포함될 때까지 패키지된 완전 신뢰 WinUI 3 테스트에 VSTest를 사용합니다.

UWP 경계 이해

UWP를 패키지된 다른 WinUI 3 모델로 취급하지 마세요. AppContainer에서 실행되도록 설정된 UseUwp UAP 10 및 최신 .NET UWP 프로젝트를 대상으로 하는 true 클래식 UWP 프로젝트입니다. WinUI 3 데스크톱 앱을 패키징해도 해당 앱 모델에 배치되지 않습니다.

클래식 UWP 및 최신 .NET UWP 테스트에 VSTest를 사용합니다. 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대상으로 합니다. 패키지된 앱 확장에는 이 버전 이상이 필요합니다.

테스트 앱의 XAML 파일을 가리키는 WinUI ApplicationDefinition 항목을 유지합니다. WinUI는 해당 항목에서 진입점을 생성합니다. MTP가 두 번째 진입점을 생성하지 못하도록 하려면 .로 false설정합니다GenerateTestingPlatformEntryPoint.

현재 호환되는 MSTest 및 Microsoft 버전에 패키지 참조를 추가합니다. WindowsAppSDK.

애플리케이션에서 MTP 호스트

WinUI Application 클래스에서 재정 OnLaunched 의합니다. 테스트 창을 만들고 활성화한 다음, 디스패처 큐를 게시합니다.

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

MTP 작성기 형식에 대해 추가 using Microsoft.Testing.Platform.Builder; 합니다. WinUI 빌드는 프로세스 인수에 추가됩니다 EnableMSTestRunner . MTP 명령줄 옵션이 아니므로 테스트 애플리케이션을 만들기 전에 제거합니다.

프로젝트에서 생성된 MTP 진입점을 사용하지 않도록 설정하므로 호출 AddSelfRegisteredExtensions합니다. 패키지된 앱의 경우 이 메서드는 시작 관리자도 등록합니다 Microsoft.Testing.Extensions.PackagedApp .

에서 OnLaunched테스트 애플리케이션 만들기 및 실행을 블록에 배치합니다 try . 의 결과를 await app.RunAsync() 할당합니다 Environment.ExitCode. 블록에서 finally 창을 닫고 애플리케이션의 Exit 메서드를 호출합니다.

수명 주기 단계는 다음 두 가지 보장을 제공합니다.

  • 이 프로세스는 MTP 종료 코드를 반환하므로 실패한 테스트는 0이 아닌 프로세스 종료 코드를 생성합니다.
  • WinUI 메시지 루프는 테스트 프로세스를 활성 상태로 두지 않고 실행 후에 중지됩니다.

Warning

자체 호스팅 WinUI 테스트 앱에 추가 [assembly: WinUITestTarget(...)] 하지 마세요. 이 특성은 별도의 테스트 호스트에 대한 WinUI 애플리케이션을 시작합니다. 자체 호스팅 앱이 먼저 호출 Application.Start 됩니다. 그런 다음 특성은 동일한 프로세스에서 두 번째 애플리케이션을 시작하려고 시도합니다.

전체 구현은 패키지되지 않은 WinUI 샘플패키지된 WinUI 샘플을 참조하세요.

UI 스레드에서 테스트 실행

WinUI 개체를 만들거나 액세스하는 테스트에 사용합니다 UITestMethod . MSTest는 사용자가 OnLaunched할당한 디스패처 큐에서 테스트를 예약합니다.

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

일반 TestMethod 은 WinUI 디스패처 큐에서 실행되지 않습니다. UI 스레드가 필요하지 않은 테스트에 사용합니다.

패키지되지 않은 테스트 앱 구성

패키지되지 않은 앱의 경우 다음 속성을 추가합니다.

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

참조 Microsoft.Testing.Extensions.PackagedApp하지 마세요. 패키지되지 않은 앱에는 MSIX ID 또는 AppxManifest.xml 출력이 없으므로 MTP는 실행 파일을 직접 시작할 수 있습니다.

기본적으로 Windows 앱 SDK 프로젝트가 다음 조건을 충족할 때 부트스트랩 이니셜라이저를 삽입합니다.

  • WindowsPackageTypeNone입니다.
  • OutputTypeExe 또는 WinExe입니다.
  • WindowsAppSDKSelfContained 가 아닙니다 true.

Windows 앱 SDK 앱이 아닌 호스트가 테스트 라이브러리를 로드하는 경우 라이브러리로 설정합니다 WindowsAppSdkBootstrapInitializetrue.

메모

VSTest는 패키지되지 않은 이 WinUI 구성을 지원하지 않습니다. MTP를 사용하여 프로젝트를 실행합니다.

패키지된 완전 신뢰 테스트 앱 구성

기본 패키지 WinUI 구성을 유지합니다.

  • WindowsPackageType을/를 None로 설정하지 마세요.
  • 프로젝트의 패키지 자산을 유지하고 Package.appxmanifest 유지합니다.
  • true 프로젝트에서 단일 프로젝트 MSIX 패키징 도구를 사용하는 경우로 설정합니다EnableMsixTooling.

완전 신뢰 MSIX 등록 및 AUMID 활성화를 포함하는 미리 보기를 사용할 수 있게 되면 해당 특정 버전의 Microsoft 추가합니다. Testing.Extensions.PackagedApp 패키지. 이 설정에 이전 1.0.0-alpha 패키지를 사용하지 마세요.

패키지의 MSBuild 소품은 시작 관리자를 통해 AddSelfRegisteredExtensions등록합니다. 호출 AddPackagedAppDeployment하지 마세요. MTP 실행은 하나의 테스트 호스트 시작 관리자만 등록할 수 있습니다.

시작 관리자가 다음 작업을 수행합니다.

  1. 테스트 실행 파일을 설명하는 파일을 확인 AppxManifest.xml 합니다.
  2. 빌드 출력 레이아웃을 Windows 등록합니다.
  3. 등록된 패키지 및 매니페스트 애플리케이션 ID에서 앱의 AUMID를 확인합니다.
  4. AUMID에서 앱을 활성화하고 활성화된 프로세스를 MTP 컨트롤러에 연결합니다.

시작 관리자는 진입점이 테스트 실행 파일을 가리키지 않는 한 Application 상위 디렉터리에서 관련 없는 매니페스트를 무시합니다. 패키지를 간접적으로 참조하는 패키지되지 않은 앱은 직접 시작 경로에 남아 있습니다.

패키지된 테스트 앱을 실행하기 전에 다음 요구 사항을 충족합니다.

  • 플랫폼 버전 10.0.19041.0 이상에서 Windows 특정 대상 프레임워크를 사용합니다.
  • 서명되지 않은 빌드 출력 레이아웃을 등록하려면 개발자 모드를 사용하도록 설정하거나 사이드로드를 구성합니다.
  • 완전 신뢰 패키지 데스크톱 앱을 사용합니다. 확장은 UWP 또는 다른 AppContainer 호스트를 지원하지 않습니다.

Caution

Microsoft.Testing.Extensions.PackagedApp 확장 지점은 ITestHostLauncher 실험적입니다. 이후 릴리스에서는 해당 API 및 동작을 변경하거나 제거할 수 있습니다. 프로덕션 테스트 인프라에서 패키지된 모델을 사용하기 전에 위험을 평가합니다.

테스트 실행

WinUI 테스트 프로젝트가 포함된 디렉터리에서 다음을 실행합니다.

dotnet run

프로젝트를 지정하려면 .를 사용합니다 dotnet run --project .\WinUITests.csproj.

패키지되지 않은 앱의 경우 MTP는 실행 파일을 직접 시작합니다. 패키지된 앱의 경우 packaged-app 시작 관리자가 레이아웃을 등록하고 AUMID로 앱을 활성화합니다.

두 모델에서 테스트 창이 열리고 MTP가 테스트를 실행하고 창이 닫힙니다. 그런 다음 터미널에서 테스트 요약을 보고합니다. 성공적인 실행은 코드 0와 함께 종료됩니다. 테스트가 실패하면 OnLaunched 0 RunAsync 이 아닌 결과를 .에 할당합니다 Environment.ExitCode.

두 모델 중 하나에 사용합니다 dotnet run . 패키지되지 않은 앱을 직접 실행하려면 생성된 앱 실행 파일을 사용합니다. WinUI는 프로세스 경로를 기준으로 PRI 리소스를 확인하므로 사용하지 dotnet exec 마세요.

설치 문제 해결

가장 일반적인 설치 실패에 대해 다음 검사를 사용합니다.

증상 확인
앱은 .에 대한 여러 호출을 보고합니다 Application.Start. WinUITestTarget 자체 호스팅 테스트 앱에서 특성을 제거합니다.
테스트 실행이 완료되지만 프로세스는 계속 열려 있습니다. 테스트 창을 닫은 후 RunAsync블록에서 finally 호출 Exit 합니다.
실패한 테스트는 여전히 프로세스 종료 코드를 0반환합니다. 의 결과를 RunAsync 할당합니다 Environment.ExitCode.
패키지되지 않은 실행이 누락되어 실패합니다 AppxManifest.xml . 프로젝트에서 MTP를 사용하도록 설정하고 실행에서 VSTest를 사용하지 않는지 확인합니다.
패키지 실행은 앱을 등록하거나 활성화할 수 없습니다. Windows 특정 대상 프레임워크, 개발자 모드 또는 테스트용 로드 구성, 완전 신뢰 앱 모델 및 매니페스트 실행 파일 항목을 확인합니다.

참고하십시오