참고
서버리스 솔루션 테스트를 위한 기술 및 모범 사례에 대한 전체 소개는 함수 테스트 장을 참조하세요.
서버리스 함수 테스트는 기존 테스트 유형과 기법을 사용하지만, 서버리스 애플리케이션을 전체적으로 테스트하는 것도 고려해야 합니다. 클라우드 기반 테스트는 함수와 서버리스 애플리케이션 모두의 품질을 가장 정확하게 측정합니다.
서버리스 애플리케이션 아키텍처에는 API 호출을 통해 중요한 애플리케이션 기능을 제공하는 관리형 서비스가 포함됩니다. 따라서 개발 주기에는 함수와 서비스가 상호 작용할 때 기능을 확인하는 자동화된 테스트가 포함되어야 합니다.
클라우드 기반 테스트를 생성하지 않으면 로컬 환경과 배포된 환경 간의 차이로 인해 문제가 발생할 수 있습니다. 지속적 통합 프로세스는 QA, 스테이징 또는 프로덕션과 같은 다음 배포 환경으로 코드를 승격하기 전에 클라우드에서 프로비저닝되는 리소스 제품군을 대상으로 테스트를 실행해야 합니다.
이 짧은 안내서를 계속 읽고 서버리스 애플리케이션의 테스트 전략에 대해 알아보거나 Serverless Test Samples 리포지토리
서버리스 테스트의 경우에도 단위, 통합 및 엔드 투 엔드 테스트를 작성합니다.
-
단위 테스트 - 격리된 코드 블록에 대해 실행되는 테스트입니다. 예를 들어, 특정 항목과 대상에 대한 배송료를 계산하는 비즈니스 로직을 확인합니다.
-
통합 테스트 - 일반적으로 클라우드 환경에서 상호 작용하는 둘 이상의 구성 요소 또는 서비스를 포함하는 테스트입니다. 예를 들어, 함수가 대기열에서 이벤트를 처리하는지 확인합니다.
-
엔드 투 엔드 테스트 - 전체 애플리케이션의 동작을 확인하는 테스트입니다. 예를 들어, 인프라가 올바르게 설정되어 있고 고객의 주문 기록을 위해 예상대로 서비스 간에 이벤트가 흐르는지 확인합니다.
서버리스 애플리케이션 테스트
일반적으로 다양한 접근 방식을 사용하여 클라우드에서 테스트, 모의 객체로 테스트, 에뮬레이터로 테스트 등의 서버리스 애플리케이션 코드 테스트를 수행합니다.
클라우드에서 테스트
클라우드에서 테스트는 단위 테스트, 통합 테스트, 엔드 투 엔드 테스트 등의 모든 테스트 단계에서 중요합니다. 클라우드에 배포되고 클라우드 기반 서비스와 상호 작용하는 코드에 대해 테스트를 실행합니다. 이 접근 방식은 코드 품질을 가장 정확하게 측정합니다.
클라우드에서 Lambda 함수를 디버깅하는 편리한 방법은 테스트 이벤트와 콘솔을 이용하는 것입니다. 테스트 이벤트는 함수에 대한 JSON 입력입니다. 함수에 입력이 필요하지 않은 경우 이벤트는 빈 JSON 문서(({})
)가 될 수 있습니다. 콘솔은 다양한 서비스 통합을 위한 샘플 이벤트를 제공합니다. 콘솔에서 이벤트를 생성한 후 팀과 공유하여 테스트를 더 쉽고 일관성 있게 만들 수 있습니다.
참고
콘솔에서 함수를 테스트하는 것이 빠르게 시작할 수 있는 방법이지만 테스트 주기를 자동화하면 애플리케이션 품질과 개발 속도가 보장됩니다.
테스트 도구
개발 주기를 가속화하기 위해 함수를 테스트할 때 사용할 수 있는 다양한 도구와 기법이 있습니다. 예를 들어, AWS SAM 가속화와 AWS CDK 감시 모드 모두 클라우드 환경을 업데이트하는 데 필요한 시간을 줄입니다.
Lambda 함수 코드를 정의하는 방법에 따라 단위 테스트를 간단하게 추가할 수 있습니다. Lambda는 클래스를 초기화하기 위해 파라미터가 없는 퍼블릭 생성자가 필요합니다. 두 번째 내부 생성자를 도입하면 애플리케이션이 사용하는 종속성을 제어할 수 있습니다.
[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
의 모의 구현을 전달하면 됩니다. 아래 예제에서는 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 테스트 샘플 리포지토리