

# C\#의 AWS Lambda 함수 테스트
<a name="dotnet-csharp-testing"></a>

**참고**  
서버리스 솔루션 테스트를 위한 기술 및 모범 사례에 대한 전체 소개는 [함수 테스트](testing-guide.md) 장을 참조하세요.

 서버리스 함수 테스트는 기존 테스트 유형과 기법을 사용하지만, 서버리스 애플리케이션을 전체적으로 테스트하는 것도 고려해야 합니다. 클라우드 기반 테스트는 함수와 서버리스 애플리케이션 모두의 품질을 **가장 정확하게** 측정합니다.

 서버리스 애플리케이션 아키텍처에는 API 호출을 통해 중요한 애플리케이션 기능을 제공하는 관리형 서비스가 포함됩니다. 따라서 개발 주기에는 함수와 서비스가 상호 작용할 때 기능을 확인하는 자동화된 테스트가 포함되어야 합니다.

 클라우드 기반 테스트를 생성하지 않으면 로컬 환경과 배포된 환경 간의 차이로 인해 문제가 발생할 수 있습니다. 지속적 통합 프로세스는 QA, 스테이징 또는 프로덕션과 같은 다음 배포 환경으로 코드를 승격하기 전에 클라우드에서 프로비저닝되는 리소스 제품군을 대상으로 테스트를 실행해야 합니다.

 이 짧은 안내서를 계속 읽고 서버리스 애플리케이션의 테스트 전략에 대해 알아보거나 [Serverless Test Samples 리포지토리](https://github.com/aws-samples/serverless-test-samples)를 방문하여 선택한 언어 및 런타임과 관련된 실제 예제를 자세히 살펴보세요.

 ![illustration showing the relationship between types of tests](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-type-illustration2.png) 

 서버리스 테스트의 경우에도 *단위*, *통합* 및 *엔드 투 엔드* 테스트를 작성합니다.
+ **단위 테스트** - 격리된 코드 블록에 대해 실행되는 테스트입니다. 예를 들어, 특정 항목과 대상에 대한 배송료를 계산하는 비즈니스 로직을 확인합니다.
+ **통합 테스트** - 일반적으로 클라우드 환경에서 상호 작용하는 둘 이상의 구성 요소 또는 서비스를 포함하는 테스트입니다. 예를 들어, 함수가 대기열에서 이벤트를 처리하는지 확인합니다.
+ **엔드 투 엔드 테스트** - 전체 애플리케이션의 동작을 확인하는 테스트입니다. 예를 들어, 인프라가 올바르게 설정되어 있고 고객의 주문 기록을 위해 예상대로 서비스 간에 이벤트가 흐르는지 확인합니다.

## 서버리스 애플리케이션 테스트
<a name="dotnet-csharp-testing-techniques-for-serverless-applications"></a>

 일반적으로 다양한 접근 방식을 사용하여 클라우드에서 테스트, 모의 객체로 테스트, 에뮬레이터로 테스트 등의 서버리스 애플리케이션 코드 테스트를 수행합니다.

### 클라우드에서 테스트
<a name="dotnet-csharp-testing-in-the-cloud"></a>

 클라우드에서 테스트는 단위 테스트, 통합 테스트, 엔드 투 엔드 테스트 등의 모든 테스트 단계에서 중요합니다. 클라우드에 배포되고 클라우드 기반 서비스와 상호 작용하는 코드에 대해 테스트를 실행합니다. 이 접근 방식은 코드 품질을 **가장 정확하게** 측정합니다.

 클라우드에서 Lambda 함수를 디버깅하는 편리한 방법은 테스트 이벤트와 콘솔을 이용하는 것입니다. *테스트 이벤트*는 함수에 대한 JSON 입력입니다. 함수에 입력이 필요하지 않은 경우 이벤트는 빈 JSON 문서(`({})`)가 될 수 있습니다. 콘솔은 다양한 서비스 통합을 위한 샘플 이벤트를 제공합니다. 콘솔에서 이벤트를 생성한 후 팀과 공유하여 테스트를 더 쉽고 일관성 있게 만들 수 있습니다.

**참고**  
[콘솔에서 함수를 테스트](testing-functions.md)하는 것이 빠르게 시작할 수 있는 방법이지만 테스트 주기를 자동화하면 애플리케이션 품질과 개발 속도가 보장됩니다.

### 테스트 도구
<a name="dotnet-csharp-testing-tools"></a>

개발 주기를 가속화하기 위해 함수를 테스트할 때 사용할 수 있는 다양한 도구와 기법이 있습니다. 예를 들어, [AWS SAM 가속화](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-sync.html)와 [AWS CDK 감시 모드](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-deploy-watch) 모두 클라우드 환경을 업데이트하는 데 필요한 시간을 줄입니다.

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 테스트 샘플 리포지토리](https://github.com/aws-samples/serverless-test-samples/tree/main/dotnet-test-samples)를 참조하십시오.