Lambda 지속성 함수 테스트 - AWS Lambda

Lambda 지속성 함수 테스트

AWS는 로컬 및 클라우드 모두에서 실행을 실행하고 검사할 수 있는 지속성 함수에 대한 전용 테스트 SDK를 제공합니다. 해당 언어에 맞는 테스트 SDK를 설치합니다.

TypeScript
npm install --save-dev @aws/aws-durable-execution-sdk-js-testing

전체 설명서 및 예제는 GitHub의 TypeScript testing SDK를 참조하세요.

Python
pip install aws-durable-execution-sdk-python-testing

전체 설명서 및 예제는 GitHub의 Python testing SDK를 참조하세요.

테스트 SDK는 빠른 유닛 테스트를 위한 로컬 테스트와 배포된 함수에 대한 통합 테스트를 위한 클라우드 테스트라는 2가지 테스트 모드를 제공합니다.

로컬 테스트

로컬 테스트는 배포된 리소스 없이 개발 환경에서 지속성 함수를 실행합니다. 테스트 실행기는 함수 코드를 직접 실행하고 검사를 위해 모든 작업을 캡처합니다.

유닛 테스트, 테스트 기반 개발 및 CI/CD 파이프라인에 로컬 테스트를 사용합니다. 테스트는 네트워크 지연 시간이나 추가 비용 없이 로컬에서 실행됩니다.

다음은 테스트 예시입니다.

TypeScript
import { withDurableExecution } from '@aws/aws-durable-execution-sdk-js'; import { DurableFunctionTestRunner } from '@aws/aws-durable-execution-sdk-js-testing'; const handler = withDurableExecution(async (event, context) => { const result = await context.step('calculate', async () => { return event.a + event.b; }); return result; }); test('addition works correctly', async () => { const runner = new DurableFunctionTestRunner({ handler }); const result = await runner.run({ a: 5, b: 3 }); expect(result.status).toBe('SUCCEEDED'); expect(result.result).toBe(8); const step = result.getStep('calculate'); expect(step.result).toBe(8); });
Python
from aws_durable_execution_sdk_python import durable_execution, DurableContext from aws_durable_execution_sdk_python_testing import DurableFunctionTestRunner from aws_durable_execution_sdk_python.execution import InvocationStatus @durable_execution def handler(event: dict, context: DurableContext) -> int: result = context.step(lambda _: event["a"] + event["b"], name="calculate") return result def test_addition(): runner = DurableFunctionTestRunner(handler=handler) with runner: result = runner.run(input={"a": 5, "b": 3}, timeout=10) assert result.status is InvocationStatus.SUCCEEDED assert result.result == 8 step = result.get_step("calculate") assert step.result == 8

테스트 실행기는 최종 결과, 개별 단계 결과, 대기 작업, 콜백 및 오류를 포함한 실행 상태를 캡처합니다. 이름으로 작업을 검사하거나 모든 작업을 반복하여 실행 동작을 확인할 수 있습니다.

실행 스토어

테스트 SDK는 실행 스토어를 사용하여 테스트 실행 데이터를 유지합니다. 기본적으로 테스트는 빠른 메모리 내 스토어를 사용하므로 정리가 필요하지 않습니다. 실행 내역을 디버깅 또는 분석하려면 실행을 JSON 파일로 저장하는 파일 시스템 스토어를 사용할 수 있습니다.

메모리 내 스토어(기본값):

메모리 내 스토어는 테스트 실행 중에 실행 데이터를 메모리에 보관합니다. 테스트가 완료되면 데이터가 손실되기에 테스트 완료 후 실행을 검사할 필요가 없는 표준 유닛 테스트 및 CI/CD 파이프라인에 적합합니다.

파일 시스템 스토어:

파일 시스템 스토어는 실행 데이터를 JSON 파일로 디스크에 유지합니다. 각 실행은 별도의 파일에 저장되므로 테스트 완료 후 실행 내역을 쉽게 검사할 수 있습니다. 복잡한 테스트 실패를 디버깅하거나 시간 경과에 따른 실행 패턴을 분석할 때 파일 시스템 스토어를 사용합니다.

환경 변수를 사용하여 스토어를 구성합니다.

# Use filesystem store export AWS_DEX_STORE_TYPE=filesystem export AWS_DEX_STORE_PATH=./test-executions # Run tests pytest tests/

실행 파일은 이름이 삭제된 상태로 저장되고 작업, 체크포인트 및 결과를 포함한 전체 실행 상태를 포함합니다. 파일 시스템 스토어는 스토리지 디렉터리가 없는 경우 스토리지 디렉터리를 자동으로 생성합니다.

클라우드 테스트

클라우드 테스트는 AWS에서 배포된 지속성 함수를 간접 호출하고 Lambda API를 사용하여 실행 내역을 검색합니다. 클라우드 테스트를 사용하여 실제 AWS 서비스 및 구성을 통해 프로덕션과 유사한 환경에서의 동작을 확인합니다.

클라우드 테스트에는 배포된 함수와 함수를 간접 호출하고 실행 내역을 읽을 수 있는 권한이 있는 AWS 자격 증명이 필요합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction", "lambda:GetDurableExecution", "lambda:GetDurableExecutionHistory" ], "Resource": "arn:aws:lambda:region:account-id:function:function-name" } ] }

다음은 클라우드 테스트 예시입니다.

