本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用模擬服務集成
在 Step Functions Local 中,您可以使用模擬服務整合來測試狀態機器的執行路徑,而無需實際呼叫整合式服務。要將狀態機器配置為使用模擬服務集成,請創建一個模擬配置文件。在此文件中,您將服務集成的所需輸出定義為模擬響應,以及使用模擬響應將執行路徑模擬為測試用例的執行的執行。
藉由將模擬設定檔提供給 Step Functions Local,您可以執行使用測試案例中指定的模擬回應的狀態機器來測試服務整合呼叫,而不是進行實際的服務整合呼叫。
注意
如果您沒有在模擬配置文件中指定模擬服務集成響應,Step Functions 本地將使用您在設置步 Step Functions 本地配置的端點調用 AWS 服務集成。如需有關設定 Step Functions 本機端點的資訊,請參閱設定 Step Functions 的組態選項本機。
本主題的關鍵概念
本主題使用下列清單中定義的數個概念:
模擬服務集成-指配置為使用模擬響應而不是執行實際服務調用的任務狀態。
模擬響應-指任務狀態可以配置為使用的模擬數據。
測試用例-是指配置為使用模擬服務集成的狀態機器執行。
模擬配置文件-指包含 JSON 的模擬配置文件,該文件定義了模擬服務集成,模擬響應和測試用例。
步驟 1:在模擬配置文件中指定模擬服務集成
您可以使用 Step Functions 本機來測試 Step Functions AWS SDK 和最佳化服務整合。下圖顯示了狀態機器定義標籤中定義的狀態機器:
要做到這一點,你必須創建一個模擬配置文件,其中包含如中所定義的部分引入模擬配置的結構。
-
建立名為的檔案
MockConfigFile.json
以設定具有模擬服務整合的測試。下列範例會示範參照狀態機器的模擬組態檔案,其中兩個已定義的狀態為
LambdaState
和SQSState
。您可以使用以下測試用例之一運行模擬配置文件中引用的
LambdaSQSIntegration
狀態機定義:-
HappyPath
-此測試MockedSQSSuccess
分別嘲笑LambdaState
和SQSState
使用MockedLambdaSuccess
和的輸出。-
LambdaState
將返回以下值:"0":{ "Return":{ "StatusCode":200, "Payload":{ "StatusCode":200, "body":"Hello from Lambda!" } } }
-
SQSState
將返回以下值:"0":{ "Return":{ "MD5OfMessageBody":"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51", "MessageId":"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51" } }
-
-
RetryPath
-此測試MockedSQSSuccess
分別嘲笑LambdaState
和SQSState
使用MockedLambdaRetry
和的輸出。此外,還設定LambdaState
為執行四次重試嘗試。這些嘗試的模擬回應會在狀態中定義並建MockedLambdaRetry
立索引。-
初始嘗試以工作失敗結束,其中包含原因和錯誤訊息,如下列範例所示:
"0":{ "Throw": { "Error": "Lambda.ResourceNotReadyException", "Cause": "Lambda resource is not ready." } }
-
第一次和第二次重試嘗試以工作失敗結束,其中包含原因和錯誤訊息,如下列範例所示:
"1-2":{ "Throw": { "Error": "Lambda.TimeoutException", "Cause": "Lambda timed out." } }
-
第三次重試嘗試以任務成功結束,其中包含來自模擬 Lambda 回應中「有效負載」區段的狀態結果。
"3":{ "Return": { "StatusCode": 200, "Payload": { "StatusCode": 200, "body": "Hello from Lambda!" } } }
注意
對於具有重試原則的狀態,「Step Functions 本機」會耗盡原則中設定的重試嘗試,直到收到成功回應為止。這意味著您必須表示具有連續嘗試次數的重試模擬,並且應該在返回成功響應之前覆蓋所有重試嘗試。
如果您沒有為特定的重試嘗試指定模擬回應 (例如重試「3」),則狀態機器執行將會失敗。
-
-
HybridPath
-此測試嘲笑的LambdaState
輸出。成功LambdaState
運行並接收模擬數據作為響應後,對生產中指定的資源SQSState
執行實際的服務調用。
有關如何使用模擬服務集成開始測試執行的信息,請參閱。步驟 3:執行模擬服務整合測試
-
請確定模擬回應的結構符合您進行整合式服務呼叫時所收到的實際服務回應結構。如需有關模擬回應之結構需求的資訊,請參閱設定模擬服務整合。
在前面的示例模擬配置文件中,在中定義的模擬響應
MockedLambdaSuccess
並MockedLambdaRetry
符合從調用HelloFromLambda
返回的實際響應的結構。重要
AWS 不同服務之間的服務回應可能會有所不同。Step Functions Local 不驗證模擬響應結構是否符合實際的服務響應結構。在測試之前,您必須確保模擬響應符合實際響應。若要檢閱服務回應的結構,您可以使用 Step Functions 執行實際的服務呼叫,或檢視這些服務的說明文件。
第 2 步:提供模擬配置文件 Step Functions 本地
您可以通過以下方式之一提供模擬配置文件 Step Functions 局部:
步驟 3:執行模擬服務整合測試
建立並提供模擬組態檔案給 Step Functions Local 之後,請使用模擬服務整合執行在模擬設定檔中設定的狀態機器。然後使用 API 動作檢查執行結果。
-
根據模擬配置文件中先前提到的定義創建一個狀態機。
aws stepfunctions create-state-machine \ --endpoint http://localhost:8083 \ --definition "{\"Comment\":\"Thisstatemachineiscalled:LambdaSQSIntegration\",\"StartAt\":\"LambdaState\",\"States\":{\"LambdaState\":{\"Type\":\"Task\",\"Resource\":\"arn:aws:states:::lambda:invoke\",\"Parameters\":{\"Payload.$\":\"$\",\"FunctionName\":\"arn:aws:lambda:us-east-1:123456789012:function:HelloWorldFunction\"},\"Retry\":[{\"ErrorEquals\":[\"States.ALL\"],\"IntervalSeconds\":2,\"MaxAttempts\":3,\"BackoffRate\":2}],\"Next\":\"SQSState\"},\"SQSState\":{\"Type\":\"Task\",\"Resource\":\"arn:aws:states:::sqs:sendMessage\",\"Parameters\":{\"QueueUrl\":\"https://sqs.us-east-1.amazonaws.com/123456789012/myQueue\",\"MessageBody.$\":\"$\"},\"End\":true}}}" \ --name "LambdaSQSIntegration" --role-arn "arn:aws:iam::123456789012:role/service-role/LambdaSQSIntegration"
-
使用模擬服務集成運行狀態機。
要使用模擬配置文件,請在模擬配置文件中配置的狀態機器上進行
StartExecution
API 調用。若要這麼做,請將尾碼附加至使用的狀態機器 ARN。#
test_name
StartExecution
是一個測試用例,該用例在同一模擬配置文件中為狀態機配置。test_name
以下命令是使用
LambdaSQSIntegration
狀態機和模擬配置的示例。在此範例中,使用中定義的HappyPath
測試執行LambdaSQSIntegration
狀態機器步驟 1:在模擬配置文件中指定模擬服務集成。該HappyPath
測試包含用於處理模擬服務集成調用的執行配置,以LambdaState
及使用MockedLambdaSuccess
和模MockedSQSSuccess
擬服務響應進行的SQSState
狀態。aws stepfunctions start-execution \ --endpoint http://localhost:8083 \ --name executionWithHappyPathMockedServices \ --state-machine arn:aws:states:us-east-1:123456789012:stateMachine:LambdaSQSIntegration#HappyPath
檢視狀態機器執行回應。
StartExecution
使用模擬服務集成測試調用的響應與StartExecution
正常調用的響應相同,該響應返回執行 ARN 和開始日期。以下是
StartExecution
使用模擬服務整合測試呼叫的範例回應:{ "startDate":"2022-01-28T15:03:16.981000-05:00", "executionArn":"arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices" }
透過進行
ListExecutions
、DescribeExecution
或GetExecutionHistory
API 呼叫來檢查執行結果。aws stepfunctions get-execution-history \ --endpoint http://localhost:8083 \ --execution-arn arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices
下列範例會示範
GetExecutionHistory
使用步驟 2 所示範例回應的執行 ARN 呼叫的部分回應。在此範例中,LambdaState
和的輸出SQSState
是在 mock 組態檔案中MockedLambdaSuccess定義的模擬資料。MockedSQSSuccess
此外,模擬資料的使用方式與使用實際服務整合呼叫所傳回的資料相同。此外,在這個例子中,從LambdaState
的輸出SQSState
作為輸入傳遞到。{ "events": [ ... { "timestamp": "2021-12-02T19:39:48.988000+00:00", "type": "TaskStateEntered", "id": 2, "previousEventId": 0, "stateEnteredEventDetails": { "name": "LambdaState", "input": "{}", "inputDetails": { "truncated": false } } }, ... { "timestamp": "2021-11-25T23:39:10.587000+00:00", "type": "LambdaFunctionSucceeded", "id": 5, "previousEventId": 4, "lambdaFunctionSucceededEventDetails": { "output": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}", "outputDetails": { "truncated": false } } }, ... "timestamp": "2021-12-02T19:39:49.464000+00:00", "type": "TaskStateEntered", "id": 7, "previousEventId": 6, "stateEnteredEventDetails": { "name": "SQSState", "input": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda!\\\"\"}", "inputDetails": { "truncated": false } } }, ... { "timestamp": "2021-11-25T23:39:10.652000+00:00", "type": "TaskSucceeded", "id": 10, "previousEventId": 9, "taskSucceededEventDetails": { "resourceType": "sqs", "resource": "sendMessage", "output": "{\"MD5OfMessageBody\":\"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51\",\"MessageId\":\"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51\"}", "outputDetails": { "truncated": false } } }, ... ] }