Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Step Functions Local n'est pas pris en charge
Step Functions Local n'assure pas la parité des fonctionnalités et n'est pas pris en charge.
Vous pouvez envisager des solutions tierces qui émulent Step Functions à des fins de test.
Dans Step Functions Local, vous pouvez tester les chemins d'exécution de vos machines d'état sans réellement appeler de services intégrés en utilisant des intégrations de services simulées. Pour configurer vos machines d'état afin d'utiliser des intégrations de services simulées, vous devez créer un fichier de configuration fictif. Dans ce fichier, vous définissez le résultat souhaité de vos intégrations de services sous forme de réponses simulées et les exécutions qui utilisent vos réponses simulées pour simuler un chemin d'exécution sous forme de cas de test.
En fournissant le fichier de configuration fictif à Step Functions Local, vous pouvez tester les appels d'intégration de services en exécutant des machines d'état qui utilisent les réponses simulées spécifiées dans les scénarios de test au lieu de passer de véritables appels d'intégration de services.
Note
Si vous ne spécifiez pas de réponses d'intégration de service simulées dans le fichier de configuration fictif, Step Functions Local invoquera l'intégration de AWS services en utilisant le point de terminaison que vous avez configuré lors de la configuration de Step Functions Local. Pour plus d'informations sur la configuration des points de terminaison pour Step Functions Local, consultezConfiguration des options de configuration pour Step Functions Local.
Cette rubrique utilise plusieurs concepts définis dans la liste suivante :
Intégrations de services simulées - Fait référence aux états des tâches configurés pour utiliser des réponses simulées au lieu d'effectuer de véritables appels de service.
Réponses simulées - Fait référence à des données fictives que les états des tâches peuvent être configurés pour utiliser.
Cas de test : fait référence aux exécutions automatiques configurées pour utiliser des intégrations de services simulées.
Fichier de configuration fictif - Fait référence au fichier de configuration fictif contenant du JSON, qui définit les intégrations de services simulées, les réponses simulées et les cas de test.
Configuration d'intégrations de services simulées
Vous pouvez simuler n'importe quelle intégration de service à l'aide de Step Functions Local. Cependant, Step Functions Local n'impose pas que les maquettes soient identiques aux vraies APIs. Une tâche simulée n'appellera jamais le point de terminaison du service. Si vous ne spécifiez pas de réponse simulée, une tâche tentera d'appeler les points de terminaison du service. De plus, Step Functions Local génère automatiquement un jeton de tâche lorsque vous simulez une tâche à l'aide du.waitForTaskToken
.
Étape 1 : Spécifier les intégrations de services simulées dans un fichier de configuration fictif
Vous pouvez tester le AWS SDK Step Functions et les intégrations de services optimisées à l'aide de Step Functions Local. L'image suivante montre la machine à états définie dans l'onglet Définition de la machine à états :