TypeScript
import { DurableFunctionCloudTestRunner } from '@aws/aws-durable-execution-sdk-js-testing'; test('deployed function processes orders', async () => { const runner = new DurableFunctionCloudTestRunner({ functionName: 'order-processor', region: 'us-east-1' }); const result = await runner.run({ orderId: 'order-123' }); expect(result.status).toBe('SUCCEEDED'); expect(result.result.status).toBe('completed'); });
Python
from aws_durable_execution_sdk_python_testing import ( DurableFunctionCloudTestRunner, DurableFunctionCloudTestRunnerConfig ) def test_deployed_function(): config = DurableFunctionCloudTestRunnerConfig( function_name="order-processor", region="us-east-1" ) runner = DurableFunctionCloudTestRunner(config=config) result = runner.run(input={"orderId": "order-123"}) assert result.status is InvocationStatus.SUCCEEDED assert result.result["status"] == "completed"

클라우드 테스트는 실제 배포된 함수를 간접 호출하고 AWS에서 실행 내역을 검색합니다. 이를 통해 다른 AWS 서비스와의 통합을 확인하고, 성능 특성을 검증하고, 프로덕션과 유사한 데이터 및 구성을 활용하여 테스트할 수 있습니다.

테스트 대상

실행 결과, 작업 동작 및 오류 처리를 확인하여 지속성 함수를 테스트합니다. 구현 세부 정보가 아닌 비즈니스 로직 정확성에 중점을 둡니다.

실행 결과 확인: 함수가 주어진 입력에 대한 예상 값을 반환하는지 확인합니다. 성공적인 실행과 오류 사례를 모두 테스트하여 함수가 잘못된 입력을 적절하게 처리하는지 확인합니다.

작업 실행 검사: 단계, 대기 및 콜백이 예상대로 실행되는지 확인합니다. 단계 결과를 확인하여 중간 작업이 올바른 값을 생성하는지 확인합니다. 대기 작업이 적절한 제한 시간으로 구성되고 콜백이 올바른 설정으로 생성되었는지 확인합니다.

테스트 오류 처리: 잘못된 입력이 제공되면 함수가 오류를 설명하는 메시지와 함께 올바르게 실패하는지 확인합니다. 일시적인 실패를 시뮬레이션하고 작업을 적절하게 재시도하여 재시도 동작을 테스트합니다. 영구 실패가 불필요한 재시도를 트리거하지 않는지 확인합니다.

워크플로 검증: 다단계 워크플로의 경우 작업이 올바른 순서로 실행되는지 확인합니다. 조건부 분기를 테스트하여 다양한 실행 경로가 올바르게 작동하는지 확인합니다. 병렬 작업의 동시 실행 여부를 확인하고 예상 결과를 생성합니다.

SDK 설명서 리포지토리에는 다단계 워크플로, 오류 시나리오, 제한 시간 처리 및 폴링 패턴을 포함한 테스트 패턴의 광범위한 예제가 포함되어 있습니다.

테스트 전략

개발 중 유닛 테스트와 CI/CD 파이프라인에는 로컬 테스트를 사용합니다. 로컬 테스트는 빠르게 실행되고, AWS 자격 증명이 필요하지 않으며, 코드 변경과 관련된 즉각적인 피드백이 제공됩니다. 로컬 테스트를 작성하여 비즈니스 로직, 오류 처리 및 운영 동작을 확인합니다.

프로덕션에 배포하기 전에 통합 테스트에 클라우드 테스트를 사용합니다. 클라우드 테스트는 실제 AWS 서비스 및 구성으로 동작을 확인하고, 성능 특성을 검증하고, 전체적인 워크플로를 테스트합니다. 스테이징 환경에서 클라우드 테스트를 실행하여 프로덕션에 도달하기 전에 통합 문제를 파악합니다.

로컬 테스트에서 외부 종속성을 모방하여 함수 로직을 격리하고 테스트를 빠르게 유지합니다. 클라우드 테스트를 사용하여 데이터베이스, API 및 기타 AWS 서비스와 같은 외부 서비스와의 실제 통합을 확인합니다.

하나의 특정 동작을 확인하는 집중 테스트를 작성합니다. 테스트 대상을 설명하는 테스트 이름을 사용합니다. 관련 테스트를 그룹화하고 공통 설정 코드에 테스트 픽스처를 사용합니다. 테스트를 단순하게 유지하고 이해하기 어려운 복잡한 테스트 로직을 지양합니다.

실패 디버깅

테스트 실패 시 실행 결과를 검사하여 무엇이 잘못되었는지 파악합니다. 실행 상태를 확인하여 함수가 성공, 실패 또는 제한 시간 초과되었는지 여부를 확인합니다. 오류 메시지를 읽고 실패 원인을 파악합니다.

개별 작업 결과를 검사하여 동작이 예상과 다른 위치를 찾아냅니다. 단계 결과를 확인하여 생성된 값을 파악합니다. 작업 순서를 확인하여 예상 순서로 실행된 작업을 확인합니다. 작업 수를 계산하여 적절한 수의 단계, 대기 및 콜백이 생성되었는지 확인합니다.

공통의 문제로는 재생 시 다양한 결과를 생성하는 비결정론적 코드, 재생 도중 중단되는 전역 변수를 통한 공유 상태, 조건부 로직 오류로 인한 작업 누락 등이 있습니다. 표준 디버거 및 로깅을 사용하여 함수 코드를 단계별로 파악하고 실행 흐름을 추적합니다.

클라우드 테스트의 경우 CloudWatch Logs의 실행 내역을 검사하여 상세 작업 로그를 확인합니다. 트레이스를 사용하여 서비스 전반의 실행 흐름을 추적하고 병목 현상을 식별합니다.