다음을 통해 공유


Microsoft.Testing.Platform 아키텍처

새로운 테스트 플랫폼에 오신 것을 환영합니다! 해당 기능에 익숙해지도록 하기 위해 테스트를 등록하고 실행하는 방법을 보여 주는 간단한 예제로 시작하겠습니다. 이 기본 예제는 핵심 기능과 신속하게 시작하는 방법을 확실하게 이해할 수 있게 해줍니다.

메모

이 문서의 모든 개념은 Microsoft Test Framework 리포지토리에서 전체 샘플로 예시됩니다. 자세한 내용은 샘플 코드참조하세요.

1단계: 간단한 테스트 애플리케이션 등록 및 실행

이 초기 예제에서는 테스트 애플리케이션을 선언하고 실행하는 기본 단계를 안내합니다. 이 간단한 접근 방식을 사용하면 최소한의 설정으로 플랫폼 사용을 즉시 시작할 수 있습니다.

2단계: 플랫폼 확장

첫 번째 테스트 애플리케이션을 만드는 방법을 검색한 후에는 테스트 애플리케이션 확장을 둘러싼 개념을 부분적으로 다루는 확장 예제를 살펴봅니다.

3단계: 확장 지점 대한 포괄적인 개요

기본 사항에 익숙해지면 다양한 확장 지점을 자세히 살펴보게 됩니다. 여기에는 다음이 포함됩니다.

  1. 플랫폼 및 테스트 프레임워크 기능: 플랫폼 및 테스트 프레임워크에서 제공하는 모든 기능을 이해하여 효과적으로 활용할 수 있습니다.

  2. 사용자 지정 테스트 프레임워크: 사용자 지정 테스트 프레임워크를 작성하고 등록하여 테스트 환경을 특정 요구 사항에 맞게 조정할 수 있도록 하는 방법입니다.

  3. In-Process 및 외부 프로세스 확장: 내부 프로세스 확장과 외부 프로세스 확장을 모두 작성하고 등록하는 방법에 대한 자세한 지침으로 플랫폼 확장의 유연성을 제공합니다.

  4. 실행 순서: 다양한 확장 지점에 대한 실행 순서를 명확히 하여 사용자 지정 확장의 원활한 통합 및 작동을 보장합니다.

4단계: 사용 가능한 서비스 및 도우미

마지막으로 플랫폼 내에서 사용 가능한 서비스 및 도우미 함수의 전체 목록을 검토합니다. 이 섹션은 강력하고 효율적인 테스트 확장을 만들기 위해 원하는 대로 모든 도구를 활용하는 데 도움이 되는 참조 역할을 합니다.

이 구조화된 접근 방식에 따라 기본 사용에서 고급 사용자 지정에 이르기까지 테스트 플랫폼에 대한 포괄적인 이해를 얻을 수 있습니다. 시작해 플랫폼이 제공할 수 있는 모든 잠재력을 살펴보겠습니다.

1단계: 간단한 테스트 애플리케이션 등록 및 실행

테스트 플랫폼의 아키텍처를 소개하기 위해 이 문서에서는 클래식 콘솔 애플리케이션(Windows용)을 호스트로 사용합니다. 이 문서의 샘플은 C#으로 작성되었지만 .NET Ecma 사양을 지원하는 모든 언어로 테스트 플랫폼을 사용하고 .NET에서 지원하는 모든 OS에서 실행할 수 있습니다. 플랫폼을 사용하려면, Microsoft.Testing.Platform.dll 어셈블리를 참조하기만 하면 되며, 이 어셈블리는 공식 NuGet 패키지에서 https://www.nuget.org/packages/Microsoft.Testing.Platform통해 사용할 수 있습니다.

콘솔 프로젝트 Contoso.UnitTests.exe다음 Main 메서드는 진입점을 정의합니다.

public static async Task<int> Main(string[] args)
{
    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.RegisterTestFramework();
    
    using ITestApplication testApp = await builder.BuildAsync();
    
    return await testApp.RunAsync();
}

이 코드에는 RegisterTestFramework통해 MSTest와 같은 테스트 프레임워크를 등록하는 것을 제외하고 테스트 세션을 실행하는 데 필요한 모든 것이 포함됩니다. 이 코드는 이후 섹션에서 표시되고 설명됩니다.

메모

기본 동작은 테스트 플랫폼 MSBuild 태스크에서 진입점을 자동으로 생성하는 것입니다. 이 작업은 프로젝트에 Microsoft.Testing.Platform.MSBuild 패키지를 추가하여 수행됩니다.

Contoso.UnitTests.exe 애플리케이션이 시작되면 표준 Windows 프로세스가 생성되고 테스트 플랫폼이 등록된 테스트 프레임워크와 상호 작용하여 테스트 세션을 실행합니다.

이 작업을 수행하기 위한 단일 프로세스가 만들어집니다.

테스트 호스트 프로세스를 나타내는 다이어그램입니다.

