|
|
Hoy, me complace anunciar capacidades de prueba locales mejoradas para AWS Step Functions a través de la API TestState, nuestra API de prueba.
Estas mejoras están disponibles a través de la API, por lo que puede crear conjuntos de pruebas automatizadas que validen sus definiciones de flujo de trabajo localmente en sus máquinas de desarrollo, prueben patrones de manejo de errores, transformaciones de datos e integraciones de servicios simuladas utilizando sus marcos de prueba preferidos. Este lanzamiento presenta un enfoque basado en API para pruebas de unidades locales, que brinda acceso programático a capacidades de prueba integrales sin implementar en Amazon Web Services (AWS).
Hay tres capacidades clave introducidas en esta API TestState mejorada:
-
Apoyo burlón – Simulacros de salidas de estado y errores sin invocar servicios posteriores, lo que permite realizar pruebas unitarias reales de la lógica de la máquina de estados. TestState valida respuestas simuladas contra modelos API de AWS con tres modos de validación: ESTRICTO (este es el valor predeterminado y valida todos los campos obligatorios), PRESENTE (valida los tipos y nombres de campos) y NINGUNO (sin validación), lo que proporciona pruebas de alta fidelidad.
-
Soporte para todo tipo de estados. – Ahora se pueden probar todos los tipos de estado, incluidos estados avanzados como estados de mapa (en línea y distribuidos), estados paralelos, estados de tareas basados en actividades, patrones de integración de servicios .sync y patrones de integración de servicios .waitForTaskToken. Esto significa que puede utilizar la API TestState en toda la definición de su flujo de trabajo y escribir pruebas unitarias para verificar la lógica del flujo de control, incluidas las transiciones de estado, el manejo de errores y las transformaciones de datos.
-
Prueba de estados individuales – Pruebe estados específicos dentro de una definición de máquina de estados completa utilizando el nuevo parámetro stateName. Puede proporcionar la definición completa de la máquina de estados una vez y probar cada estado individualmente por su nombre. Puede controlar el contexto de ejecución para probar reintentos específicos, posiciones de iteración del mapa y escenarios de error.
Comenzando con TestState mejorado
Permítame explicarle estas nuevas capacidades en TestState mejorado.
Escenario 1: simulacros de resultados exitosos
La primera capacidad es el soporte simulado, que puede utilizar para probar la lógica de su flujo de trabajo sin invocar servicios reales de AWS o incluso solicitudes HTTP externas. Puede simular las respuestas del servicio para realizar pruebas unitarias rápidas o realizar pruebas con servicios reales de AWS para realizar pruebas de integración. Al utilizar respuestas simuladas, no necesita permisos de AWS Identity and Access Management (IAM).
A continuación se explica cómo simular una respuesta exitosa de la función AWS Lambda:
aws stepfunctions test-state --region us-east-1 \
--definition '{
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {"FunctionName": "process-order"},
"End": true
}' \
--mock '{"result":"{\"orderId\":\"12345\",\"status\":\"processed\"}"}' \
--inspection-level DEBUG
Este comando prueba un estado de invocación de Lambda sin llamar realmente a la función. TestState valida su respuesta simulada con el modelo API del servicio Lambda para que sus datos de prueba coincidan con lo que devolvería el servicio real.
La respuesta muestra la ejecución exitosa con datos de inspección detallados (cuando se usa el nivel de inspección DEBUG):
{
"output": "{\"orderId\":\"12345\",\"status\":\"processed\"}",
"inspectionData": {
"input": "{}",
"afterInputPath": "{}",
"afterParameters": "{\"FunctionName\":\"process-order\"}",
"result": "{\"orderId\":\"12345\",\"status\":\"processed\"}",
"afterResultSelector": "{\"orderId\":\"12345\",\"status\":\"processed\"}",
"afterResultPath": "{\"orderId\":\"12345\",\"status\":\"processed\"}"
},
"status": "SUCCEEDED"
}
Cuando especifica una respuesta simulada, TestState la valida con el modelo API del servicio de AWS para que los datos simulados se ajusten al esquema esperado, manteniendo pruebas de alta fidelidad sin requerir llamadas reales al servicio de AWS.
Escenario 2: condiciones de error simuladas
También puedes simular condiciones de error para probar tu lógica de manejo de errores:
aws stepfunctions test-state --region us-east-1 \
--definition '{
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {"FunctionName": "process-order"},
"End": true
}' \
--mock '{"errorOutput":{"error":"Lambda.ServiceException","cause":"Function failed"}}' \
--inspection-level DEBUG
Esto simula una excepción del servicio Lambda para que pueda verificar cómo su máquina de estado maneja las fallas sin desencadenar errores reales en su entorno de AWS.
La respuesta muestra la ejecución fallida con detalles del error:
{
"error": "Lambda.ServiceException",
"cause": "Function failed",
"inspectionData": {
"input": "{}",
"afterInputPath": "{}",
"afterParameters": "{\"FunctionName\":\"process-order\"}"
},
"status": "FAILED"
}
Escenario 3: estados del mapa de prueba
La segunda capacidad agrega soporte para tipos de estado que antes no eran compatibles. A continuación se explica cómo probar el estado de un mapa distribuido:
aws stepfunctions test-state --region us-east-1 \
--definition '{
"Type": "Map",
"ItemProcessor": {
"ProcessorConfig": {"Mode": "DISTRIBUTED", "ExecutionType": "STANDARD"},
"StartAt": "ProcessItem",
"States": {
"ProcessItem": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {"FunctionName": "process-item"},
"End": true
}
}
},
"End": true
}' \
--input '[{"itemId":1},{"itemId":2}]' \
--mock '{"result":"[{\"itemId\":1,\"status\":\"processed\"},{\"itemId\":2,\"status\":\"processed\"}]"}' \
--inspection-level DEBUG
El resultado simulado representa el resultado completo del procesamiento de varios elementos. En este caso, la matriz simulada debe coincidir con el formato de salida del estado del mapa esperado.
La respuesta muestra un procesamiento exitoso de la entrada de la matriz:
{
"output": "[{\"itemId\":1,\"status\":\"processed\"},{\"itemId\":2,\"status\":\"processed\"}]",
"inspectionData": {
"input": "[{\"itemId\":1},{\"itemId\":2}]",
"afterInputPath": "[{\"itemId\":1},{\"itemId\":2}]",
"afterResultSelector": "[{\"itemId\":1,\"status\":\"processed\"},{\"itemId\":2,\"status\":\"processed\"}]",
"afterResultPath": "[{\"itemId\":1,\"status\":\"processed\"},{\"itemId\":2,\"status\":\"processed\"}]"
},
"status": "SUCCEEDED"
}
Escenario 4: Prueba de estados paralelos
De manera similar, puedes probar estados paralelos que ejecutan múltiples ramas simultáneamente:
aws stepfunctions test-state --region us-east-1 \
--definition '{
"Type": "Parallel",
"Branches": [
{"StartAt": "Branch1", "States": {"Branch1": {"Type": "Pass", "End": true}}},
{"StartAt": "Branch2", "States": {"Branch2": {"Type": "Pass", "End": true}}}
],
"End": true
}' \
--mock '{"result":"[{\"branch1\":\"data1\"},{\"branch2\":\"data2\"}]"}' \
--inspection-level DEBUG
El resultado simulado debe ser una matriz con un elemento por rama. Al utilizar TestState, su estructura de datos simulada coincide con lo que produciría una ejecución en estado paralelo real.
La respuesta muestra los resultados de la ejecución paralela:
{
"output": "[{\"branch1\":\"data1\"},{\"branch2\":\"data2\"}]",
"inspectionData": {
"input": "{}",
"afterResultSelector": "[{\"branch1\":\"data1\"},{\"branch2\":\"data2\"}]",
"afterResultPath": "[{\"branch1\":\"data1\"},{\"branch2\":\"data2\"}]"
},
"status": "SUCCEEDED"
}
Escenario 5: probar estados individuales dentro de flujos de trabajo completos
Puede probar estados específicos dentro de una definición de máquina de estados completa utilizando el parámetro stateName. A continuación se muestra un ejemplo que prueba un solo estado, aunque normalmente proporcionaría su definición de flujo de trabajo completa y especificaría qué estado probar:
aws stepfunctions test-state --region us-east-1 \
--definition '{
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"Parameters": {"FunctionName": "validate-order"},
"End": true
}' \
--input '{"orderId":"12345","amount":99.99}' \
--mock '{"result":"{\"orderId\":\"12345\",\"validated\":true}"}' \
--inspection-level DEBUG
Esto prueba un estado de invocación de Lambda con datos de entrada específicos, mostrando cómo TestState procesa la entrada y la transforma a través de la ejecución del estado.
La respuesta muestra el procesamiento y la validación detallados de la entrada:
{
"output": "{\"orderId\":\"12345\",\"validated\":true}",
"inspectionData": {
"input": "{\"orderId\":\"12345\",\"amount\":99.99}",
"afterInputPath": "{\"orderId\":\"12345\",\"amount\":99.99}",
"afterParameters": "{\"FunctionName\":\"validate-order\"}",
"result": "{\"orderId\":\"12345\",\"validated\":true}",
"afterResultSelector": "{\"orderId\":\"12345\",\"validated\":true}",
"afterResultPath": "{\"orderId\":\"12345\",\"validated\":true}"
},
"status": "SUCCEEDED"
}
Estas mejoras aportan la experiencia familiar de desarrollo local a los flujos de trabajo de Step Functions, lo que me ayuda a obtener comentarios instantáneos sobre los cambios antes de implementarlos en mi cuenta de AWS. Puedo escribir conjuntos de pruebas automatizadas para validar todas las funciones de Step Functions con la misma confiabilidad que la ejecución en la nube, lo que brinda confianza de que mis flujos de trabajo funcionarán como se espera cuando se implementen.
Cosas que debes saber
Aquí hay puntos clave a tener en cuenta:
- Disponibilidad – Las capacidades de TestState mejoradas están disponibles en todas las regiones de AWS donde se admite Step Functions.
- Precios – Las llamadas a la API TestState se incluyen con AWS Step Functions sin cargo adicional.
- Compatibilidad del marco – TestState funciona con cualquier marco de prueba que pueda realizar solicitudes HTTP, incluidos Jest, pytest, JUnit y otros. Puede escribir conjuntos de pruebas que validen sus flujos de trabajo automáticamente en su proceso de integración y entrega continuas (CI/CD) antes de la implementación.
- Soporte de funciones – TestState mejorado admite todas las funciones de Step Functions, incluido el mapa distribuido, los estados paralelos, el manejo de errores y las expresiones JSONata.
- Documentación – Para obtener opciones detalladas para diferentes configuraciones, consulte la documentación de TestState y la referencia de API para obtener el modelo de solicitud y respuesta actualizado.
Comience hoy con pruebas locales mejoradas integrando TestState en su flujo de trabajo de desarrollo.
¡Feliz edificio!
— donnie

