AWS IoT Greengrass Version 1 entró en la fase de vida útil prolongada el 30 de junio de 2023. Para obtener más información, consulte la política de mantenimiento de AWS IoT Greengrass V1 Después de esta fecha, AWS IoT Greengrass V1 no se publicarán actualizaciones que proporcionen funciones, mejoras, correcciones de errores o parches de seguridad. Los dispositivos que se ejecuten AWS IoT Greengrass V1 no se verán afectados y seguirán funcionando y conectándose a la nube. Le recomendamos encarecidamente que migre a AWS IoT Greengrass Version 2, ya que añade importantes funciones nuevas y es compatible con plataformas adicionales.
Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Configure la máquina de estados IDT
Una máquina de estados es un constructo que controla el flujo de ejecución del conjunto de pruebas. Determina el estado inicial de un conjunto de pruebas, gestiona las transiciones de estado en función de las reglas definidas por el usuario y continúa pasando por esos estados hasta alcanzar el estado final.
Si su conjunto de pruebas no incluye una máquina de estados definida por el usuario, IDT generará una máquina de estados para usted. La máquina de estados predeterminada realiza las siguientes funciones:
-
Ofrece a los ejecutores de pruebas la posibilidad de seleccionar y ejecutar grupos de pruebas específicos, en lugar de toda el conjunto de pruebas.
-
Si no se seleccionan grupos de pruebas específicos, ejecuta todos los grupos de pruebas del conjunto de pruebas en orden aleatorio.
-
Genera informes e imprime un resumen de la consola que muestra los resultados de las pruebas de cada grupo y caso de prueba.
La máquina de estado de un conjunto de pruebas de IDT debe cumplir los siguientes criterios:
-
Cada estado corresponde a una acción que debe realizar IDT, como ejecutar un grupo de pruebas o crear un archivo de informe.
-
La transición a un estado ejecuta la acción asociada al estado.
-
Cada estado define la regla de transición para el estado siguiente.
-
El estado final debe ser
Succeed
o bienFail
.
Formato de las máquinas de estado
Puede utilizar la siguiente plantilla para configurar su propio archivo
: <custom-test-suite-folder>
/suite/state_machine.json
{ "Comment": "
<description>
", "StartAt": "<state-name>
", "States": { "<state-name>
": { "Type": "<state-type>
", // Additional state configuration } // Required states "Succeed": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Comment
-
Una descripción de la máquina de estado.
StartAt
-
El nombre del estado en el que IDT comienza a ejecutar el conjunto de pruebas. El valor de
StartAt
debe estar establecido en uno de los estados enumerados en el objetoStates
. States
-
Un objeto que asigna los nombres de estado definidos por usuario a estados IDT válidos. Cada estado. El objeto de
nombre de estado
contiene la definición de un estado válido asignado alnombre del estado.
El objeto
States
debe incluir los estadosSucceed
yFail
. Para obtener información sobre los estados válidos, consulte Estados válidos y definiciones de estado.
Estados válidos y definiciones de estado
En esta sección se describen las definiciones de estado de todos los estados válidos que se pueden usar en la máquina de estados de IDT. Algunos de los siguientes estados admiten configuraciones a nivel de caso de prueba. Sin embargo, le recomendamos que configure las reglas de transición de estado a nivel de grupo de prueba en lugar de a nivel del caso de prueba, a menos que sea absolutamente necesario.
Definiciones de estado
RunTask
El estado RunTask
ejecuta casos de prueba a partir de un grupo de pruebas definido en el conjunto de pruebas.
{ "Type": "RunTask", "Next": "
<state-name>
", "TestGroup": "<group-id>
", "TestCases": [ "<test-id>
" ], "ResultVar": "<result-name>
" }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Next
-
El nombre del estado al que se realizará la transición después de ejecutar las acciones en el estado actual.
TestGroup
-
Opcional. El ID del grupo de pruebas que se va a ejecutar. Si no se especifica este valor, IDT ejecuta el grupo de pruebas que seleccione el ejecutor de la prueba.
TestCases
-
Opcional. Un conjunto de identificadores de casos de prueba del grupo especificado en
TestGroup
. En función de los valores deTestGroup
yTestCases
, IDT determina el comportamiento de la ejecución de la prueba de la siguiente manera:-
Cuando se especifican ambos
TestGroup
yTestCases
, IDT ejecuta los casos de prueba especificados del grupo de pruebas. -
Cuando
TestCases
se especifican pero no se especificaTestGroup
, IDT ejecuta los casos de prueba especificados. -
Cuando
TestGroup
se especifica, pero no se especificaTestCases
, IDT ejecuta todos los casos de prueba del grupo de pruebas especificado. -
Si no se especifica ninguno,
TestGroup
oTestCases
, IDT ejecuta todos los casos de prueba del grupo de pruebas que el ejecutor de la prueba selecciona en la CLI de IDT. Para habilitar la selección de grupos para los participantes en las pruebas, debe incluir ambos estadosRunTask
yChoice
en el archivostatemachine.json
. Para ver un ejemplo de cómo funciona, consulte Ejemplo de máquina de estados: ejecutar grupos de prueba seleccionados por el usuario.Para obtener más información sobre cómo habilitar los comandos CLI de IDT para los ejecutores de pruebas, consulte Habilitar comandos CLI de IDT.
-
ResultVar
-
El nombre de la variable de contexto que se va a configurar con los resultados de la prueba. No especifique este valor si no especificó ningún valor para
TestGroup
. IDT establece el valor de la variable que usted define enResultVar
paratrue
ofalse
en función de lo siguiente:-
Si el nombre de la variable tiene el formato
, el valor se establece en función de si todas las pruebas del primer grupo de pruebas se aprobaron o se omitieron.text
_text
_passed -
En todos los demás casos, el valor se establece en función de si todas las pruebas de todos los grupos de pruebas se aprobaron o se omitieron.
-
Normalmente, utilizará el estado RunTask
para especificar un identificador de grupo de pruebas sin especificar los identificadores de casos de prueba individuales, de modo que IDT ejecutará todos los casos de prueba del grupo de pruebas especificado. Todos los casos de prueba ejecutados por este estado se ejecutan en paralelo, en orden aleatorio. Sin embargo, si todos los casos de prueba requieren la ejecución de un dispositivo y solo hay un dispositivo disponible, los casos de prueba se ejecutarán secuencialmente.
Error handling (Control de errores)
Si alguno de los grupos de pruebas especificados o identificadores de casos de prueba no es válido, este estado genera el error de ejecución RunTaskError
. Si el estado encuentra un error de ejecución, también establece la variable hasExecutionError
en el contexto de la máquina de estados en true
.
Opción
El estado Choice
le permite configurar dinámicamente el siguiente estado al que realizar la transición en función de las condiciones definidas por el usuario.
{ "Type": "Choice", "Default": "
<state-name>
", "FallthroughOnError": true | false, "Choices": [ { "Expression": "<expression>
", "Next": "<state-name>
" } ] }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Default
-
El estado predeterminado al que se realizará la transición si no se puede evaluar ninguna de las expresiones definidas en
Choices
paratrue
. FallthroughOnError
-
Opcional. Especifica el comportamiento cuando el estado encuentra un error al evaluar las expresiones. Configúrelo en
true
si desea omitir una expresión si la evaluación produce un error. Si ninguna expresión coincide, la máquina de estados pasa al estadoDefault
. Si no se especifica, el valor deFallthroughOnError
se establece de forma predeterminada enfalse
. Choices
-
Una matriz de expresiones y estados para determinar a qué estado hacer la transición después de ejecutar las acciones en el estado actual.
Choices.Expression
-
Una expresión que debe evaluarse como un valor booleano. Si la expresión se evalúa como
true
, la máquina de estados pasa al estado definido enChoices.Next
. Las cadenas de expresión recuperan los valores del contexto de la máquina de estados y, a continuación, realizan operaciones en ellos para obtener un valor booleano. Para obtener información sobre cómo acceder al contexto de la máquina de estados, consulte Contexto de las máquinas de estados. Choices.Next
-
El nombre del estado al que se realizará la transición si la expresión definida en
Choices.Expression
se evalúa comotrue
.
Error handling (Control de errores)
El estado Choice
puede requerir la gestión de errores en los siguientes casos:
-
Algunas variables de las expresiones de elección no existen en el contexto de la máquina de estados.
-
El resultado de una expresión no es un valor booleano.
-
El resultado de una búsqueda en JSON no es una cadena, un número ni un booleano.
No puede usar un bloque Catch
para gestionar los errores en este estado. Si quiere detener la ejecución de la máquina de estados cuando encuentre un error, debe configurar FallthroughOnError
en false
. Sin embargo, le recomendamos que configure FallthroughOnError
en true
y, en función de su caso de uso, haga una de las siguientes opciones:
-
Si se espera que una variable a la que está accediendo no exista en algunos casos, utilice el valor
Default
y los bloquesChoices
adicionales para especificar el siguiente estado. -
Si una variable a la que está accediendo debe existir siempre, defina el estado
Default
enFail
.
Parallel
El estado Parallel
le permite definir y ejecutar nuevas máquinas de estados en paralelo entre sí.
{ "Type": "Parallel", "Next": "
<state-name>
", "Branches": [<state-machine-definition>
] }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Next
-
El nombre del estado al que se realizará la transición después de ejecutar las acciones en el estado actual.
Branches
-
Un conjunto de definiciones de máquinas de estados para ejecutar. Cada definición de máquina de estados debe contener su propio
StartAt
,Succeed
y estadosFail
. Las definiciones de máquinas de estados de esta matriz no pueden hacer referencia a estados ajenos a su propia definición.nota
Como cada máquina de estado de rama comparte el mismo contexto de máquina de estados, establecer variables en una rama y, a continuación, leer esas variables de otra rama podría provocar un comportamiento inesperado.
El estado Parallel
pasa al siguiente estado solo después de ejecutar todas las máquinas de estado de rama. Cada estado que requiera un dispositivo esperará para ejecutarse hasta que el dispositivo esté disponible. Si hay varios dispositivos disponibles, este estado ejecuta casos de prueba de varios grupos en paralelo. Si no hay suficientes dispositivos disponibles, los casos de prueba se ejecutarán secuencialmente. Como los casos de prueba se ejecutan en orden aleatorio cuando se ejecutan en paralelo, se podrían usar diferentes dispositivos para ejecutar pruebas del mismo grupo de pruebas.
Error handling (Control de errores)
Asegúrese de que tanto la máquina de estado de la rama como la máquina de estados principal pasen al estado Fail
para gestionar los errores de ejecución.
Como las máquinas de estado de rama no transmiten los errores de ejecución a la máquina de estado principal, no puede usar un bloque Catch
para gestionar los errores de ejecución en las máquinas de estado de rama. En su lugar, utilice el valor hasExecutionErrors
en el contexto de la máquina de estado compartida. Para ver un ejemplo de cómo funciona, consulte Ejemplo de máquina de estados: ejecute dos grupos de prueba en paralelo.
AgregueCaracterísticasProducto
El estado AddProductFeatures
le permite añadir características del producto al archivo awsiotdevicetester_report.xml
generado por IDT.
Una característica del producto es información definida por el usuario sobre los criterios específicos que puede cumplir un dispositivo. Por ejemplo, la característica MQTT
del producto puede indicar que el dispositivo publica los mensajes MQTT correctamente. En el informe, las características del producto se establecen como supported
, not-supported
, o como un valor personalizado, en función de si se han superado las pruebas especificadas.
nota
El estado AddProductFeatures
no genera informes por sí mismo. Este estado debe realizar la transición al estado Report para generar informes.
{ "Type": "Parallel", "Next": "
<state-name>
", "Features": [ { "Feature": "<feature-name>
", "Groups": [ "<group-id>
" ], "OneOfGroups": [ "<group-id>
" ], "TestCases": [ "<test-id>
" ], "IsRequired": true | false, "ExecutionMethods": [ "<execution-method>
" ] } ] }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Next
-
El nombre del estado al que se realizará la transición después de ejecutar las acciones en el estado actual.
Features
-
Un conjunto de características del producto para mostrar en el archivo
awsiotdevicetester_report.xml
.Feature
-
El nombre de la característica
FeatureValue
-
Opcional. El valor personalizado que se utilizará en el informe en lugar de
supported
. Si no se especifica este valor, según los resultados de las pruebas, el valor de la característica se establece ensupported
onot-supported
.Si utiliza un valor personalizado para
FeatureValue
, puede probar la misma característica con diferentes condiciones e IDT concatena los valores de la característica para las condiciones admitidas. Por ejemplo, en el siguiente fragmento se muestra la característicaMyFeature
con dos valores de característica distintos:... { "Feature": "MyFeature", "FeatureValue": "first-feature-supported", "Groups": ["first-feature-group"] }, { "Feature": "MyFeature", "FeatureValue": "second-feature-supported", "Groups": ["second-feature-group"] }, ...
Si ambos grupos de pruebas aprueban, el valor de la característica se establece en
first-feature-supported, second-feature-supported
. Groups
-
Opcional. Una matriz de los ID de los grupos de prueba. Para que la característica sea compatible, deben aprobarse todas las pruebas de cada grupo de pruebas especificado.
OneOfGroups
-
Opcional. Una matriz de los ID de los grupos de prueba. Para que la característica sea compatible, deben aprobarse todas las pruebas de al menos uno de los grupos de pruebas especificados.
TestCases
-
Opcional. Una matriz de los ID de los casos de prueba. Si especifica este valor, se aplicará lo siguiente:
-
Se deben aprobar todos los casos de prueba especificados para que la característica sea compatible.
-
Groups
debe contener solo un ID de grupo de prueba. -
OneOfGroups
no debe especificarse.
-
IsRequired
-
Opcional. Configúrelo en
false
para marcar esta característica como una característica opcional en el informe. El valor predeterminado estrue
. ExecutionMethods
-
Opcional. Un conjunto de métodos de ejecución que coinciden con el valor
protocol
especificado en el archivodevice.json
. Si se especifica este valor, los ejecutores de pruebas deben especificar un valorprotocol
que coincida con uno de los valores de esta matriz para incluir la característica en el informe. Si no se especifica este valor, la característica siempre se incluirá en el informe.
Para usar el estado AddProductFeatures
, debe establecer el valor de ResultVar
del estado RunTask
en uno de los siguientes valores:
-
Si especificó los ID de los casos de prueba individuales, configure
ResultVar
en
.group-id_test-id
_passed -
Si no especificó los ID de los casos de prueba individuales, configure
ResultVar
en
.group-id
_passed
El estado AddProductFeatures
comprueba los resultados de las pruebas de la siguiente manera:
-
Si no especificó ningún identificador de caso de prueba, el resultado de cada grupo de prueba se determina a partir del valor de la variable
en el contexto de la máquina de estados.group-id
_passed -
Si especificó los ID de los casos de prueba, el resultado de cada una de las pruebas se determina a partir del valor de la variable
en el contexto de la máquina de estados.group-id_test-id
_passed
Error handling (Control de errores)
Si un identificador de grupo proporcionado en este estado no es un identificador de grupo válido, este estado provoca un error AddProductFeaturesError
de ejecución. Si el estado encuentra un error de ejecución, también establece la variable hasExecutionErrors
en el contexto de la máquina de estados en true
.
Informar
El estado Report
genera los archivos
y suite-name
_Report.xmlawsiotdevicetester_report.xml
. Este estado también transmite el informe a la consola.
{ "Type": "Report", "Next": "
<state-name>
" }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Next
-
El nombre del estado al que se realizará la transición después de ejecutar las acciones en el estado actual.
Siempre debe pasar al estado Report
que se encuentra al final del flujo de ejecución de la prueba para que los ejecutores de la prueba puedan ver los resultados de la prueba. Normalmente, el siguiente estado después de este estado es Succeed
.
Error handling (Control de errores)
Si este estado tiene problemas con la generación de los informes, se produce el error de ejecución ReportError
.
LogMessage
El estado LogMessage
genera el archivo test_manager.log
y transmite el mensaje de registro a la consola.
{ "Type": "LogMessage", "Next": "
<state-name>
" "Level": "info | warn | error" "Message": "<message>
" }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Next
-
El nombre del estado al que se realizará la transición después de ejecutar las acciones en el estado actual.
Level
-
El nivel de error en el que se va a crear el mensaje de registro. Si especifica un nivel que no es válido, este estado genera un mensaje de error y lo descarta.
Message
-
El mensaje para registrar.
SelectGroup
El estado SelectGroup
actualiza el contexto de la máquina de estados para indicar qué grupos están seleccionados. Los valores establecidos por este estado se utilizan en cualquier estado Choice
posterior.
{ "Type": "SelectGroup", "Next": "
<state-name>
" "TestGroups": [<group-id>
" ] }
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Next
-
El nombre del estado al que se realizará la transición después de ejecutar las acciones en el estado actual.
TestGroups
-
Una matriz de grupos de prueba que se marcarán como seleccionados. Para cada ID de grupo de prueba de esta matriz, la variable
se establecegroup-id
_selectedtrue
en el contexto. Asegúrese de proporcionar identificadores de grupos de prueba válidos, ya que el IDT no valida que existen los grupos especificados.
Fail
El estado Fail
indica que la máquina de estados no se ejecutó correctamente. Este es el estado final de la máquina de estados y cada definición de la máquina de estados debe incluir este estado.
{ "Type": "Fail" }
Succeed
El estado Succeed
indica que la máquina de estados se ejecutó correctamente. Este es el estado final de la máquina de estados y cada definición de la máquina de estados debe incluir este estado.
{ "Type": "Succeed" }
Contexto de las máquinas de estados
El contexto de la máquina de estados es un documento JSON de solo lectura que contiene datos que están disponibles para la máquina de estados durante la ejecución. Solo se puede acceder al contexto de la máquina de estados desde la máquina de estados y contiene información que determina el flujo de prueba. Por ejemplo, puede usar la información configurada por los ejecutores de la prueba en el archivo userdata.json
para determinar si es necesaria la ejecución de una prueba específica.
El contexto de la máquina de estados usa el siguiente formato:
{ "pool": {
<device-json-pool-element>
}, "userData": {<userdata-json-content>
}, "config": {<config-json-content>
}, "suiteFailed": true | false, "specificTestGroups": [ "<group-id>" ], "specificTestCases": [ "<test-id>" ], "hasExecutionErrors": true }
pool
-
Información sobre el grupo de dispositivos seleccionado para la ejecución de la prueba. Para un grupo de dispositivos seleccionados, esta información se recupera del elemento correspondiente de la matriz del grupo de dispositivos de alto nivel definido en el archivo
device.json
. userData
-
Información en el archivo
userdata.json
config
-
La información se sujeta en el archivo
config.json
. suiteFailed
-
El valor se establece en
false
cuando se inicia la máquina de estados. Si un grupo de pruebas falla en un estadoRunTask
, este valor se establece entrue
durante el resto de la ejecución de la máquina de estados. specificTestGroups
-
Si el ejecutor de la prueba selecciona grupos de pruebas específicos para ejecutarlos en lugar de todo el conjunto de pruebas, se crea esta clave y contiene la lista de ID de grupos de pruebas específicos.
specificTestCases
-
Si el ejecutor de la prueba selecciona casos de pruebas específicos para ejecutarlos en lugar de todo el conjunto de pruebas, se crea esta clave y contiene la lista de ID de casos de pruebas específicos.
hasExecutionErrors
-
No se cierra cuando se inicia la máquina de estados. Si algún estado detecta un error de ejecución, se crea esta variable y se establece en
true
durante el resto de la ejecución de la máquina de estados.
Puede consultar el contexto mediante la notación JSONPath. La sintaxis de las consultas de JSONPath en las definiciones de estado es {{$.
. Puede utilizar las consultas de JSONPath como cadenas de marcadores de posición en algunos estados. IDT reemplaza las cadenas de marcadores de posición con el valor de la consulta JSONPath evaluada del contexto. Puede utilizar los siguientes marcadores de posición para los siguientes valoresquery
}}
-
El valor
TestCases
en estadosRunTask
. -
El valor
Expression
estadoChoice
.
Cuando accede a los datos del contexto de las máquinas de estado, asegúrese de que se cumplan las siguientes condiciones:
-
Sus rutas de JSON deben comenzar por
$.
-
Cada valor debe dar como resultado una cadena, un número o un booleano.
Para obtener más información sobre el uso de la notación JSONPath para acceder a los datos del contexto, consulte Utilice el contexto de IDT.
Errores de ejecución
Los errores de ejecución son errores en la definición de la máquina de estados que la máquina de estados encuentra al ejecutar un estado. IDT registra la información sobre cada error en el archivo test_manager.log
y transmite el mensaje de registro a la consola.
Puede utilizar los siguientes métodos para gestionar los errores de ejecución:
-
Añada un bloque Catch a la definición de estado.
-
Compruebe el valor del valor hasExecutionErrors en el contexto de la máquina de estados.
Captura
Para usar Catch
, añada lo siguiente a su definición de estado:
"Catch": [ { "ErrorEquals": [ "
<error-type>
" ] "Next": "<state-name>
" } ]
Todos los campos que contienen valores son obligatorios tal y como se describe aquí:
Catch.ErrorEquals
-
Una matriz de los tipos de error que se deben capturar. Si un error de ejecución coincide con uno de los valores especificados, la máquina de estados pasa al estado especificado en
Catch.Next
. Consulte la definición de cada estado para obtener información sobre el tipo de error que produce. Catch.Next
-
El siguiente estado al que se realizará la transición si el estado actual encuentra un error de ejecución que coincide con uno de los valores especificados en
Catch.ErrorEquals
.
Los bloques de captura se gestionan secuencialmente hasta que uno coincide. Si los errores no coinciden con los enumerados en los bloques de Captura, las máquinas de estado seguirán ejecutándose. Como los errores de ejecución son el resultado de definiciones de estado incorrectas, se recomienda que pase al estado de Falla cuando un estado detecte un error de ejecución.
hasExecutionError
Cuando algunos estados encuentran errores de ejecución, además de emitir el error, también establecen el valor hasExecutionError
en true
en el contexto de la máquina de estados. Puede usar este valor para detectar cuando se produce un error y, a continuación, use un estado Choice
para hacer la transición de la máquina de estados al estado Fail
.
Este método incluye las siguientes características:
-
La máquina de estados no comienza con ningún valor asignado a
hasExecutionError
y este valor no está disponible hasta que se establezca en un estado concreto. Esto significa que debe establecer explícitamente el valorFallthroughOnError
enfalse
para los estadosChoice
que acceden a este valor para evitar que la máquina de estados se detenga si no se produce ningún error de ejecución. -
Una vez establecido en
true
,hasExecutionError
nunca se establece en falso ni se elimina del contexto. Esto significa que este valor solo es útil la primera vez que se establece entrue
, y para todos los estados posteriores, no proporciona un valor significativo. -
El valor
hasExecutionError
se comparte con todas las máquinas de estado ramificada en el estadoParallel
, lo que puede provocar resultados inesperados en función del orden en que se acceda a él.
Debido a estas características, no recomendamos utilizar este método si se puede utilizar un bloque de Captura en su lugar.
Máquinas de estado de ejemplo
En esta sección se proporcionan algunos ejemplos de configuraciones de máquinas de estado.
Ejemplos
- Ejemplo de máquina de estados: ejecute un solo grupo de pruebas
- Ejemplo de máquina de estados: ejecute grupos de prueba seleccionados por el usuario
- Ejemplo de máquina de estados: ejecute un solo grupo de pruebas con características de productos
- Ejemplo de máquina de estados: ejecute dos grupos de prueba en paralelo
Ejemplo de máquina de estados: ejecute un solo grupo de pruebas
Esta máquina de estado:
-
Ejecuta el grupo de prueba con una identificación
GroupA
, que debe estar presente en la suite en un archivogroup.json
. -
Comprueba si hay errores de ejecución y realiza transiciones a
Fail
si se encuentra alguno. -
Genera un informe y hace la transición a
Succeed
si no hay errores yFail
de todas formas.
{ "Comment": "Runs a single group and then generates a report.", "StartAt": "RunGroupA", "States": { "RunGroupA": { "Type": "RunTask", "Next": "Report", "TestGroup": "GroupA", "Catch": [ { "ErrorEquals": [ "RunTaskError" ], "Next": "Fail" } ] }, "Report": { "Type": "Report", "Next": "Succeed", "Catch": [ { "ErrorEquals": [ "ReportError" ], "Next": "Fail" } ] }, "Succeed": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }
Ejemplo de máquina de estados: ejecute grupos de prueba seleccionados por el usuario
Esta máquina de estado:
-
Comprueba si el ejecutor de pruebas seleccionó grupos de pruebas específicos. La máquina de estados no comprueba si hay casos de prueba específicos porque los ejecutores de pruebas no pueden seleccionar casos de prueba sin seleccionar también un grupo de pruebas.
-
Si se seleccionan grupos de prueba:
-
Ejecuta los casos de prueba dentro de los grupos de prueba seleccionados. Para ello, la máquina de estados no especifica explícitamente ningún grupo de pruebas o casos de prueba en el estado
RunTask
. -
Genera un informe después de ejecutar todas las pruebas y salidas.
-
-
Si no se seleccionan grupos de prueba:
-
Ejecuta las pruebas en el grupo de pruebas
GroupA
. -
Genera informes y salidas.
-
{ "Comment": "Runs specific groups if the test runner chose to do that, otherwise runs GroupA.", "StartAt": "SpecificGroupsCheck", "States": { "SpecificGroupsCheck": { "Type": "Choice", "Default": "RunGroupA", "FallthroughOnError": true, "Choices": [ { "Expression": "{{$.specificTestGroups[0]}} != ''", "Next": "RunSpecificGroups" } ] }, "RunSpecificGroups": { "Type": "RunTask", "Next": "Report", "Catch": [ { "ErrorEquals": [ "RunTaskError" ], "Next": "Fail" } ] }, "RunGroupA": { "Type": "RunTask", "Next": "Report", "TestGroup": "GroupA", "Catch": [ { "ErrorEquals": [ "RunTaskError" ], "Next": "Fail" } ] }, "Report": { "Type": "Report", "Next": "Succeed", "Catch": [ { "ErrorEquals": [ "ReportError" ], "Next": "Fail" } ] }, "Succeed": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }
Ejemplo de máquina de estados: ejecute un solo grupo de pruebas con características de productos
Esta máquina de estado:
-
Ejecuta el grupo de prueba
GroupA
. -
Comprueba si hay errores de ejecución y realiza transiciones a
Fail
si se encuentra alguno. -
Añade la característica
FeatureThatDependsOnGroupA
al archivoawsiotdevicetester_report.xml
:-
Si se aprueba
GroupA
, la característica se establece ensupported
. -
La característica no está marcada como opcional en el informe.
-
-
Genera un informe y hace la transición a
Succeed
si no hay errores yFail
de todas formas.
{ "Comment": "Runs GroupA and adds product features based on GroupA", "StartAt": "RunGroupA", "States": { "RunGroupA": { "Type": "RunTask", "Next": "AddProductFeatures", "TestGroup": "GroupA", "ResultVar": "GroupA_passed", "Catch": [ { "ErrorEquals": [ "RunTaskError" ], "Next": "Fail" } ] }, "AddProductFeatures": { "Type": "AddProductFeatures", "Next": "Report", "Features": [ { "Feature": "FeatureThatDependsOnGroupA", "Groups": [ "GroupA" ], "IsRequired": true } ] }, "Report": { "Type": "Report", "Next": "Succeed", "Catch": [ { "ErrorEquals": [ "ReportError" ], "Next": "Fail" } ] }, "Succeed": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }
Ejemplo de máquina de estados: ejecute dos grupos de prueba en paralelo
Esta máquina de estado:
-
Ejecuta los grupos de prueba
GroupA
yGroupB
en paralelo. Las variablesResultVar
almacenadas en el contexto por los estadosRunTask
de las máquinas de estado de ramificación están disponibles para el estadoAddProductFeatures
. -
Comprueba si hay errores de ejecución y realiza transiciones a
Fail
si se encuentra alguno. Esta máquina de estados no utiliza un bloqueCatch
porque ese método no detecta errores de ejecución en las máquinas de estados de ramificación. -
Agrega características al archivo
awsiotdevicetester_report.xml
en función de los grupos que pasan-
Si se aprueba
GroupA
, la característica se establece ensupported
. -
La característica no está marcada como opcional en el informe.
-
-
Genera un informe y hace la transición a
Succeed
si no hay errores yFail
de todas formas.
Si hay dos dispositivos configurados en el grupo de dispositivos, ambos GroupA
y GroupB
pueden ejecutarse al mismo tiempo. Sin embargo, si GroupA
o GroupB
tienen varias incluyen varias pruebas, es posible que ambos dispositivos se asignen a esas pruebas. Si solo se configura un dispositivo, los grupos de prueba se ejecutarán secuencialmente.
{ "Comment": "Runs GroupA and GroupB in parallel", "StartAt": "RunGroupAAndB", "States": { "RunGroupAAndB": { "Type": "Parallel", "Next": "CheckForErrors", "Branches": [ { "Comment": "Run GroupA state machine", "StartAt": "RunGroupA", "States": { "RunGroupA": { "Type": "RunTask", "Next": "Succeed", "TestGroup": "GroupA", "ResultVar": "GroupA_passed", "Catch": [ { "ErrorEquals": [ "RunTaskError" ], "Next": "Fail" } ] }, "Succeed": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }, { "Comment": "Run GroupB state machine", "StartAt": "RunGroupB", "States": { "RunGroupA": { "Type": "RunTask", "Next": "Succeed", "TestGroup": "GroupB", "ResultVar": "GroupB_passed", "Catch": [ { "ErrorEquals": [ "RunTaskError" ], "Next": "Fail" } ] }, "Succeed": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } } ] }, "CheckForErrors": { "Type": "Choice", "Default": "AddProductFeatures", "FallthroughOnError": true, "Choices": [ { "Expression": "{{$.hasExecutionErrors}} == true", "Next": "Fail" } ] }, "AddProductFeatures": { "Type": "AddProductFeatures", "Next": "Report", "Features": [ { "Feature": "FeatureThatDependsOnGroupA", "Groups": [ "GroupA" ], "IsRequired": true }, { "Feature": "FeatureThatDependsOnGroupB", "Groups": [ "GroupB" ], "IsRequired": true } ] }, "Report": { "Type": "Report", "Next": "Succeed", "Catch": [ { "ErrorEquals": [ "ReportError" ], "Next": "Fail" } ] }, "Succeed": { "Type": "Succeed" }, "Fail": { "Type": "Fail" } } }