.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를 사용하면 테스트 클래스의 정적 메서드에서 ClassInitializeAttribute 및 ClassCleanupAttribute 사용하여 앱 호스트 인스턴스의 초기화 및 정리를 제공합니다.
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에서는 테스트 클래스의 메서드에 OneTimeSetUp 및 OneTimeTearDown 특성을 사용하여 앱 호스트 인스턴스의 환경 설정 및 해제를 수행합니다.
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
, OnBuilding
및 OnBuilt
.
예를 들어 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();
});
}
참고 항목
.NET Aspire