模拟服务集成的配置文件 - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

模拟服务集成的配置文件

要使用模拟服务集成,必须先创建一个名为 MockConfigFile.json 的模拟配置文件,其中包含您的模拟配置。然后将模拟配置文件提供给 Step Functions Local。此配置文件定义了测试用例,其中包含使用模拟服务集成响应的模拟状态。下一节将介绍包含模拟状态和模拟响应的模拟配置结构:

模拟配置结构简介

模拟配置是一个 JSON 对象,包含以下顶级字段:

  • StateMachines - 该对象的字段表示配置为使用模拟服务集成的状态机。

  • MockedResponse - 该对象的字段表示服务集成调用的模拟响应。

以下是一个模拟配置文件示例,其中包含 StateMachine 定义和 MockedResponse

{ "StateMachines":{ "LambdaSQSIntegration":{ "TestCases":{ "HappyPath":{ "LambdaState":"MockedLambdaSuccess", "SQSState":"MockedSQSSuccess" }, "RetryPath":{ "LambdaState":"MockedLambdaRetry", "SQSState":"MockedSQSSuccess" }, "HybridPath":{ "LambdaState":"MockedLambdaSuccess" } } } }, "MockedResponses":{ "MockedLambdaSuccess":{ "0":{ "Return":{ "StatusCode":200, "Payload":{ "StatusCode":200, "body":"Hello from Lambda!" } } } }, "LambdaMockedResourceNotReady":{ "0":{ "Throw":{ "Error":"Lambda.ResourceNotReadyException", "Cause":"Lambda resource is not ready." } } }, "MockedSQSSuccess":{ "0":{ "Return":{ "MD5OfMessageBody":"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51", "MessageId":"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51" } } }, "MockedLambdaRetry":{ "0":{ "Throw":{ "Error":"Lambda.ResourceNotReadyException", "Cause":"Lambda resource is not ready." } }, "1-2":{ "Throw":{ "Error":"Lambda.TimeoutException", "Cause":"Lambda timed out." } }, "3":{ "Return":{ "StatusCode":200, "Payload":{ "StatusCode":200, "body":"Hello from Lambda!" } } } } } }

模拟配置字段参考

以下部分将说明必须在模拟配置中定义的顶层对象字段。

StateMachines

StateMachines 对象定义哪些状态机将使用模拟服务集成。每个状态机的配置都用 StateMachines 的顶级字段表示。字段名称是状态机的名称,值是包含名为 TestCases 的单个字段的对象,其字段代表该状态机的测试用例。

以下语法显示了带有两个测试用例的状态机:

"MyStateMachine": { "TestCases": { "HappyPath": { ... }, "SadPath": { ... } }
测试用例

TestCases 字段表示状态机的各个测试用例。每个状态机的测试用例名称必须是唯一的,每个测试用例的值都是一个对象,指定了状态机中 Task 状态使用的模拟响应。

以下 TestCase 示例将两个 Task 状态与两个 MockedResponses 联系起来:

"HappyPath": { "SomeTaskState": "SomeMockedResponse", "AnotherTaskState": "AnotherMockedResponse" }

MockedRespons

MockedResponses 是一个对象,包含多个具有唯一字段名称的模拟响应对象。模拟响应对象定义了每次调用模拟 Task 状态时的成功结果或错误输出。您可以使用单个整数字符串(例如 “0”、“1”、“2” 和 “3”)或包含整数的范围(例如 “0-1”、“2-3”)来指定调用次数。

模拟 Task 时,必须为每次调用指定一个模拟响应。响应必须包含一个名为 ReturnThrow 的单个字段,其值为模拟 Task 调用的结果或错误输出。如果未指定模拟响应,则状态机执行将失败。

下面是一个包含 ThrowReturn 对象的 MockedResponse 示例。在此示例中,状态机运行的前三次返回 "0-2" 中指定的响应,状态机运行的第四次返回 "3" 中指定的响应。

"SomeMockedResponse": { "0-2": { "Throw": { ... } }, "3": { "Return": { ... } } }
注意

如果使用的是 Map 状态,并且希望确保 Map 状态的响应具有可预测性,请将 maxConcurrency 的值设置为 1。如果您设置的值大于 1,Step Functions Local 将同时运行多次迭代,这将导致各迭代状态的整体执行顺序不可预测。这可能会进一步导致 Step Functions Local 在每次执行时对迭代状态使用不同的模拟响应。

Return

Return 表示为 MockedResponse 对象的一个字段。它指定了模拟 Task 状态的成功结果。

下面是一个 Return 对象的示例,其中包含在 Lambda 函数上调用 Invoke 时的模拟响应:

"Return": { "StatusCode": 200, "Payload": { "StatusCode": 200, "body": "Hello from Lambda!" } }
Throw

Throw 表示为 MockedResponse 对象的一个字段。它指定失败 Task 的错误输出Throw 的值必须是一个对象,其中包含带有字符串值的 ErrorCause 字段。此外,您在 MockConfigFile.json 中指定的 Error 字段的字符串值必须与状态机的 RetryCatch 部分处理的错误相匹配。

下面是一个 Throw 对象的示例,其中包含在 Lambda 函数上调用 Invoke 时的模拟响应:

"Throw": { "Error": "Lambda.TimeoutException", "Cause": "Lambda timed out." }

配置模拟服务集成

您可以使用 Step Functions Local 来模拟任何服务集成。但是,Step Functions Local 并不强制要求模拟与真实 API 相同。模拟 Task 永远不会调用服务端点。如果您未指定模拟响应,则 Task 将尝试调用服务端点。此外,使用 .waitForTaskToken 模拟 Task 时,Step Functions Local 将自动生成任务令牌。