BLOG

AWS Chalice 테스트 클라이언트를 소개합니다!
작성일: 2020-08-25

최근 출시된 AWS Chalice  v1.17.0에는 간결하고 간소화된 API를 사용하여 Chalice 애플리케이션에 대한 테스트를 작성할 수 있는 테스트 클라이언트가 포함되어 있습니다. 테스트 클라이언트는 이전에 Chalice 애플리케이션을 테스트할 때 직접 작성해야 했던 모든 상용구 설정 및 해체 로직을 처리합니다.

 

이 새로운 테스트 클라이언트를 사용하면 Chalice에서 지원하는 AWS Lambda에 대한 모든 이벤트 핸들러는 물론 REST API를 테스트할 수 있습니다.

 

 

기본 사용법

이 새로운 테스트 클라이언트를 사용하는 방법을 보여주기 위해 hello world REST API로 시작해보겠습니다. 이전에 Chalice를 사용한 적이 없는 경우 첫 번째 Chalice 애플리케이션을 설치, 구성 및 생성하는 과정을 안내하는 빠른 시작 가이드를 따라 하세요.

먼저 app.py두 개의 경로로 파일을 업데이트합니다.

from chalice import Chalice

app = Chalice(app_name=’testclient’)

@app.route(‘/’)

def index():

    return {‘hello’: ‘world’}

@app.route(‘/hello/{name}’)

def hello(name):

    return {‘hello’: name}

 

이 API를 테스트하기 위해 tests디렉터리를 만들고 각 경로에 대해 하나씩 두 개의 테스트가 있는 tests/__init__.py와 tests/test_app.py파일을 만듭니다 .

$ mkdir tests
$ touch tests/{__init__.py,test_app.py}
$ tree
.
├── app.py
├── requirements.txt
└── tests
    ├── __init__.py
    └── test_app.py

 

사용자의  tests/test_app.py은 이렇게 보일 것입니다.

import app

from chalice.test import Client

def test_index_route():

    with Client(app.app) as client:

        response = client.http.get(‘/’)

        assert response.status_code == 200

        assert response.json_body == {‘hello’: ‘world’}

def test_hello_route():

    with Client(app.app) as client:

        response = client.http.get(‘/hello/myname’)

        assert response.status_code == 200

        assert response.json_body == {‘hello’: ‘myname’}

 

위의 테스트 파일에서는 chalice.test에서 파일을 먼저 가져옵니다. 다음으로 테스트 클라이언트를 사용하기 위해 인스턴스화하고 컨텍스트 관리자로 사용합니다. 이렇게 하면 테스트 환경이 올바르게 설정되고 분해 시 테스트 중에 수정해야 하는 리소스 (예: 환경 변수)를 정리하고 교체할 수 있습니다.

 

테스트 클라이언트에는 테스트 작성에 도움이 되는 몇 가지 속성이 있습니다.

  • client.http – REST API를 테스트하는 데 사용됩니다.
  • client.lambda_ – Lambda 함수에 전달할 페이로드를 지정하여 Lambda 함수를 테스트하는 데 사용됩니다.
  • client.events– client.lambda_속성을 통해 Lambda 함수를 테스트 할 때 샘플 이벤트를 생성하는 데 사용됩니다.

 

테스트를 실행하기 위해 pytest를 설치합니다 .

$ pip install pytest

$ py.test tests/test_app.py

============================= test session starts ==============================

platform darwin — Python 3.7.3, pytest-5.3.1, py-1.5.3, pluggy-0.12.0

rootdir: /tmp/testclient

plugins: hypothesis-4.43.1, cov-2.8.1

collected 2 items

test_app.py ..                                                                [100%]

============================= 2 passed in 0.32s ================================

 

 

AWS Lambda 함수 테스트

Lambda 함수를 직접 테스트하기 위해 이 client.lambda_.invoke()메소드를 사용하겠습니다 . 먼저 이벤트에 연결되지 않은 Lambda 함수를 테스트 해보겠습니다. 이 기능을 app.py파일에 추가하세요.

@app.lambda_function()

def myfunction(event, context):

    return {‘event’: event}

 

이 함수에 대한 테스트는 client.lambda_.invoke()대신 메소드를 사용한다는 점을 제외하면 REST API 단위 테스트와 유사합니다 .

def test_my_function():

    with Client(app.app) as client:

        response = client.lambda_.invoke(‘myfunction’,

                                         {‘hello’: ‘world’})

        assert response.payload == {‘event’: {‘hello’: ‘world’}}

 

 

