C#에서 AWS Lambda 함수 테스트
C#에서 AWS Lambda 함수 테스트 (AWS Lambda function testing in C#)
참고
서버리스 솔루션 테스트를 위한 기술과 모범 사례의 전체 소개는 함수 테스트 챕터를 참고하세요.
서버리스 함수 테스트는 전통적인 테스트 유형과 기술을 사용하지만, 서버리스 애플리케이션 전체를 테스트하는 것도 고려해야 해요. 클라우드 기반 테스트는 함수와 서버리스 애플리케이션 모두의 품질을 측정하는 가장 정확한 방법이에요.
본문
서버리스 애플리케이션 아키텍처에는 API 호출을 통해 중요한 애플리케이션 기능을 제공하는 관리형 서비스가 포함돼요. 이런 이유로 개발 주기에는 함수와 서비스가 상호작용할 때 기능을 검증하는 자동화 테스트가 포함되어야 해요.
클라우드 기반 테스트를 만들지 않으면 로컬 환경과 배포된 환경의 차이로 인해 문제가 발생할 수 있어요. 지속적 통합 프로세스는 코드를 다음 배포 환경(QA, Staging, Production 등)으로 승격하기 전에 클라우드에서 프로비저닝한 리소스 모음에 대해 테스트를 실행해야 해요.
서버리스 애플리케이션 테스트 전략에 대해 자세히 알아보려면 이 짧은 가이드를 계속 읽거나, Serverless Test Samples 저장소를 방문해 선택한 언어와 런타임에 특화된 실용적인 예제로 시작해요.
서버리스 테스트에서도 단위, 통합, 종단 간 테스트를 여전히 작성해요.
- 단위 테스트(Unit tests) – 격리된 코드 블록에 대해 실행되는 테스트예요. 예를 들어 특정 품목과 목적지가 주어졌을 때 배송료를 계산하는 비즈니스 로직을 검증하는 경우예요.
- 통합 테스트(Integration tests) – 일반적으로 클라우드 환경에서 상호작용하는 두 개 이상의 구성 요소나 서비스가 관련된 테스트예요. 예를 들어 함수가 큐의 이벤트를 처리하는지 검증하는 경우예요.
- 종단 간 테스트(End-to-end tests) – 전체 애플리케이션에 걸친 동작을 검증하는 테스트예요. 예를 들어 인프라가 올바르게 설정되었고 고객의 주문을 기록하기 위해 이벤트가 서비스 사이에 예상대로 흐르는지 확인하는 경우예요.
서버리스 애플리케이션 테스트 (Testing your serverless applications)
일반적으로 클라우드에서 테스트, mock으로 테스트, 가끔은 에뮬레이터로 테스트하는 등 다양한 접근 방식을 조합해 서버리스 애플리케이션 코드를 테스트해요.
클라우드에서 테스트 (Testing in the cloud)
클라우드에서 테스트는 단위 테스트, 통합 테스트, 종단 간 테스트를 포함해 모든 테스트 단계에 유용해요. 클라우드에 배포된 코드와 상호작용하는 클라우드 기반 서비스에 대해 테스트를 실행해요. 이 접근 방식은 코드 품질을 측정하는 가장 정확한 방법을 제공해요.
클라우드에서 Lambda 함수를 디버깅하는 편리한 방법은 테스트 이벤트와 함께 콘솔을 사용하는 것이에요. 테스트 이벤트는 함수에 대한 JSON 입력이에요. 함수가 입력을 필요로 하지 않으면 이벤트는 빈 JSON 문서 ( { }) 일 수 있어요. 콘솔은 다양한 서비스 통합에 대한 샘플 이벤트를 제공해요. 콘솔에서 이벤트를 만든 후 팀과 공유해 테스트를 더 쉽고 일관되게 할 수 있어요.
참고
콘솔에서 함수 테스트는 시작하는 빠른 방법이지만, 테스트 주기를 자동화하면 애플리케이션 품질과 개발 속도를 보장해요.
테스트 도구 (Testing tools)
개발 주기를 가속화하기 위해 함수를 테스트할 때 사용할 수 있는 다양한 도구와 기술이 있어요. 예를 들어 AWS SAM Accelerate와 AWS CDK watch mode는 둘 다 클라우드 환경을 업데이트하는 데 필요한 시간을 줄여줘요.
Lambda 함수 코드를 정의하는 방식은 단위 테스트를 추가하기 쉽게 만들어요. Lambda는 클래스를 초기화하려면 public, 매개 변수 없는 생성자를 요구해요. 두 번째 내부 생성자를 도입하면 애플리케이션이 사용하는 종속성을 제어할 수 있어요.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace GetProductHandler;
public class Function
{
private readonly IDatabaseRepository _repo;
public Function(): this(null)
{
}
internal Function(IDatabaseRepository repo)
{
this._repo = repo ?? new DatabaseRepository();
}
public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request)
{
var id = request.PathParameters["id"];
var databaseRecord = await this._repo.GetById(id);
return new APIGatewayProxyResponse
{
StatusCode = (int)HttpStatusCode.OK,
Body = JsonSerializer.Serialize(databaseRecord)
};
}
}
이 함수의 테스트를 작성하려면 Function 클래스의 새 인스턴스를 초기화하고 IDatabaseRepository 의 mock 구현을 전달할 수 있어요. 다음 예제는 XUnit, Moq, FluentAssertions 를 사용해 FunctionHandler 가 200 상태 코드를 반환하는지 확인하는 간단한 테스트를 작성해요.
using Xunit;
using Moq;
using FluentAssertions;
public class FunctionTests
{
[Fact]
public async Task TestLambdaHandler_WhenInputIsValid_ShouldReturn200StatusCode()
{
// Arrange
var mockDatabaseRepository = new Mock<IDatabaseRepository>();
var functionUnderTest = new Function(mockDatabaseRepository.Object);
// Act
var response = await functionUnderTest.FunctionHandler(new APIGatewayProxyRequest());
// Assert
response.StatusCode.Should().Be(200);
}
}
비동기 테스트 예제를 포함한 더 자세한 예제는 GitHub의 .NET 테스트 샘플 저장소를 참고하세요.