UWP 및 WinUI 3 애플리케이션에서 MSTest 테스트를 실행하려면 Microsoft.Testing.Platform(MTP)을 사용하세요. 애플리케이션은 테스트 호스트 역할을 하며 UI 스레드 및 프로세스 수명을 소유합니다.
Important
이 문서에 설명된 전체 Windows 애플리케이션 지원 매트릭스는 MSTest 4.5 및 MTP 2.5에서 사용할 수 있습니다. 안정적인 버전이 릴리스될 때까지 일치하는 4.5 및 2.5 미리 보기 패키지를 사용합니다. MTP 패키지를 직접 관리하는 경우 플랫폼 및 확장 패키지 버전을 정렬된 상태로 유지합니다.
애플리케이션 모델 선택
MSTest.Sdk는 MTP를 통해 다음과 같은 Windows 애플리케이션 모델을 지원합니다.
| 애플리케이션 모델 | 패키징 및 신뢰 | 호스트 시작 테스트 | 명령 실행 |
|---|---|---|---|
클래식 UWP (uap10.0) |
패키지형 AppContainer | 완전 신뢰 사이드카가 패키지를 등록하고 AUMID(애플리케이션 사용자 모델 ID)로 앱을 활성화합니다. |
MSBuild 대상과 InvokeTestingPlatform 함께 |
최신 UWP(.NET 10 포함UseUwp) |
패키지된 AppContainer | 완전 신뢰 수준의 사이드카가 패키지를 등록하고 AUMID를 사용하여 앱을 활성화합니다. |
MSBuild 대상과 InvokeTestingPlatform 함께 |
| 패키지형 WinUI 3 | 패키지형 완전 신뢰 | 완전 신뢰 수준의 사이드카가 패키지를 등록하고 AUMID를 통해 앱을 활성화합니다. |
dotnet run 또는 dotnet test --project |
| 패키지되지 않은 WinUI 3 | 패키지 ID 없음, 완전 신뢰 | MTP는 앱 실행 파일을 직접 시작합니다. |
dotnet run 또는 dotnet test --project |
WinUI 3 packagedClassicApp 및 TrustLevel="appContainer" |
패키지된 AppContainer | 완전 신뢰 사이드카는 앱을 활성화하고 MTP 통신 파이프에서 정확한 SID(패키지 보안 식별자)에 권한을 부여합니다. |
dotnet msbuild 대상과 InvokeTestingPlatform 함께 |
패키징 및 샌드박싱은 별도의 선택 사항입니다. 패키지된 WinUI 3 데스크톱 앱에는 패키지 ID가 있지만 기본적으로 완전 신뢰 프로세스로 실행됩니다. UWP 앱은 항상 AppContainer에서 실행됩니다. 패키지된 WinUI 3 앱은 매니페스트가 설정 TrustLevel="appContainer"될 때만 AppContainer에서 실행됩니다.
이전 MSTest 또는 MTP 버전의 경우 UWP 프로젝트에 대한 기존 VSTest 구성을 유지합니다. UWP 및 AppContainer 호스트에 대한 네이티브 MTP 실행에는 MSTest 4.5 및 MTP 2.5가 필요합니다.
MTP 앱 모델 사이드카 이해하기
패키지된 앱의 경우 패키지 내에서 초기 테스트 도구 프로세스를 실행할 수 없습니다. MSTest.Sdk는 다음과 같은 완전 신뢰 사이드카 컨트롤러를 시작합니다.
- 명령줄 인수를 준비하고 취소, 재시도, 보고서 및 종료 코드 처리를 소유합니다.
- 빌드 출력 패키지를 등록하고 AUMID에 의해 정확한 매니페스트 애플리케이션을 활성화합니다.
- AppContainer 호스트가 명명된 파이프 MTP에 연결할 때 선택한 패키지 SID만 권한을 부여합니다.
- 패키지가 소유한 스토리지에서 TRX, 덤프, 진단 및 재시도 아티팩트를 복구합니다.
테스트 애플리케이션은 자체 프로세스에서 MTP 및 MSTest를 계속 호스트합니다. UWP 실행에는 Microsoft.NET.Test.Sdk, vstest.console, UwpTestHostRuntimeProvider 또는 Visual Studio 배포 런타임이 필요하지 않습니다.
UWPwindowsApp의 경우 Windows 일반 프로세스 인수 대신 하나의 활성화 문자열 LaunchActivatedEventArgs.Arguments 을 제공합니다. MTP 작성기를 만들기 전에 호출 PackagedAppExtensions.GetTestApplicationArguments 합니다. 패키지된 앱 확장은 원래 인수 배열 및 컨트롤러 연결 메타데이터를 복원합니다.
AppContainer에서 실행되는 인수를 포함하여 WinUI 3 packagedClassicApp의 경우 일반 프로세스 인수를 사용합니다.
필수 구성 요소 충족
프로젝트에 적용되는 필수 구성 요소를 사용합니다.
- MSTest 4.5 도구 체인 및
dotnet test --project에 .NET SDK 10 이상을 사용합니다. - UWP의 경우 유니버설 Windows 플랫폼 워크로드 및 필요한 Windows SDK와 함께 Visual Studio 데스크톱 MSBuild를 사용합니다. 이러한 구성 요소는 빌드 시간 지원만 제공합니다.
- WinUI 3의 경우 Windows 애플리케이션 개발 도구를 설치하고 호환되는 Windows 앱 SDK 버전을 참조합니다.
- 패키지된 테스트 앱의 경우 Windows에서 서명되지 않은 빌드 출력 레이아웃을 등록할 수 있도록 Windows 개발자 모드를 활성화하거나 사이드로딩을 구성합니다.
- AppContainer 테스트 앱의 경우 관리자가 아닌 사용자로 컨트롤러를 실행합니다.
UWP 테스트 구성
최신 UWP 프로젝트 구성
MSTest.Sdk 4.5 이상을 사용하고, Windows 플랫폼 버전을 지정해 .NET 10을 대상으로 하며, true를 UseUwp(으)로 설정합니다. 기존 UWP XAML, MSIX, 아키텍처 및 네이티브 AOT 설정을 유지합니다.
Visual Studio 일반적으로 빌드하는 동안 사용하도록 설정합니다UseUwpTools. MSTest.Sdk는 UWP 애플리케이션 모델이 있는 true경우 UseUwpTools 또는 아직 설정되지 않은 경우 trueUseUwpUseUwpTools 를 선택합니다.
UWP가 아닌 MTP 테스트 애플리케이션에서만 UWP 참조가 필요한 경우 로 설정합니다 UseUwpToolsfalse. 그런 다음 다른 패키지된 애플리케이션 모델에 사이드카가 필요하지 않은 경우 SDK는 직접 MTP 실행기를 사용합니다.
전체 프로젝트는 최신 UWP MTP 샘플을 참조하세요.
클래식 UWP 프로젝트 구성
기존 uap10.0 프로젝트 셰이프, 데스크톱 MSBuild 도구 체인 및 UWP 확장 SDK를 유지합니다. MSTest.Sdk 4.5 이상을 가져오고 MSTest Runner 및 MTP를 사용하도록 설정합니다. MSTest.Sdk는 UAP 호환 부트스트랩, 어댑터 및 런타임 자산을 제공합니다.
전체 프로젝트는 클래식 UWP MTP 샘플을 참조하세요.
UWP 테스트 실행
Visual Studio 개발자 PowerShell을 엽니다. 구체적인 아키텍처에 대한 솔루션을 빌드한 다음 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"
두 번째 명령은 패키지를 등록하고, AUMID로 앱을 활성화하고, 일반 및 UI 스레드 테스트를 실행하고, 패키지 스토리지에서 결과 아티팩트를 복사하고, 테스트 실행 종료 코드를 반환합니다.
WinUI 3 테스트 구성
MSTest.Sdk 4.5 이상을 사용하고, true를 UseWinUI로 설정한 다음, Windows 전용 대상 프레임워크를 대상으로 지정하세요. 패키지된 활성화의 경우 Windows 플랫폼 버전 10.0.19041.0 이상을 사용합니다.
WinUI 애플리케이션에서 MTP 호스트
자체 호스팅 WinUI 테스트 앱의 경우 다음에서 OnLaunched테스트 창을 만들고 활성화한 다음, 디스패처 큐를 게시합니다.
_window = new UnitTestAppWindow();
_window.Activate();
UITestMethodAttribute.DispatcherQueue = _window.DispatcherQueue;
생성된 MTP 도우미를 실행하고, 그 결과를 Environment.ExitCode에 할당한 다음 창을 닫고 Exit를 호출합니다.
Environment.ExitCode = await MicrosoftTestingPlatformApplication.RunAsync(
Environment.GetCommandLineArgs()[1..]);
WinUI 개체를 만들거나 액세스하는 테스트에 사용합니다 UITestMethod . UI 스레드가 필요하지 않은 테스트에 사용합니다 TestMethod .
Warning
자체 호스팅 WinUI 테스트 앱에 추가 [assembly: WinUITestTarget(...)] 하지 마세요. 이 특성은 별도의 테스트 호스트용 WinUI 애플리케이션을 시작하지만, 자체 호스팅된 앱은 이미 Application.Start를 호출했습니다.
패키지되지 않은 앱 구성
WindowsPackageType을 None로 설정합니다. 앱에 MSIX 식별자 또는 AppxManifest.xml가 없으므로, MTP가 해당 실행 파일을 직접 실행합니다. 패키지 앱 확장을 수동으로 추가하지 마세요.
Windows 앱 SDK 일반적으로 프로젝트가 다음 조건을 충족할 때 부트스트랩 이니셜라이저를 삽입합니다.
-
WindowsPackageType은None입니다. -
OutputType은Exe또는WinExe입니다. -
WindowsAppSDKSelfContained가 아닙니다true.
Windows 앱 SDK 앱이 아닌 호스트가 테스트 라이브러리를 로드하는 경우 라이브러리에서 WindowsAppSdkBootstrapInitialize를 true로 설정하세요.
VSTest는 WinUI 공급자에 AppX 매니페스트가 필요하기 때문에 패키지되지 않은 WinUI 3 테스트 앱을 지원하지 않습니다.
전체 프로젝트는 패키지되지 않은 WinUI MTP 샘플을 참조하세요.
패키지된 완전 신뢰 앱 구성
기본 패키지된 WinUI 구성 및 해당 Package.appxmanifest를 유지합니다. MSTest.Sdk는 패키지된 프로젝트에 대해 자동으로 참조하고 등록합니다 Microsoft.Testing.Extensions.PackagedApp .
AddPackagedAppDeployment도 호출하지 마세요. MTP 실행은 하나의 테스트 호스트 시작 관리자만 등록할 수 있습니다. 사용자 지정 시작 관리자가 패키지된 활성화를 담당하는 경우에만 false를 EnableMicrosoftTestingExtensionsPackagedApp(으)로 설정하세요.
전체 프로젝트는 패키지된 WinUI MTP 샘플을 참조하세요.
AppContainer 앱 구성
WinUI 패키지 매니페스트에서 애플리케이션을 packagedClassicApp로 구성하고 TrustLevel="appContainer"을 설정합니다. MTP 2.5는 컨트롤러 및 확장 파이프의 정확한 패키지 SID에 권한을 부여합니다.
ALL APPLICATION PACKAGES를 부여하지도 않고 루프백 예외를 요구하지도 않습니다.
상승되지 않은 사이드카를 실행합니다. 사이드카가 패키지 InvokeTestingPlatform에서 요청된 결과 디렉터리로 결과 및 진단 정보를 복사할 수 있도록 LocalState 대상을 사용합니다.
전체 프로젝트는 AppContainer WinUI MTP 샘플을 참조하세요.
WinUI 3 테스트 실행
구체적인 아키텍처를 위한 빌드입니다. 패키지된 전체 신뢰 앱 또는 패키지되지 않은 앱의 경우 다음을 실행합니다:
dotnet build -p:Platform=x64
dotnet test --project . --no-build -p:Platform=x64
또한 dotnet run --no-build -p:Platform=x64을 사용할 수 있습니다.
AppContainer WinUI 앱에는 사이드카 타깃과 절대 결과 디렉터리를 사용하세요.
dotnet msbuild .\WinUITests.csproj -t:InvokeTestingPlatform -p:Platform=x64 "-p:TestingPlatformCommandLineArguments=--report-trx --results-directory C:\TestResults"
WinUI 앱에는 dotnet exec를 사용하지 마세요. WinUI는 프로세스 경로를 기준으로 PRI 리소스를 확인합니다.
설치 문제 해결
| 증상 | 확인 |
|---|---|
앱은 Application.Start에 대한 여러 호출을 보고합니다. |
자체 호스팅 WinUI 테스트 앱에서 WinUITestTarget 특성을 제거하세요. |
| 테스트 실행이 완료되지만 프로세스는 계속 열려 있습니다. | MTP 실행이 완료된 후 테스트 창을 닫고 호출 Exit 합니다. |
실패한 테스트는 프로세스 종료 코드를 0반환합니다. |
MTP 실행 결과를 .에 할당합니다 Environment.ExitCode. |
패키지되지 않은 WinUI 실행에서 AppxManifest.xml 누락이 보고됩니다. |
프로젝트에서 VSTest 대신 MTP를 사용하는지 확인합니다. |
| 패키지 실행은 앱을 등록하거나 활성화할 수 없습니다. | Windows 대상 프레임워크, 개발자 모드 또는 사이드로딩 정책, 아키텍처 및 매니페스트의 실행 파일 항목을 확인합니다. |
| AppContainer 호스트는 컨트롤러에 연결할 수 없습니다. | MSTest 4.5 및 MTP 2.5 이상을 사용하고, 컨트롤러를 관리자 권한 없이 실행하세요. |
| AppContainer 보고서는 요청된 디렉터리에 복사되지 않습니다. | 절대 결과 디렉터리를 사용하고 InvokeTestingPlatform 지정합니다. |
참고하십시오
.NET