Pour ce faire, vous devez créer un fichier de configuration fictif contenant les sections définies dansStructure de fichier de configuration fictive.
-
Créez un fichier nommé
MockConfigFile.json
pour configurer les tests avec des intégrations de services simulées.L'exemple suivant montre un fichier de configuration fictif faisant référence à une machine à états avec deux états définis nommés
LambdaState
etSQSState
.Voici un exemple de fichier de configuration fictif qui montre comment simuler des réponses suite à l'appel d'une fonction Lambda et à l'envoi d'un message à Amazon SQS. Dans cet exemple, la machine à LambdaSQSIntegrationétats contient trois cas de test nommés
HappyPath
RetryPath
, etHybridPath
qui simulent lesTask
états nommésLambdaState
etSQSState
. Ces états utilisent les réponses deMockedLambdaSuccess
serviceMockedSQSSuccess
simulées et lesMockedLambdaRetry
réponses de service simulées. Ces réponses de service simulées sont définies dans laMockedResponses
section du fichier.{ "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!" } } } } } }
Vous pouvez exécuter la définition de machine à
LambdaSQSIntegration
états référencée dans le fichier de configuration fictif en utilisant l'un des cas de test suivants :-
HappyPath
- Ce test simule la sortie deLambdaState
et l'SQSState
utilisation deMockedLambdaSuccess
etMockedSQSSuccess
respectivement.-
Le
LambdaState
renverra la valeur suivante :"0":{ "Return":{ "StatusCode":200, "Payload":{ "StatusCode":200, "body":"Hello from Lambda!" } } }
-
Le
SQSState
renverra la valeur suivante :"0":{ "Return":{ "MD5OfMessageBody":"3bcb6e8e-7h85-4375-b0bc-1a59812c6e51", "MessageId":"3bcb6e8e-8b51-4375-b0bc-1a59812c6e51" } }
-
-
RetryPath
- Ce test simule la sortie deLambdaState
et l'SQSState
utilisation deMockedLambdaRetry
etMockedSQSSuccess
respectivement. En outre,LambdaState
est configuré pour effectuer quatre tentatives de nouvelle tentative. Les réponses simulées pour ces tentatives sont définies et indexées dans l'MockedLambdaRetry
état.-
La tentative initiale se termine par un échec de tâche contenant un message de cause et d'erreur, comme illustré dans l'exemple suivant :
"0":{ "Throw": { "Error": "Lambda.ResourceNotReadyException", "Cause": "Lambda resource is not ready." } }
-
La première et la deuxième tentative se terminent par un échec de tâche contenant un message de cause et d'erreur, comme illustré dans l'exemple suivant :
"1-2":{ "Throw": { "Error": "Lambda.TimeoutException", "Cause": "Lambda timed out." } }
-
La troisième tentative se termine par une tâche réussie contenant le résultat d'état de la section Payload dans la réponse Lambda simulée.
"3":{ "Return": { "StatusCode": 200, "Payload": { "StatusCode": 200, "body": "Hello from Lambda!" } } }
Note
Pour les États dotés d'une politique de nouvelles tentatives, Step Functions Local épuisera le nombre de tentatives définies dans la politique jusqu'à ce qu'il reçoive une réponse positive. Cela signifie que vous devez indiquer les simulations pour les tentatives avec des numéros de tentatives consécutifs et que vous devez couvrir toutes les tentatives avant de renvoyer une réponse positive.
Si vous ne spécifiez pas de réponse simulée pour une nouvelle tentative spécifique, par exemple, réessayez « 3 », l'exécution de la machine à états échouera.
-
-
HybridPath
- Ce test simule le résultat de.LambdaState
Une fois l'LambdaState
exécution réussie et la réception de données simulées en réponse,SQSState
effectue un véritable appel de service à la ressource spécifiée en production.
Pour plus d'informations sur la façon de démarrer des exécutions de tests avec des intégrations de services simulées, consultez. Étape 3 : Exécuter des tests d'intégration de services simulés
Assurez-vous que la structure des réponses simulées est conforme à la structure des réponses de service réelles que vous recevez lorsque vous passez des appels de service intégrés. Pour plus d'informations sur les exigences structurelles applicables aux réponses simulées, consultezConfiguration d'intégrations de services simulées.
Dans l'exemple de fichier de configuration fictif précédent, les réponses simulées sont définies
MockedLambdaSuccess
etMockedLambdaRetry
conformes à la structure des réponses réelles renvoyées par un appelHelloFromLambda
.Important
AWS la structure des réponses aux services peut varier d'un service à l'autre. Step Functions Local ne vérifie pas si les structures de réponse simulées sont conformes aux structures de réponse de service réelles. Vous devez vous assurer que vos réponses simulées sont conformes aux réponses réelles avant le test. Pour examiner la structure des réponses du service, vous pouvez soit effectuer les appels de service proprement dits à l'aide de Step Functions, soit consulter la documentation relative à ces services.
Étape 2 : Fournir le fichier de configuration fictif à Step Functions Local
Vous pouvez fournir le fichier de configuration fictif à Step Functions Local de l'une des manières suivantes :
Note
Si vous utilisez la version Docker de Step Functions Local, vous pouvez fournir le fichier de configuration fictif en utilisant uniquement une variable d'environnement. En outre, vous devez monter le fichier de configuration fictif sur le conteneur Step Functions Local lors du démarrage initial du serveur.
Montez le fichier de configuration fictif dans n'importe quel répertoire du conteneur Step Functions Local. Définissez ensuite une variable d'environnement nommée SFN_MOCK_CONFIG
qui contient le chemin d'accès au fichier de configuration fictif dans le conteneur. Cette méthode permet au fichier de configuration fictif de porter n'importe quel nom tant que la variable d'environnement contient le chemin et le nom du fichier.
La commande suivante indique le format de démarrage de l'image Docker.
docker run -p 8083:8083
--mount type=bind,readonly,source={absolute path to mock config file},destination=/home/StepFunctionsLocal/MockConfigFile.json
-e SFN_MOCK_CONFIG="/home/StepFunctionsLocal/MockConfigFile.json" amazon/aws-stepfunctions-local
L'exemple suivant utilise la commande pour démarrer l'image Docker.
docker run -p 8083:8083
--mount type=bind,readonly,source=/Users/admin/Desktop/workplace/MockConfigFile.json,destination=/home/StepFunctionsLocal/MockConfigFile.json
-e SFN_MOCK_CONFIG="/home/StepFunctionsLocal/MockConfigFile.json" amazon/aws-stepfunctions-local
Étape 3 : Exécuter des tests d'intégration de services simulés
Après avoir créé et fourni un fichier de configuration fictif à Step Functions Local, exécutez la machine d'état configurée dans le fichier de configuration fictif à l'aide d'intégrations de services simulées. Vérifiez ensuite les résultats de l'exécution à l'aide d'une action d'API.
-
Créez une machine à états basée sur la définition mentionnée précédemment dans le fichier de configuration fictif.
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"
-
Exécutez la machine d'état à l'aide d'intégrations de services simulées.
Pour utiliser le fichier de configuration fictif, effectuez un appel d'
StartExecution
API sur une machine d'état configurée dans le fichier de configuration fictif. Pour ce faire, ajoutez le suffixe#
, à l'ARN de la machine à états utilisé par.test_name
StartExecution
est un cas de test configuré pour la machine d'état dans le même fichier de configuration fictif.test_name
La commande suivante est un exemple d'utilisation de la machine à
LambdaSQSIntegration
états et de la configuration fictive. Dans cet exemple, la machine àLambdaSQSIntegration
états est exécutée à l'aide duHappyPath
test défini dansÉtape 1 : Spécifier les intégrations de services simulées dans un fichier de configuration fictif. LeHappyPath
test contient la configuration pour l'exécution afin de gérer les appels d'intégration de services fictifs queSQSState
les ÉtatsLambdaState
et les États effectuent à l'aideMockedLambdaSuccess
des réponsesMockedSQSSuccess
de service simulées.aws stepfunctions start-execution \ --endpoint http://localhost:8083 \ --name executionWithHappyPathMockedServices \ --state-machine arn:aws:states:us-east-1:123456789012:stateMachine:LambdaSQSIntegration#HappyPath
Consultez la réponse d'exécution de la machine à états.
La réponse à un appel
StartExecution
utilisant un test d'intégration de service simulé est identique à la réponse à un appelStartExecution
normal, qui renvoie l'ARN d'exécution et la date de début.Voici un exemple de réponse à un appel
StartExecution
utilisant le test d'intégration de services simulé :{ "startDate":"2022-01-28T15:03:16.981000-05:00", "executionArn":"arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices" }
Vérifiez les résultats de l'exécution en effectuant un appel
ListExecutions
DescribeExecution
, ouGetExecutionHistory
API.aws stepfunctions get-execution-history \ --endpoint http://localhost:8083 \ --execution-arn arn:aws:states:us-east-1:123456789012:execution:LambdaSQSIntegration:executionWithHappyPathMockedServices
L'exemple suivant illustre certaines parties d'une réponse à un appel
GetExecutionHistory
utilisant l'ARN d'exécution à partir de l'exemple de réponse présenté à l'étape 2. Dans cet exemple, la sortie deLambdaState
etSQSState
correspond aux données fictives définies dansMockedLambdaSuccess
etMockedSQSSuccess
dans le fichier de configuration fictif. En outre, les données simulées sont utilisées de la même manière que les données renvoyées lors de l'exécution d'appels d'intégration de services réels. De plus, dans cet exemple, la sortie deLambdaState
est transmiseSQSState
en tant qu'entrée.{ "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 } } }, ... ] }
Fichier de configuration pour les intégrations de services simulées dans Step Functions
Step Functions Local n'est pas pris en charge
Step Functions Local n'assure pas la parité des fonctionnalités et n'est pas pris en charge.
Vous pouvez envisager des solutions tierces qui émulent Step Functions à des fins de test.
Pour utiliser des intégrations de services simulées, vous devez d'abord créer un fichier de configuration fictif nommé MockConfigFile.json
contenant vos configurations fictives. Fournissez ensuite à Step Functions Local le fichier de configuration fictif. Ce fichier de configuration définit les cas de test, qui contiennent des états fictifs utilisant des réponses d'intégration de services simulées. La section suivante contient des informations sur la structure de la configuration fictive qui inclut les états fictifs et les réponses simulées :
Structure de fichier de configuration fictive
Une configuration fictive est un objet JSON contenant les champs de niveau supérieur suivants :
-
StateMachines
- Les champs de cet objet représentent des machines à états configurées pour utiliser des intégrations de services simulées. -
MockedResponse
- Les champs de cet objet représentent des réponses simulées pour les appels d'intégration de services.
Voici un exemple de fichier de configuration fictif qui inclut une StateMachine
définition etMockedResponse
.
{
"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!"
}
}
}
}
}
}
Référence de champ de configuration fictive
Les sections suivantes expliquent les champs d'objet de niveau supérieur que vous devez définir dans votre configuration fictive.
StateMachines
L'StateMachines
objet définit les machines à états qui utiliseront des intégrations de services simulées. La configuration de chaque machine à états est représentée par un champ de niveau supérieur deStateMachines
. Le nom du champ est le nom de la machine à états et la valeur est un objet contenant un seul champ nomméTestCases
, dont les champs représentent des cas de test de cette machine à états.
La syntaxe suivante montre une machine à états avec deux scénarios de test :
"MyStateMachine": {
"TestCases": {
"HappyPath": {
...
},
"SadPath": {
...
}
}
TestCases
Les champs de TestCases
représentent des cas de test individuels pour la machine à états. Le nom de chaque cas de test doit être unique par machine d'état et la valeur de chaque cas de test est un objet spécifiant une réponse simulée à utiliser pour les états de tâche dans la machine d'état.
L'exemple de a suivant TestCase
lie deux Task
états à deux MockedResponses
:
"HappyPath": {
"SomeTaskState": "SomeMockedResponse",
"AnotherTaskState": "AnotherMockedResponse"
}
MockedResponses
MockedResponses
est un objet contenant plusieurs objets de réponse simulés avec des noms de champs uniques. Un objet de réponse simulé définit le résultat réussi ou la sortie d'erreur pour chaque appel d'un état de tâche simulé. Vous spécifiez le numéro d'appel à l'aide de chaînes entières individuelles, telles que « 0 », « 1 », « 2 » et « 3 » ou d'une plage inclusive d'entiers, telle que « 0-1 », « 2-3 ».
Lorsque vous simulez une tâche, vous devez spécifier une réponse simulée pour chaque appel. Une réponse doit contenir un seul champ nommé Return
ou Throw
dont la valeur est le résultat ou la sortie d'erreur de l'invocation de tâche simulée. Si vous ne spécifiez pas de réponse simulée, l'exécution de la machine à états échouera.
Voici un exemple de MockedResponse
with Throw
et d'Return
objets. Dans cet exemple, les trois premières fois que la machine d'état est exécutée, la réponse spécifiée dans "0-2"
est renvoyée, et la quatrième fois que la machine d'état s'exécute, la réponse spécifiée dans "3"
est renvoyée.
"SomeMockedResponse": {
"0-2": {
"Throw": {
...
}
},
"3": {
"Return": {
...
}
}
}
Note
Si vous utilisez un Map
état et que vous souhaitez garantir des réponses prévisibles pour Map
cet état, définissez la valeur maxConcurrency
de 1. Si vous définissez une valeur supérieure à 1, Step Functions Local exécutera plusieurs itérations simultanément, ce qui rendra imprévisible l'ordre d'exécution global des états entre les itérations. Cela peut également amener Step Functions Local à utiliser différentes réponses simulées pour les états d'itération d'une exécution à l'autre.
Return
Return
est représenté sous la forme d'un champ d'MockedResponse
objets. Il indique le résultat positif d'un état de tâche simulé.
Voici un exemple d'Return
objet contenant une réponse simulée pour l'appel d'une Invoke
fonction Lambda :
"Return": {
"StatusCode": 200,
"Payload": {
"StatusCode": 200,
"body": "Hello from Lambda!"
}
}
Jeter
Throw
est représenté sous la forme d'un champ d'MockedResponse
objets. Il indique le résultat d'erreur d'une tâche ayant échoué. La valeur de Throw
doit être un objet contenant des Cause
champs Error
et avec des valeurs de chaîne. En outre, la valeur de chaîne que vous spécifiez dans le Error
champ MockConfigFile.json
doit correspondre aux erreurs gérées dans les Catch
sections Retry
et de votre machine à états.
Voici un exemple d'Throw
objet contenant une réponse simulée pour l'appel d'une Invoke
fonction Lambda :
"Throw": {
"Error": "Lambda.TimeoutException",
"Cause": "Lambda timed out."
}