이벤트 핸들러 테스트

이전 예제에서는 Lambda 함수 호출에 전달할 자체 이벤트 페이로드를 생성하고 있습니다. client.events속성을 사용하여 Chalice가 지원하는 특정 서비스에 대한 샘플 이벤트를 생성할 수 있습니다. Chalice를 사용한 Lambda 이벤트 소스에 대해 자세히 알아보려면 이벤트 소스 문서를 참고하세요.

 

Amazon SNS 주제에 연결된 이벤트 핸들러를 테스트한다고 가정해 보겠습니다.

@app.on_sns_message(topic=‘mytopic’)def myfunction(event):    return {‘message’: event.message}

 

이 함수를 테스트하려면 이 이벤트 핸들러가 예상하는 스키마와 일치하는 이벤트 페이로드를 생성해야 합니다. client.events.generate_sns_event()를 사용하여 이 작업을 수행할 수 있습니다.

def test_my_function():

    with Client(app.app) as client:

        event = client.events.generate_sns_event(message=’hello world’)

        response = client.lambda_.invoke(‘sns_message_handler’, event)

        assert response.payload == {‘message’: ‘hello world’}

 

 

Python AWS SDK 테스트

마지막으로 Python용 AWS SDK와 관련된 예를 살펴보겠습니다. 이 예제에는 요청 본문을 가져와 Python용 AWS SDK boto3 을 사용하여 Amazon S3에 전달하는 REST API가 있습니다.

_S3 = None

def get_s3_client():

    global _S3

    if _S3 is None:

        _S3 = boto3.client(‘s3’)

    return _S3

@app.route(‘/resources/{name}’, methods=[‘PUT’])

def send_to_s3(name):

    s3 = get_s3_client()

    s3.put_object(

        Bucket=’mybucket’,

        Key=name,

        Body=app.current_request.raw_body

    )

    return Response(status_code=204, body=”)

 

테스트 /resources/myobject에서 요청 본문에 대한 PUT 요청 이 해당 PutObjectS3 API 호출에 대한 객체 본문으로 전송되는지 확인하려고 합니다. 이를 테스트하기 위해 Chalice 테스트 클라이언트와 Botocore Stubber를 사용합니다. Botocore Stubber를 사용하면 실제로 AWS에 요청을 보내지 않도록 AWS에 대한 요청을 스텁 아웃할 수 있습니다. Stubber 입력 매개 변수 및 응답 값이 서비스 API의 스키마와 일치하는지 확인합니다. 스텁 버를 사용하기 위해 S3 클라이언트를 Stubber인스턴스로 래핑하고 예상되는 API 호출을 지정합니다. Stubber를 컨텍스트 관리자로 사용하여 Stubber를 자동으로 활성화하고 사용을 마치면 정리할 수 있습니다. 이 테스트는 다음과 같습니다.

import json

from botocore.stub import Stubber

def test_send_to_s3():

    client = app.get_s3_client()

    stub = Stubber(client)

    stub.add_response(

        ‘put_object’,

        expected_params={

            ‘Bucket’: ‘mybucket’,

            ‘Key’: ‘myobject’,

            ‘Body’: b'{“hello”: “world”}’,

        },

        service_response={},

    )

    with stub:

        with Client(app.app) as client:

            response = client.http.put(

                ‘/resources/myobject’,

                body=json.dumps({‘hello’: ‘world’}).encode(‘utf-8’)

            )

            assert response.status_code == 204

        stub.assert_no_pending_responses()

 

pytest를 사용하여 이러한 테스트를 다시 실행할 수 있습니다.

$ py.test tests/test_app.py
============================= test session starts ==============================
platform darwin -- Python 3.7.3, pytest-5.3.1, py-1.5.3, pluggy-0.12.0
rootdir: /tmp/testclient
plugins: hypothesis-4.43.1, cov-2.8.1
collected 5 items

test_app.py .....                                                         [100%]

============================= 5 passed in 0.43s ================================

 

 

다음 단계

Chalice에서 테스트 클라이언트를 사용하는 방법에 대한 자세한 내용은 테스트 문서와 API 레퍼런스를 확인하세요.  GitHub 레포지토리에서 피드백을 공유할 수 있습니다.

 

원문URL:  https://aws.amazon.com/ko/blogs/gametech/reach-more-players-using-aws-global-accelerator/

** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.