기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
TestState API를 사용하여 상태 시스템 테스트
참고
2025년 11월부터 TestState API에는 AWSStep Functions 워크플로에 대한 자동화된 단위 테스트를 구축할 수 있는 향상된 기능이 포함되어 있습니다. 이러한 향상된 기능은 AWS CLI및 SDKs. 주요 개선 사항이 추가되었습니다.
-
실제 서비스를 호출하지 않고 상태 로직을 테스트하기 위해 HTTP Task 상태를 통해 호출되는 모의 서비스 AWS통합 또는 서비스
-
모의 응답으로 맵, 병렬 및 활동 상태와 같은 고급 상태 테스트
-
특정 재시도, 맵 반복 위치 및 오류 시나리오를 테스트하기 위한 실행 컨텍스트 제어
개요
Step Functions 콘솔, AWSCommand Line Interface (AWS CLI)또는 SDK에서 TestState 기능을 사용하여 지원되는 상태를 테스트할 수 있습니다.
TestState API는 상태의 정의를 수락하고 실행합니다. 이를 통해 상태 시스템을 생성하거나 기존 상태 시스템을 업데이트하지 않고도 상태를 테스트할 수 있습니다. 다음을 제공할 수 있습니다.
-
단일 상태 정의
-
stateName파라미터를 사용한 전체 상태 시스템 정의
TestState API는 상태가 액세스하는 리소스에 필요한 IAM 권한을 포함해야 하는 IAM 역할을 수임합니다. 모의를 지정할 때 역할을 지정하는 것은 선택 사항이 되어 IAM 권한을 구성하지 않고 상태 시스템 로직을 테스트할 수 있습니다. 필요할 수 있는 상태 권한을 알아보려면 TestState API를 사용하기 위한 IAM 권한 섹션을 참조하세요.
주제
TestState API의 검사 레벨 사용
TestState API를 사용하여 상태를 테스트할 때 테스트 결과에서 보려는 세부 정보의 양을 지정할 수 있습니다. 예를 들어 InputPath 또는와 같은 입력 및 출력 데이터 처리 필터를 사용한 경우 중간 및 최종 데이터 처리 결과를 볼 ResultPath수 있습니다.는 다음과 같은 검사 수준을 Step Functions 제공합니다.
이러한 모든 레벨은 status 및 nextState 필드도 반환합니다. status는 상태 실행 상태를 나타냅니다. 예로 SUCCEEDED, FAILED, RETRIABLE, CAUGHT_ERROR, nextState는 전환할 다음 상태의 이름을 나타냅니다. 정의에서 다음 상태를 정의하지 않은 경우 이 필드에는 빈 값이 반환됩니다.
Step Functions 콘솔 및 AWS CLI에서 이러한 검사 레벨을 사용하여 상태를 테스트하는 방법에 대한 자세한 내용은 AWSStep Functions 콘솔을 사용하여 상태 테스트 및 를 사용하여 상태 테스트AWS CLI 섹션을 참조하세요.
INFO 검사 레벨
테스트가 성공하면 이 레벨에 상태 출력이 표시됩니다. 테스트에 실패한 경우 이 레벨에 오류 출력이 표시됩니다. 레벨을 지정하지 않은 경우 Step Functions는 기본적으로 검사 레벨을 INFO로 설정합니다.
다음 이미지는 성공한 통과 상태 테스트를 보여 줍니다. 이 상태의 검사 레벨은 INFO로 설정되고 상태에 대한 출력이 출력 탭에 표시됩니다.
다음 이미지는 검사 레벨이 INFO로 설정된 경우 태스크 상태에서 실패한 테스트를 보여 줍니다. 출력 탭에는 오류 이름과 해당 오류의 원인에 대한 자세한 설명이 포함된 오류 출력이 표시됩니다.
DEBUG 검사 레벨
테스트가 성공하면 이 레벨에는 상태 출력과 입력 및 출력 데이터 처리 결과가 표시됩니다.
테스트에 실패한 경우 이 레벨에 오류 출력이 표시됩니다. 이 레벨은 실패 지점까지의 중간 데이터 처리 결과를 보여 줍니다. 예를 들어 Lambda 함수를 호출하는 태스크 상태를 테스트했다고 가정해 보겠습니다. InputPath, Parameters, Step Functions에서 ResultPath를 사용하여 상태 출력 지정, OutputPath를 사용하여 상태 출력 필터링 필터를 태스크 상태에 적용했다고 생각해 봅니다. 간접 호출이 실패했다고 가정해 보겠습니다. 이 경우 DEBUG 레벨에는 필터 적용에 따른 데이터 처리 결과가 다음과 같은 순서로 표시됩니다.
-
input- 원시 상태 입력 -
afterInputPath- Step Functions에서InputPath필터를 적용한 후 입력. -
afterParameters- Step Functions에서Parameters필터를 적용한 후의 유효 입력.
이 레벨에서 사용할 수 있는 진단 정보는 정의했을 수 있는 서비스 통합 또는 입/출력 데이터 처리 흐름과 관련된 문제를 해결하는 데 도움이 될 수 있습니다.
다음 이미지는 성공한 통과 상태 테스트를 보여 줍니다. 이 상태의 검사 레벨은 DEBUG로 설정되어 있습니다. 다음 이미지의 입력/출력 처리 탭은 이 상태에 제공된 입력에 대한 Parameters의 애플리케이션 결과를 보여 줍니다.
다음 이미지는 검사 레벨이 DEBUG로 설정된 경우 태스크 상태에서 실패한 테스트를 보여 줍니다. 다음 이미지의 입력/출력 처리 탭은 실패 시점까지의 상태에 대한 입력 및 출력 데이터 처리 결과를 보여 줍니다.
추적 검사 레벨
Step Functions는 HTTP 태스크를 테스트하기 위한 TRACE 레벨을 제공합니다. 이 레벨은 Step Functions가 수행하는 HTTP 요청과 HTTPS API가 반환하는 응답에 대한 정보를 반환합니다. 응답에는 헤더 및 요청 본문과 같은 정보가 포함될 수 있습니다. 또한 이 레벨에서 입력 및 출력 데이터 처리의 상태 출력과 결과를 볼 수 있습니다.
테스트에 실패한 경우 이 레벨에 오류 출력이 표시됩니다.
이 레벨은 HTTP 태스크에만 적용됩니다. Step Functions에서 이 레벨을 다른 상태 유형에 사용하면 오류가 발생합니다.
검사 레벨을 추적으로 설정하면 EventBridge 연결에 포함된 암호를 볼 수도 있습니다. 이렇게 하려면 TestState API에서 revealSecrets 파라미터를 true로 설정해야 합니다. 또한 TestState API를 호출하는 IAM 사용자에게 states:RevealSecrets 작업에 대한 권한이 있는지 확인해야 합니다. states:RevealSecrets 권한을 설정하는 IAM 정책에 대한 예제는 TestState API를 사용하기 위한 IAM 권한 섹션을 참조하세요. 이 권한이 없으면 Step Functions에서 액세스 거부 오류가 발생합니다.
revealSecrets 파라미터를 false로 설정하면 HTTP 요청 및 응답 데이터의 모든 암호가 생략됩니다. 모의가 활성화된 revealSecrets 경우에는를 사용할 수 없습니다. TestState API 요청에서 revealSecrets 및 모의를 모두 지정하면가 검증 예외를 Step Functions 반환합니다.
다음 이미지는 성공한 HTTP 태스크 테스트를 보여 줍니다. 이 상태의 검사 레벨은 TRACE로 설정되어 있습니다. 다음 이미지의 HTTP 요청 및 응답 탭은 HTTPS API 직접 호출의 결과를 보여 줍니다.
TestState API를 사용하기 위한 IAM 권한
TestState API를 호출하는 IAM 사용자에게 states:TestState 작업을 수행할 수 있는 권한이 있어야 합니다. 모의를 사용하지 않는 경우 IAM 사용자에게 실행 역할을에 전달하는 iam:PassRole 작업을 수행할 수 있는 권한도 있어야 합니다Step Functions. 또한 revealSecrets 파라미터를 로 설정하면 true IAM 사용자에게 states:RevealSecrets 작업을 수행할 권한이 있어야 합니다. 이 권한이 없으면 Step Functions에서 액세스 거부 오류가 발생합니다.
TestState API 요청에서 모의 객체를 지정할 때 실행 역할을 제공하지 않고도 상태 시스템 로직을 테스트할 수 있습니다(모의 서비스 통합에서 자세한 내용 참조). 모의를 사용하지 않는 경우 상태가 액세스하는 리소스에 필요한 권한이 포함된 실행 역할을 제공해야 합니다. 자신의 상태에 필요할 수 있는 권한을 알아보려면 실행 역할 관리 섹션을 참조하세요.
AWSStep Functions 콘솔을 사용하여 상태 테스트
콘솔에서 상태를 테스트하고 상태 출력 또는 입출력 데이터 처리 흐름을 확인할 수 있습니다. HTTP 태스크에서 원시 HTTP 요청 및 응답을 테스트할 수 있습니다.
참고
콘솔 TestState 기능은 모의 서비스 통합, 맵 및 병렬 상태 테스트, 활동, .sync 및 .waitForTaskToken 패턴 테스트 등이 문서에 설명된 일부 개선 사항을 아직 지원하지 않습니다. 이러한 기능은 현재 AWS CLI또는 SDK를 사용하는 TestState API를 통해서만 사용할 수 있습니다.
상태를 테스트하려면
-
Step Functions 콘솔
을 엽니다. -
상태 머신 생성을 선택하여 상태 머신 생성을 시작하거나 기존 상태 머신을 선택합니다.
-
Workflow Studio의 디자인 모드에서 테스트하려는 상태를 선택합니다.
-
Workflow StudioInspector 패널의에서 테스트 상태를 선택합니다.
-
테스트 상태 대화 상자에서 다음을 수행합니다.
-
실행 역할에서 상태를 테스트할 실행 역할을 선택합니다. 테스트하려는 상태에 필요한 IAM 권한이 있는지 확인합니다.
-
(선택 사항) 선택한 상태에서 테스트에 필요한 모든 JSON 입력을 제공합니다.
-
검사 레벨에서 보려는 값을 기준으로 다음 옵션 중 하나를 선택합니다.
-
정보 - 테스트 성공 시 출력 탭에 상태 출력을 표시합니다. 테스트가 실패하면 정보 탭에는 오류 이름과 해당 오류의 원인에 대한 자세한 설명이 포함된 오류 출력이 표시됩니다. 레벨을 지정하지 않은 경우 Step Functions는 기본적으로 검사 레벨을 정보로 설정합니다.
-
디버그 - 테스트가 성공하면 상태 출력과 입력 및 출력 데이터 처리 결과가 표시됩니다. 테스트가 실패하면 디버그에는 오류 이름과 해당 오류의 원인에 대한 자세한 설명이 포함된 오류 출력이 표시됩니다.
-
추적 - 원시 HTTP 요청 및 응답을 보여 주며 헤더, 쿼리 파라미터 및 기타 API별 세부 정보를 확인하는 데 유용합니다. 이 옵션은 HTTP 태스크에만 사용할 수 있습니다.
필요에 따라 비밀 공개를 선택할 수 있습니다. 이 설정을 추적과 함께 사용하면 API 키 등와 같이 EventBridge 연결에 삽입되는 민감한 데이터를 볼 수 있습니다. 콘솔에 액세스하는 데 사용하는 IAM 사용자 ID에는
states:RevealSecrets작업을 수행할 권한이 있어야 합니다. 이 권한이 없으면 Step Functions에서 테스트가 시작될 때 액세스 거부 오류가 발생합니다.states:RevealSecrets권한을 설정하는 IAM 정책에 대한 예제는 TestState API를 사용하기 위한 IAM 권한 섹션을 참조하세요.
-
-
테스트 시작을 선택합니다.
-
를 사용하여 상태 테스트AWS CLI
에서 TestState API를 사용하여 상태를 테스트할 수 있습니다AWS CLI. 이 API를 사용하여 상태에 대한 정의를 수락하고 이를 실행합니다.
각 상태에서는 테스트 결과에서 보려는 세부 정보의 양을 지정할 수 있습니다. 이러한 세부 정보는 입력 및 출력 데이터 처리 결과, HTTP 요청 및 응답 정보를 포함하여 상태 실행에 대한 추가 정보를 제공합니다. 다음 예제는 TestState API에 지정할 수 있는 다양한 검사 레벨을 보여 줍니다.
이 섹션에는 Step Functions가 AWS CLI에 제공하는 다양한 검사 레벨을 사용하는 방법을 설명하는 다음 예제가 포함되어 있습니다.
예제 1: INFO inspectionLevel을 사용하여 Choice 상태 테스트
에서 INFO inspectionLevel을 사용하여 상태를 테스트하려면 다음 예제와 같이 test-state 명령을 AWS CLI실행합니다.
aws stepfunctions test-state \ --definition '{"Type": "Choice", "Choices": [{"Variable": "$.number", "NumericEquals": 1, "Next": "Equals 1"}, {"Variable": "$.number", "NumericEquals": 2, "Next": "Equals 2"}], "Default": "No Match"}' \ --role-arn arn:aws:iam::account-id:role/myRole\ --input '{"number": 2}'
이 예제에서는 Choice 상태를 사용하여 사용자가 제공한 숫자 입력을 기반으로 상태의 실행 경로를 결정합니다. 레벨을 설정하지 않은 경우 기본적으로 Step Functions는 inspectionLevel을 INFO로 설정합니다.
Step Functions는 다음 출력을 반환합니다.
{
"output": "{\"number\": 2}",
"nextState": "Equals 2",
"status": "SUCCEEDED"
}
예제 2: DEBUG inspectionLevel을 사용하여 패스 상태의 입력 및 출력 데이터 처리 디버깅
에서 DEBUG inspectionLevel을 사용하여 상태를 테스트하려면 다음 예제와 같이 test-state 명령을 AWS CLI실행합니다.
aws stepfunctions test-state \ --definition '{"Type": "Pass", "InputPath": "$.payload", "Parameters": {"data": 1}, "ResultPath": "$.result", "OutputPath": "$.result.data", "Next": "Another State"}' \ --role-arn arn:aws:iam::account-id:role/myRole\ --input '{"payload": {"foo": "bar"}}' \ --inspection-level DEBUG
이 예제에서는 Step Functions가 Pass 워크플로 상태 상태를 사용하여 입력 및 출력 데이터 처리 필터로 입력 JSON 데이터를 필터링하고 조작하는 방법을 보여 줍니다. 이 예제에서는 InputPath, Parameters, Step Functions에서 ResultPath를 사용하여 상태 출력 지정, OutputPath를 사용하여 상태 출력 필터링 필터를 사용합니다.
Step Functions는 다음 출력을 반환합니다.
{
"output": "1",
"inspectionData": {
"input": "{\"payload\": {\"foo\": \"bar\"}}",
"afterInputPath": "{\"foo\":\"bar\"}",
"afterParameters": "{\"data\":1}",
"afterResultSelector": "{\"data\":1}",
"afterResultPath": "{\"payload\":{\"foo\":\"bar\"},\"result\":{\"data\":1}}"
},
"nextState": "Another State",
"status": "SUCCEEDED"
}
예 3: TRACE inspectionLevel 및 revealSecrets를 사용하여 HTTPS API로 전송된 HTTP 요청 검사
의 revealSecrets 파라미터와 함께 TRACE inspectionLevel을 사용하여 HTTP 태스크를 테스트하려면 다음 예제와 같이 test-state 명령을 AWS CLI실행합니다.
aws stepfunctions test-state \
--definition '{"Type": "Task", "Resource": "arn:aws:states:::http:invoke", "Parameters": {"Method": "GET", "Authentication": {"ConnectionArn": "arn:aws:events:region:account-id:connection/MyConnection/0000000-0000-0000-0000-000000000000"}, "ApiEndpoint": "https://httpbin.org/get", "Headers": {"definitionHeader": "h1"}, "RequestBody": {"message": "Hello from Step Functions!"}, "QueryParameters": {"queryParam": "q1"}}, "End": true}' \
--role-arn arn:aws:iam::account-id:role/myRole \
--inspection-level TRACE \
--reveal-secrets
이 예에서는 HTTP 태스크가 지정된 HTTPS API인 https://httpbin.org/를 직접 호출하는지 테스트합니다. 또한 API 직접 호출에 대한 HTTP 요청 및 응답 데이터도 보여 줍니다.
Step Functions는 현재 설명서의 원래 예제와 유사한 출력을 반환합니다.
예제 4: jq 유틸리티를 사용하여 TestState API가 반환하는 응답을 필터링 및 출력
TestState API는 응답에서 JSON 데이터를 이스케이프된 문자열로 반환합니다. 다음 AWS CLI 예제는 예제 3을 확장하고 이 jq 유틸리티를 사용하여 TestState API가 반환하는 HTTP 응답을 사람이 읽을 수 있는 형식으로 필터링하고 출력합니다. jq 및 설치 지침에 대한 자세한 내용은 GitHub의 jq
aws stepfunctions test-state \
--definition '{"Type": "Task", "Resource": "arn:aws:states:::http:invoke", "Parameters": {"Method": "GET", "Authentication": {"ConnectionArn": "arn:aws:events:region:account-id:connection/MyConnection/0000000-0000-0000-0000-000000000000"}, "ApiEndpoint": "https://httpbin.org/get", "Headers": {"definitionHeader": "h1"}, "RequestBody": {"message": "Hello from Step Functions!"}, "QueryParameters": {"queryParam": "q1"}}, "End": true}' \
--role-arn arn:aws:iam::account-id:role/myRole \
--inspection-level TRACE \
--reveal-secrets \
| jq '.inspectionData.response.body | fromjson'
다음 예제에서는 사람이 읽을 수 있는 형식으로 반환된 출력을 보여 줍니다.
{
"args": {
"QueryParam1": "QueryParamValue1",
"queryParam": "q1"
},
"headers": {
"Authorization": "Basic XXXXXXXX",
"Content-Type": "application/json; charset=UTF-8",
"Customheader1": "CustomHeaderValue1",
"Definitionheader": "h1",
"Host": "httpbin.org",
"Range": "bytes=0-262144",
"Transfer-Encoding": "chunked",
"User-Agent": "Amazon|StepFunctions|HttpInvoke|region",
"X-Amzn-Trace-Id": "Root=1-0000000-0000-0000-0000-000000000000"
},
"origin": "12.34.567.891",
"url": "https://httpbin.org/get?queryParam=q1&QueryParam1=QueryParamValue1"
}
입력 및 출력 데이터 흐름 테스트 및 디버깅
TestState API는 워크플로를 통해 전달되는 데이터를 테스트하고 디버깅하는 데 유용합니다. 이 섹션에서는 몇 가지 주요 개념을 제공하고 이러한 목적으로 TestState를 사용하는 방법을 설명합니다.
주요 개념
Step Functions에서는 상태 머신의 상태를 통과하는 JSON 데이터를 필터링하고 조작하는 프로세스를 입력 및 출력 처리라고 합니다. 이 기능의 작동 방식에 대한 자세한 내용은 Step Functions에서 입력 및 출력 처리 단원을 참조하십시오.
Amazon States Language(ASL)의 모든 상태 유형(태스크, 병렬, 맵, 통과, 대기, 선택, 성공, 실패)은 통과하는 JSON 데이터를 필터링하고 조작하기 위한 일련의 공통 필드를 공유합니다. 이러한 필드로는 InputPath, Parameters, ResultSelector, Step Functions에서 ResultPath를 사용하여 상태 출력 지정, OutputPath를 사용하여 상태 출력 필터링 등이 있습니다. 각 필드에 대한 지원은 상태마다 다릅니다
다음 목록은 다이어그램에 표시된 입력 및 출력 처리 필드의 적용 순서를 설명합니다.
-
상태 입력은 이전 상태에서 현재 상태로 전달된 JSON 데이터입니다.
-
InputPath에서는 원시 상태 입력의 일부를 필터링합니다.
-
Parameters에서는 태스크에 전달할 값 집합을 구성합니다.
-
태스크는 작업을 수행하고 결과를 반환합니다.
-
ResultSelector에서는 태스크 결과에서 유지할 값 집합을 선택합니다.
-
Step Functions에서 ResultPath를 사용하여 상태 출력 지정에서는 결과를 원시 상태 입력과 결합하거나 결과를 원시 상태 입력으로 대체합니다.
-
OutputPath를 사용하여 상태 출력 필터링에서는 출력의 일부를 필터링하여 다음 상태로 전달합니다.
-
상태 출력은 현재 상태에서 다음 상태로 전달되는 JSON 데이터입니다.
이러한 입력 및 출력 처리 필드는 선택 사항입니다. 상태 정의에서 이러한 필드를 사용하지 않으면 작업은 원시 상태 입력을 사용하고 작업 결과를 상태 출력으로 반환합니다.
TestState를 사용하여 입력 및 출력 처리 검사
TestState API를 호출하고 inspectionLevel 파라미터를 DEBUG로 설정하면 API 응답에 inspectionData라는 객체가 포함됩니다. 이 객체에는 데이터가 실행되었을 때 상태 내에서 데이터가 필터링 또는 조작된 방식을 검사하는 데 도움이 되는 필드가 포함되어 있습니다. 다음 예제는 태스크 상태용 inspectionData 객체를 보여 줍니다.
"inspectionData": {
"input": string,
"afterInputPath": string,
"afterParameters": string,
"result": string,
"afterResultSelector": string,
"afterResultPath": string,
"output": string
}
이 예제에서 after 접두사가 포함된 각 필드는 특정 필드가 적용된 이후의 데이터를 보여 줍니다. 예를 들어 afterInputPath는 InputPath 필드를 적용하여 원시 상태 입력을 필터링했을 때의 효과를 보여 줍니다. 다음 다이어그램은 각 ASL 정의 필드를 inspectionData 객체의 해당 필드에 매핑합니다.
TestState API를 사용하여 입력 및 출력 처리를 디버깅하는 예제는 다음을 참조하세요.
특히 Map 상태의 경우 inspectionLevel가 로 설정된 경우 inspectionData 객체DEBUG에는 Map 상태가 항목을 추출하고 변환하는 방법을 검사하는 데 도움이 되는 추가 필드가 포함됩니다. 맵 상태 검사 데이터 이해 섹션에서 이러한 필드를 자세히 알아볼 수 있습니다.
맵 상태 검사 데이터 이해
가 로 inspectionLevel 설정된 Map 상태를 테스트하면 DEBUG TestState API 응답에는 Map 상태가 데이터를 처리하는 방법을 보여주는 추가 필드가 inspectionData 객체에 포함됩니다.
참고
afterItemsPath는 JSONPath를 쿼리 언어로 사용할 때만 채워집니다.
-
afterItemsPath(문자열) - ItemsPath 필터가 적용된 후의 유효 입력입니다. 입력에서 추출된 항목의 배열을 보여줍니다. -
afterItemsPointer(문자열) - ItemsPointer 필터가 적용된 후의 유효 입력입니다. 이는 JSON 입력에만 적용됩니다(JSONata 아님). -
afterItemSelector(문자열 배열) - ItemSelector 변환이 적용된 후 입력 값을 포함하는 배열입니다. 배열의 각 요소는 변환된 항목 하나를 나타냅니다. 이 필드는 Map 상태를 테스트할 때만 표시됩니다. -
afterItemBatcher(문자열 배열) - ItemBatcher 그룹화가 적용된 후 입력 값을 포함하는 배열입니다. 이는 항목을 배치로 그룹화하는 방법을 보여줍니다. 이 필드는 Map 상태를 테스트할 때만 표시됩니다. -
toleratedFailureCount(숫자) - Map 상태 반복 횟수로 표현되는 Map 상태의 허용 실패 임계값입니다. 이 값은 ToleratedFailureCount에 지정된 값 또는 ToleratedFailureCountPath의 런타임 시 평가된 값에서 파생됩니다. -
toleratedFailurePercentage(숫자) - 맵 상태 반복의 백분율로 표현되는 맵 상태의 허용 실패 임계값입니다. 이 값은 ToleratedFailurePercentage에 지정된 값 또는 ToleratedFailurePercentagePath의 런타임 시 평가된 값에서 파생됩니다. -
maxConcurrency(숫자) - Map 상태의 최대 동시성 설정입니다.
이러한 필드를 사용하면 배포 전에 맵 상태의 데이터 변환 및 내결함성 구성이 올바르게 작동하는지 검증할 수 있습니다.
TestState API를 사용하여 테스트하고 어설션할 수 있는 항목
TestState API를 사용하면 상태 시스템에 대한 포괄적인 단위 테스트를 작성할 수 있습니다. 다음을 포함하여 상태 시스템 로직의 여러 측면을 어설션할 수 있습니다.
오류 처리: 적용되는 캐치 또는 재시도
오류를 모의하면 TestState API를 사용하여 어떤 오류 핸들러가 활성화되는지 확인할 수 있습니다.
캐치 블록의 경우 다음을 어설션할 수 있습니다.
-
오류를 포착하는 Catch 핸들러(응답
catchIndex에서를 통해) -
다음 상태는 무엇입니까(응답
nextState에서를 통해)? -
오류 핸들러로 흐르는 데이터(응답
output에서 ResultPath 고려를 통해)
재시도 블록의 경우 다음을 어설션할 수 있습니다.
-
적용되는 재시도(응답
retryIndex에서를 통해) -
백오프 지속 시간(응답
retryBackoffIntervalSeconds에서를 통해) -
재시도가 소진되고 오류가 포착되는지 여부
데이터 변환: 입력 및 출력 처리
TestState API를 사용하면 각 처리 단계에서 상태 데이터가 어떻게 변환되는지 검증할 수 있습니다.
다음에서 어설션할 수 있습니다.
-
InputPath 필터 후 입력(
afterInputPath) -
파라미터/인수 변환 후 데이터(
afterParameters또는afterArguments) -
ResultSelector(
afterResultSelector) 이후 결과 -
ResultPath 이후의 출력(
afterResultPath) -
OutputPath(
output) 이후의 최종 출력
맵 상태 변환: ItemSelector, ItemsPath, ItemBatcher, ItemsPointer
Map 상태의 경우 TestState API를 사용하여 항목이 추출되고 변환되는 방법을 확인할 수 있습니다.
다음에서 어설션할 수 있습니다.
-
ItemsPath 필터 뒤의 항목(
afterItemsPath) -
ItemsPointer 필터 뒤의 항목(
afterItemsPointer) -
ItemSelector 변환 후 항목(
afterItemSelector) -
ItemBatcher 그룹화 이후의 항목(
afterItemBatcher)
맵 상태 실패 임계값: Testing States.ExceedToleratedFailureThreshold
특정 횟수의 실패한 반복이 허용 가능한 실패 임계값을 트리거하는지 테스트합니다.
다음에서 어설션할 수 있습니다.
-
States.ExceedToleratedFailureThreshold에서 Map 상태가 실패하는지 여부
맵 및 병렬 상태의 오류 전파
맵 또는 병렬 상태 내에서 상태를 테스트할 때 오류는 실제 실행에서와 마찬가지로 상위 상태 오류 핸들러로 전파됩니다.
errorCausedByState를 사용하여 오류 소스 지정
맵 또는 병렬 상태에 대한 오류를 모의할 때는 stateConfiguration.errorCausedByState 파라미터를 사용하여 오류를 일으킨 하위 상태를 지정해야 합니다. 이는와 같은 와일드카드 오류를 테스트할 때 특히 중요합니다States.TaskFailed. States.TaskFailed는 작업 상태 실패에 적용되는 와일드카드 오류입니다. Map 또는 Parallel 상태가이 오류를 처리하는 방법을 테스트하려면 오류를 발생시킨 특정 하위 상태를 식별해야 합니다. 아래 예제를 참조하세요.
aws stepfunctions test-state \ --definition '{...Map or Parallel state definition...}' \ --input '[...]' \ --state-configuration '{"errorCausedByState": "ProcessItem"}' \ --mock '{"errorOutput": {"error": "States.TaskFailed", "cause": "Task execution failed"}}'
이 예제에서는 Map/Parallel 워크플로 내의 "ProcessItem" 상태에서 오류가 발생했음을 TestState에 errorCausedByState 알립니다. 상위 Map/Parallel 상태의 Catch 또는 Retry 핸들러는 실제 실행 중에와 마찬가지로 오류를 처리합니다. 응답의 nextState 필드에는 오류를 발견한 오류 핸들러가 표시됩니다. 다음에서 어설션할 수 있습니다.
-
상위 Catch 핸들러가 하위 상태 오류를 포착하는지 여부
-
하위 상태 오류가 상위 재시도 정책을 트리거하는지 여부
-
오류 전파 후 다음 상태는 무엇입니까?
모의 서비스 통합
TestState API는 서비스 통합의 결과를 모의하여 실제 AWS서비스를 호출하지 않고도 상태 시스템 로직을 테스트할 수 있도록 지원합니다.
모의를 사용해야 하는 경우
모의 작업은 다음과 같은 경우에 유용합니다.
-
격리된 단위 테스트 상태 시스템 정의
-
오류 처리 및 재시도 로직 테스트
-
입력 및 출력 데이터 변환 검증
-
다양한 서비스 응답 및 오류 조건 시뮬레이션
-
IAM 권한을 구성하지 않고 테스트
모의 객체를 지정하면 roleArn 파라미터가 선택 사항이 되어 권한 관련 문제를 처리하지 않고 상태 시스템 정의를 테스트하는 데 집중할 수 있습니다.
참고
맵, 병렬, 활동, .sync 서비스 통합 및 waitForTaskToken 서비스 통합과 같은 상태 유형 또는 서비스 통합 패턴을 테스트해야 하는 경우 모의 작업이 필요합니다.
기본 모의 구문
서비스 통합 결과를 모의하려면:
aws stepfunctions test-state \ --definition '{ "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Arguments": { "FunctionName": "MyFunction", "Payload.$": "$" }, "End": true }' \ --input '{"key": "value"}' \ --mock '{"result": "{\"Payload\": {\"statusCode\": 200, \"body\": \"Success\"}}"}'
오류를 모의하려면:
aws stepfunctions test-state \ --definition '{ "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Arguments": {...}, "End": true }' \ --input '{"key": "value"}' \ --mock '{"errorOutput": {"error": "Lambda.ServiceException", "cause": "Service unavailable"}}'
참고
동일한 API 호출mock.errorOutput에서 mock.result 및를 모두 제공할 수는 없습니다. 이로 인해 검증 예외가 발생합니다.
모의 검증 모드
TestState API는 AWS서비스 API 모델에 대해 모의 응답을 검증하여 정확성을 보장합니다. fieldValidationMode 파라미터를 사용하여 검증 동작을 제어할 수 있습니다.
-
STRICT(기본값) - AWSAPI 모델에서 필드 이름 지정, 크기, 셰이프 및 데이터 유형 제약 조건을 적용합니다. 모든 필수 필드에 올바른 유형이 있어야 합니다. 이 모드는 모의 객체가 실제 서비스 응답을 정확하게 표현하도록 하는 데 도움이 됩니다.
-
PRESENT - 모의에 있는 필드만 검증합니다. 알 수 없는 필드는 무시됩니다. 이 모드는 유연성을 원하지만 알려진 필드에 대한 검증을 원하는 경우에 유용합니다.
-
없음 - 검증을 완전히 건너뜁니다. 실제 실행과 다른 잘못된 테스트 가정 및 동작이 발생할 수 있으므로 주의해서 사용하십시오.
참고
검증은 AWS서비스 API 모델에 정의된 필드에서만 수행됩니다. API 모델에 지정되지 않은 필드는 검증 모드에 관계없이 검증 중에 무시됩니다. 예를 들어 '필수' 필드를 정의하지 않는 API에 STRICT 모드를 사용하는 경우 빈 모의 응답은 검증을 통과합니다.
검증 모드가 있는 예제:
aws stepfunctions test-state \ --definition '{ "Type": "Task", "Resource": "arn:aws:states:::dynamodb:putItem", "Parameters": {...}, "End": true }' \ --input '{"key": "value"}' \ --mock '{"fieldValidationMode": "STRICT", "result": "{\"Attributes\": {...}}"}'
중요
HTTP 작업, API 게이트웨이, EKS 호출 및 EKS RunJob 통합에는 모의 검증이 지원되지 않습니다.
맵 및 병렬 상태 테스트
TestState API는 모의가 지정될 때 맵 및 병렬 상태 테스트를 지원합니다. 이렇게 하면 이러한 흐름 상태의 입력 및 출력 처리를 테스트할 수 있습니다.
맵 상태 테스트 이해
TestState API를 사용하여 Map 상태를 테스트할 때 내부에서 반복을 실행하지 않고 Map 상태의 입력 및 출력 처리를 테스트합니다. 이 접근 방식을 사용하면 다음을 테스트할 수 있습니다.
-
입력에서 ItemsPath 또는 ItemsPointer 추출
-
각 항목에 적용된 ItemSelector 변환
-
ItemBatcher 그룹화(지정된 경우)
-
Map 상태의 출력 처리(ResultPath, OutputPath)
-
허용된 실패 임계값
ItemProcessor(각 항목을 처리하는 상태) 내에서 발생하는 일을 테스트하지 않습니다.
맵 상태 테스트
Map 상태를 테스트할 때 모의 결과는 전체 Map 상태의 출력을 나타내야 합니다. 모의 결과는 Map 상태 구성에 따라 유효한 JSON 배열 또는 JSON 객체여야 합니다. 아래 예제를 참조하세요.
aws stepfunctions test-state \ --definition '{ "Type": "Map", "ItemsPath": "$.items", "ItemSelector": { "value.$": "$$.Map.Item.Value", "index.$": "$$.Map.Item.Index" }, "ItemProcessor": { "ProcessorConfig": {"Mode": "INLINE"}, "StartAt": "ProcessItem", "States": { "ProcessItem": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "End": true } } }, "End": true }' \ --input '{"items": [1, 2, 3, 4, 5]}' \ --mock '{"result": "[10, 20, 30, 40, 50]"}' \ --inspection-level DEBUG
분산 맵 상태 테스트
Distributed Map 상태는 인라인 Map 상태와 유사하게 테스트됩니다. 맵에서 ItemReader를 사용하여 S3에서 읽는 경우 입력에 직접 데이터를 제공합니다(S3에서 이미 읽은 것처럼). 예제:
aws stepfunctions test-state \ --definition '{ "Type": "Map", "ItemReader": { "Resource": "arn:aws:states:::s3:getObject", "Parameters": { "Bucket": "my-bucket", "Key": "orders.json" } }, "ItemsPath": "$.orders", "ItemProcessor": { "ProcessorConfig": {"Mode": "DISTRIBUTED"}, ... }, "ToleratedFailureCount": 5, "End": true }' \ --input '{ "orders": [ {"orderId": "123"}, {"orderId": "456"}, {"orderId": "789"} ] }' \ --mock '{"result": "..."}'
참고
Distributed Map 상태(Mode set to DISTRIBUTED)를 테스트할 때 mapIterationFailureCount에서 어설션할 수도 있습니다. 이 필드의 값은 맵 내에서 상태를 테스트할 때 입력의 항목 수를 초과하거나 항목 수와 같을 수 없습니다.
자동 컨텍스트 모집단
context 파라미터를 제공하지 않고 Map 상태(stateName파라미터 사용) 내에서 상태를 테스트할 때 TestState는 컨텍스트 객체를 기본값으로 자동으로 채웁니다. 여기에는 다음과 같은 맵별 컨텍스트 필드가 포함됩니다.
-
$$.Map.Item.Index=0(첫 번째 반복) -
$$.Map.Item.Value= 입력 값 -
$$.Map.Item.Key(특정 ItemReader 구성이 있는 분산 맵의 경우) -
$$.Map.Item.Source(분산 맵의 경우 항목의 소스를 나타냄)
병렬 상태 테스트
병렬 상태를 테스트할 때 모의 결과는 브랜치가 정의에 나타나는 것과 동일한 순서로 각 브랜치에 대해 하나의 요소가 있는 JSON 배열이어야 합니다.
테스트 활동, .sync 및 .waitForTaskToken 상태
TestState API는 모의 객체가 지정될 때 활동 상태, .sync 서비스 통합 패턴 및 .waitForTaskToken 패턴 테스트를 지원합니다. 모의가 없으면 TestState API를 통해 이러한 상태를 호출하면 검증 예외가 반환됩니다.
참고
TestState API를 사용하여 .sync 통합을 테스트하기 위해 모의 응답은 폴링 API의 스키마에 대해 검증됩니다. 예를 들어를 테스트startExecution.sync:2할 때 모의는 DescribeExecution 응답이 아닌 StartExecution 응답 스키마(상태를 Step Functions폴링)와 일치해야 합니다.
상태 시스템 정의를 통한 반복
TestState API에 전체 상태 시스템 정의를 제공하고 stateName 파라미터를 사용하여 테스트할 상태를 지정할 수 있습니다. 이렇게 하면 전체 상태 시스템의 컨텍스트 내에서 해당 특정 상태를 테스트할 수 있습니다. 한 테스트의 출력 및 nextState를 입력으로 사용하여 테스트를 연결할 수도 있습니다. 이를 통해 상태 시스템 내에서 부분 또는 전체 실행 경로를 테스트할 수 있습니다.
TestState API에서 컨텍스트 필드 사용
context 파라미터를 사용하면 실행 중에 일반적으로 채워지는 컨텍스트 객체의 값을 제공할 수 있습니다. 이는 실행 ID, 상태 이름 또는 입력된 시간과 같은 컨텍스트 값을 참조하는 상태를 테스트하는 데 유용합니다. 아래 예제는 TestState API 호출에서 컨텍스트 객체를 사용하는 방법을 보여줍니다.
aws stepfunctions test-state \ --definition '{ "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Arguments": { "FunctionName": "MyFunction", "Payload": { "executionId.$": "$$.Execution.Id", "stateName.$": "$$.State.Name", "enteredTime.$": "$$.State.EnteredTime" } }, "End": true }' \ --input '{"data": "value"}' \ --context '{ "Execution": { "Id": "arn:aws:states:us-east-1:123456789012:execution:MyStateMachine:test-exec-123", "Name": "test-exec-123", "StartTime": "2024-01-01T10:00:00.000Z" }, "State": { "Name": "ProcessData", "EnteredTime": "2024-01-01T10:00:05.000Z" } }' \ --mock '{"result": "{\"status\": \"success\"}"}'
재시도 및 오류 처리 테스트
TestState API를 사용하면 재시도 시나리오를 시뮬레이션하고 재시도 및 모의 오류를 지정하여 오류 처리 로직을 테스트할 수 있습니다.
재시도 시뮬레이션
aws stepfunctions test-state \ --definition '{ "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Arguments": {...}, "Retry": [{ "ErrorEquals": ["Lambda.ServiceException"], "IntervalSeconds": 2, "MaxAttempts": 3, "BackoffRate": 2.0 }], "End": true }' \ --input '{"data": "value"}' \ --state-configuration '{"retrierRetryCount": 1}' \ --mock '{"errorOutput": {"error": "Lambda.ServiceException", "cause": "Service error"}}' \ --inspection-level DEBUG
응답에는 inspectionData의 오류 세부 정보가 포함됩니다.
{
"status": "RETRIABLE",
"inspectionData": {
"errorDetails": {
"retryBackoffIntervalSeconds": 4,
"retryIndex": 0
}
}
}
이 응답은 다음을 나타냅니다.
-
오류를 재시도할 수 있습니다(상태: RETRIABLE).
-
백오프 지속 시간은 4초(2 × 2.0^1)입니다.
-
첫 번째 재시도(인덱스 0)가 적용됩니다.
캐치 핸들러 테스트
오류가 모의되고 Catch 핸들러와 일치하는 경우 TestState API 응답의 nextState 필드는 오류를 처리할 상태를 나타냅니다. 아래 예제에서는 다음과 같습니다.
아래 지정된 TestState API 요청에 대해
aws stepfunctions test-state \ --definition '{ "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Arguments": {...}, "Catch": [{ "ErrorEquals": ["Lambda.TooManyRequestsException"], "ResultPath": "$.error", "Next": "HandleThrottling" }], "Next": "Success" }' \ --input '{"data": "value"}' \ --mock '{"errorOutput": {"error": "Lambda.TooManyRequestsException", "cause": "Rate exceeded"}}' \ --inspection-level DEBUG
예상되는 API 응답은 다음과 같아야 합니다.
{
"status": "CAUGHT_ERROR",
"nextState": "HandleThrottling",
"error": "Lambda.TooManyRequestsException",
"cause": "Rate exceeded",
"output": "{\"data\": \"value\", \"error\": {\"Error\": \"Lambda.TooManyRequestsException\", \"Cause\": \"Rate exceeded\"}}",
"inspectionData": {
"errorDetails": {
"catchIndex": 0
}
}
}
이 응답은 다음을 나타냅니다.
-
오류가 발견됨(상태: CAugHT_ERROR)
-
다음 상태는 HandleThrottling입니다.
-
오류 정보가 ResultPath를 통해 출력에 추가됩니다.
-
첫 번째 Catch 핸들러(인덱스 0)가 오류를 발견했습니다.
컨텍스트 객체에서 RetryCount 값을 늘려 모든 재시도가 소진될 때 어떤 일이 발생하는지 테스트할 수도 있습니다.