다음을 통해 공유


.NET .NET Aspire 테스트에서 앱 호스트 관리

.NET .NET Aspire사용하여 기능 또는 통합 테스트를 작성할 때는 앱 호스트가 전체 애플리케이션 환경을 나타내므로 만들고 분해하는 데 비용이 많이 들 수 있으므로 앱 호스트 인스턴스를 테스트 간에 관리하는 방법을 고려해야 합니다. 이 문서에서는 .NET.NET Aspire 테스트에서 앱 호스트 인스턴스를 관리하는 방법을 알아봅니다.

.NET .NET Aspire사용하여 테스트를 작성하는 경우 일부 도우미 클래스가 포함된 📦 Aspire.Hosting.Testing NuGet 패키지를 사용하여 테스트에서 앱 호스트 인스턴스를 관리합니다.

DistributedApplicationTestingBuilder 클래스 사용

첫 번째 테스트작성하는 자습서에서는 앱 호스트 인스턴스를 만드는 데 사용할 수 있는 클래스를 소개했습니다.

var appHost = await DistributedApplicationTestingBuilder
    .CreateAsync<Projects.AspireApp_AppHost>();

CreateAsync 메서드는 앱 호스트 프로젝트 참조의 형식을 제네릭 형식 매개 변수로 사용하여 앱 호스트 인스턴스를 만들 수 있습니다. 이 코드는 각 테스트가 시작될 때 실행되지만 테스트 도구 모음이 커지면 앱 호스트 인스턴스를 한 번 만들고 테스트 간에 공유하는 것이 좋습니다.

xUnit을 사용하면 테스트 클래스에서 IAsyncLifetime 인터페이스를 구현하여 앱 호스트 인스턴스의 비동기 초기화 및 삭제를 지원합니다. InitializeAsync 메서드는 테스트를 실행하기 전에 앱 호스트 인스턴스를 만드는 데 사용되며 DisposeAsync 메서드는 테스트가 완료되면 앱 호스트를 삭제합니다.

public class WebTests : IAsyncLifetime
{
    private DistributedApplication _app;

    public async Task InitializeAsync()
    {
        var appHost = await DistributedApplicationTestingBuilder
            .CreateAsync<Projects.AspireApp_AppHost>();

        _app = await appHost.BuildAsync();
    }

    public async Task DisposeAsync() => await _app.DisposeAsync();

    [Fact]
    public async Task GetWebResourceRootReturnsOkStatusCode()
    {
        // test code here
    }
}

MSTest를 사용하면 테스트 클래스의 정적 메서드에서 ClassInitializeAttributeClassCleanupAttribute 사용하여 앱 호스트 인스턴스의 초기화 및 정리를 제공합니다. ClassInitialize 메서드는 테스트를 실행하기 전에 앱 호스트 인스턴스를 만드는 데 사용되며 ClassCleanup 메서드는 테스트가 완료되면 앱 호스트 인스턴스를 삭제합니다.

[TestClass]
public class WebTests
{
    private static DistributedApplication _app;

    [ClassInitialize]
    public static async Task ClassInitialize(TestContext context)
    {
       var appHost = await DistributedApplicationTestingBuilder
            .CreateAsync<Projects.AspireApp_AppHost>();

        _app = await appHost.BuildAsync();
    }

    [ClassCleanup]
    public static async Task ClassCleanup() => await _app.DisposeAsync();

    [TestMethod]
    public async Task GetWebResourceRootReturnsOkStatusCode()
    {
        // test code here
    }
}

NUnit에서는 테스트 클래스의 메서드에 OneTimeSetUpOneTimeTearDown 특성을 사용하여 앱 호스트 인스턴스의 환경 설정 및 해제를 수행합니다. OneTimeSetUp 메서드는 테스트를 실행하기 전에 앱 호스트 인스턴스를 만드는 데 사용되며 OneTimeTearDown 메서드는 테스트가 완료되면 앱 호스트 인스턴스를 삭제합니다.

public class WebTests
{
    private DistributedApplication _app;

