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 프로젝트가 다음 조건을 충족할 때 부트스트랩 이니셜라이저를 삽입합니다.
-
WindowsPackageType은None입니다. -
OutputType은Exe또는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 실행은 하나의 테스트 호스트 시작 관리자만 등록할 수 있습니다.
시작 관리자가 다음 작업을 수행합니다.
- 테스트 실행 파일을 설명하는 파일을 확인
AppxManifest.xml합니다. - 빌드 출력 레이아웃을 Windows 등록합니다.
- 등록된 패키지 및 매니페스트 애플리케이션 ID에서 앱의 AUMID를 확인합니다.
- 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 특정 대상 프레임워크, 개발자 모드 또는 테스트용 로드 구성, 완전 신뢰 앱 모델 및 매니페스트 실행 파일 항목을 확인합니다. |
참고하십시오
.NET