데브허브 | DEVHUB | The Future of Integration Testing in .NETThe Future of Integration Testing in .NET
- .NET Aspire는 분산 애플리케이션 구축 및 테스트에 최적화되어 있으며, Microsoft에서도 사용하며 그 중요성이 부각되고 있습니다. 🚀
- Aspire를 사용한 통합 테스트는
TestServer나 WebApplicationFactory와 달리, 각 리소스(DB, API, UI 등)를 별도의 프로세스로 실행하여 실제 환경에 더 가깝게 테스트합니다. ⚙️
- 테스트 프로젝트는 네트워크를 통해 이러한 별도 프로세스들과 상호작용하며, 이는 인메모리 방식과 근본적으로 다릅니다. 🌐
- 테스트 실행 시 Aspire 대시보드와 같은 관찰 기능은 시작되지 않아, 테스트 목적에 맞는 경량화된 접근 방식을 제공합니다. 💡
- 여러 서비스 간의 복잡한 관계(예: UI -> API -> DB)를 테스트하는 데 매우 효과적이며, 광범위한 통합, 엔드투엔드 또는 기능 테스트에 적합합니다. 🔗
- Aspire 테스트는
Testcontainers와 유사하게 테스트 인프라(컨테이너 등)의 시작 및 종료를 자동으로 관리하여, 테스트 후 깨끗한 환경을 보장합니다. ♻️
- 테스트 프로젝트 설정은 Aspire 템플릿 설치 후
dotnet new aspire-xunit으로 생성하고, AppHost 프로젝트를 참조하는 방식으로 이루어집니다. 🛠️
- 테스트 코드에서는
DistributedApplicationTestingBuilder.CreateAsync()를 사용하여 Aspire 인프라를 시작하고, WaitForResourceAsync로 리소스의 준비 상태를 확인합니다. ✅
- 각 테스트마다 전체 인프라를 시작하고 종료하는 것은 비효율적이므로, XUnit의
CollectionFixture와 같은 기능을 활용하여 인프라를 한 번만 설정하고 여러 테스트에서 재사용하여 성능을 최적화할 수 있습니다. ⏱️
CollectionFixture는 IAsyncLifetime을 구현하여 인프라의 초기화(InitializeAsync) 및 해제(DisposeAsync)를 관리하며, 각 서비스에 대한 HTTP 클라이언트를 미리 생성하여 제공할 수 있습니다. 🏗️