    [OneTimeSetUp]
    public async Task OneTimeSetup()
    {
       var appHost = await DistributedApplicationTestingBuilder
            .CreateAsync<Projects.AspireApp_AppHost>();

        _app = await appHost.BuildAsync();
    }

    [OneTimeTearDown]
    public async Task OneTimeTearDown() => await _app.DisposeAsync();

    [Test]
    public async Task GetWebResourceRootReturnsOkStatusCode()
    {
        // test code here
    }
}

테스트 실행이 시작될 때 필드에서 앱 호스트를 캡처하여 다시 만들 필요 없이 각 테스트에서 앱 호스트에 액세스할 수 있으므로 테스트를 실행하는 데 걸리는 시간이 줄어듭니다. 그런 다음 테스트 실행이 완료되면 앱 호스트가 삭제되어 테스트 실행 중에 생성된 모든 리소스(예: 컨테이너)를 정리합니다.

DistributedApplicationFactory 클래스 사용

DistributedApplicationTestingBuilder 클래스는 많은 시나리오에 유용하지만 작성기를 만들기 전이나 앱 호스트가 빌드된 후 코드 실행과 같이 앱 호스트 시작을 보다 자세히 제어하려는 상황이 있을 수 있습니다. 이러한 경우 고유한 버전의 DistributedApplicationFactory 클래스를 구현합니다. 이것이 DistributedApplicationTestingBuilder 내부적으로 사용하는 것입니다.

public class TestingAspireAppHost
    : DistributedApplicationFactory(typeof(Projects.AspireApp_AppHost))
{
    // override methods here
}

생성자에는 매개 변수로 앱 호스트 프로젝트 참조의 형식이 필요합니다. 필요에 따라 기본 호스트 애플리케이션 작성기에서 인수를 제공할 수 있습니다. 이러한 인수는 앱 호스트가 시작되는 방식을 제어하고 Program.cs 파일에서 앱 호스트 인스턴스를 시작하는 데 사용하는 인수 변수에 값을 제공합니다.

수명 주기 메서드

DistributionApplicationFactory 클래스는 앱 호스트의 선행 및 생성 전반에 걸쳐 사용자 지정 동작을 제공하기 위해 재정의할 수 있는 몇 가지 수명 주기 메서드를 제공합니다. 사용 가능한 메서드는 OnBuilderCreating, OnBuilderCreated, OnBuildingOnBuilt.

예를 들어 OnBuilderCreating 메서드를 사용하여 앱 호스트가 생성되고 종속 Azure 리소스가 프로비전되기 전에 Azure대한 구독 및 리소스 그룹 정보와 같은 환경 변수를 설정하여 올바른 Azure 환경을 사용하여 테스트를 수행할 수 있습니다.

public class TestingAspireAppHost : DistributedApplicationFactory(typeof(Projects.AspireApp_AppHost))
{
    protected override void OnBuilderCreating(DistributedApplicationOptions applicationOptions, HostApplicationBuilderSettings hostOptions)
    {
        builder.EnvironmentVariables["AZURE_SUBSCRIPTION_ID"] = "00000000-0000-0000-0000-000000000000";
        builder.EnvironmentVariables["AZURE_RESOURCE_GROUP"] = "my-resource-group";
    }
}

.NET 구성 시스템의 우선 순위 때문에 환경 변수는 appsettings.json 또는 secrets.json 파일의 모든 항목에 사용됩니다.

수명 주기에 사용할 수 있는 또 다른 시나리오는 앱 호스트에서 사용하는 서비스를 구성하는 것입니다. 다음 예제에서 OnBuilderCreated에 복원력을 추가하기 위해 HttpClient API를 재정의하는 시나리오를 고려합니다.

protected override void OnBuilderCreated(
    DistributedApplicationBuilder applicationBuilder)
{
    applicationBuilder.Services.ConfigureHttpClientDefaults(clientBuilder =>
    {
        clientBuilder.AddStandardResilienceHandler();
    });
}

참고 항목