테스트 플랫폼에는 다음과 유사한 테스트 세션 정보를 터미널에 기록하는 기본 제공 디스플레이 디바이스가 포함되어 있습니다.

Microsoft(R) Testing Platform Execution Command Line Tool
Version: 1.1.0+8c0a8fd8e (UTC 2024/04/03)
RuntimeInformation: win-x64 - .NET 9.0.0-preview.1.24080.9
Copyright(c) Microsoft Corporation.  All rights reserved.
Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 5ms - Contoso.UnitTests.dll (win-x64 - .NET 9.0.0-preview.1.24080.9)

메모

ITestApplication.RunAsync() 호출에서 반환된 알려진 종료 코드는 플랫폼 종료 코드에 자세히 설명되어 있습니다.

2단계: 플랫폼 확장

테스트 실행은 일반적으로 코드 검사 정보 또는 유사한 정보를 수집하여 코드 품질을 평가합니다. 이러한 워크로드에는 테스트 호스트 프로세스가 시작되기 전에 구성이 필요할 수 있습니다(예: 환경 변수 설정).

테스트 플랫폼은 out-of-process 확장을 통해 이를 수용합니다. Out-of-process 확장으로 실행하는 경우 테스트 플랫폼은 여러 프로세스를 시작하고 적절하게 관리합니다.

다음 예제에서는 TestHostController 확장을 사용하여 코드 검사 기능을 등록하는 방법을 보여 줍니다.

ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);

builder.RegisterTestFramework();
builder.AddCodeCoverage();

using ITestApplication testApp = await builder.BuildAsync();

return await testApp.RunAsync();

builder.AddCodeCoverage();는 내부적으로 TestHostController을 외부 프로세스 확장성 지점으로 사용합니다.

public static class TestApplicationBuilderExtensions
{
    public static ITestApplicationBuilder AddCodeCoverage(
        this ITestApplicationBuilder builder)
    {
        builder.TestHostControllers
               .AddEnvironmentVariableProvider(/* ... */);
        
        // ...
        
        return builder;
    }
}

api AddEnvironmentVariableProvider 대한 매개 변수는 이후 섹션에서 설명합니다.

이번에는 Contoso.UnitTests.exe 실행할 때 테스트 플랫폼에서 TestHostController 확장이 등록되었음을 감지합니다. 결과적으로 Contoso.UnitTests.exe 프로세스의 다른 인스턴스를 자식 프로세스로 시작합니다. 이 작업은 AddEnvironmentVariableProvider API에 등록된 확장에 필요한 대로 환경 변수를 올바르게 설정하기 위해 수행됩니다.

프로세스 레이아웃은 다음과 같습니다.

테스트 호스트 및 테스트 호스트 컨트롤러의 프로세스 레이아웃을 나타내는 다이어그램입니다.

메모

제공된 예제에서는 시작 프로세스를 올바르게 처리하고 모든 명령줄 인수를 자식 프로세스에 전파하는 콘솔 애플리케이션 레이아웃을 가정합니다. 다른 호스트를 사용하는 경우 진입점 코드가 프로세스 진입점("Main")을 적절한 코드 블록에 올바르게 전달하는지 확인해야 합니다. 런타임은 단순히 동일한 명령줄 인수로 시작합니다.

위의 섹션에서는 테스트 플랫폼의 아키텍처에 대한 간략한 소개를 제공합니다. 현재 확장성 지점은 다음 두 가지 범주로 나뉩니다.

  1. In process 확장은 테스트 애플리케이션 작성기의 TestHost 속성을 통해 액세스할 수 있습니다. In process라는 것은 그들이 테스트 프레임워크와 동일한 프로세스에서 실행된다는 것을 의미합니다.

    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.RegisterTestFramework();
    
    builder.TestHost.AddXXX(/* ... */);
    

    관찰된 바와 같이 가장 중요한 확장 지점은 필수 유일한 프로세스 RegisterTestFramework()입니다.

  2. Out of Process 확장은 테스트 애플리케이션 작성기의 TestHostControllers 속성을 통해 액세스할 수 있습니다. 이러한 확장은 테스트 프레임워크와 별도의 프로세스에서 실행되어 "관찰"합니다.

    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.TestHostControllers.AddXXX(/* ... */);
    

3단계: 확장 지점의 포괄적인 개요

먼저 다양한 확장 지점살펴보기 전에 기능의 개념을 숙지해 보겠습니다.

4단계: 사용 가능한 서비스

테스트 플랫폼은 테스트 프레임워크와 확장 지점 모두에 중요한 서비스를 제공합니다. 이러한 서비스는 구성 액세스, 명령줄 인수 구문 분석 및 검색, 로깅 팩터리 가져오기, 로깅 시스템 액세스 등의 일반적인 요구 사항을 충족합니다. IServiceProvider 테스트 플랫폼에 대한 서비스 로케이터 패턴 구현합니다.

이러한 서비스에 액세스하고 사용하는 방법에 대한 모든 서비스, 도우미 및 기술 정보는 Microsoft.Testing.Platform Services 설명서나열되어 있습니다.