AWS IoT Greengrass Version 1 entrou na fase de vida útil prolongada em 30 de junho de 2023. Para obter mais informações, consulte política de manutenção do AWS IoT Greengrass V1. Após essa data, AWS IoT Greengrass V1 não lançaremos atualizações que forneçam recursos, aprimoramentos, correções de erros ou patches de segurança. Os dispositivos que funcionam AWS IoT Greengrass V1 não serão interrompidos e continuarão operando e se conectando à nuvem. É altamente recomendável que você migre para AWS IoT Greengrass Version 2, o que adiciona novos recursos significativos e suporte para plataformas adicionais.
As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Configure a máquina de estados do IDT
Uma máquina de estados é uma estrutura que controla o fluxo de execução do pacote de testes. Ela determina o estado inicial de um pacote de testes, gerencia as transições de estado com base nas regras definidas pelo usuário e continua avançando por esses estados até atingir o estado final.
Se seu pacote de testes não incluir uma máquina de estados definida pelo usuário, o IDT gerará uma máquina de estados para você. A máquina padrão de estados executa as seguintes funções:
-
Fornece aos executores de teste a capacidade de selecionar e executar grupos de testes específicos, em vez de todo o pacote de testes.
-
Se grupos de testes específicos não forem selecionados, executará cada grupo de testes no pacote de testes em uma ordem aleatória.
-
Gera relatórios e imprime um resumo do console que mostra os resultados do teste para cada grupo de testes e caso de teste.
A máquina de estados de um pacote de testes do IDT deve atender aos seguintes critérios:
-
Cada estado corresponde a uma ação a ser executada pelo IDT, como executar um grupo de testes ou produzir um arquivo de relatório.
-
A transição para um estado executa a ação associada ao estado.
-
Cada estado define a regra de transição para o próximo estado.
-
O estado final deve ser
Succeed
ouFail
.
Formato da máquina de estados
Você pode usar o modelo a seguir para configurar seu próprio arquivo
: <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 os campos que contêm valores são necessários, conforme descrito aqui:
Comment
-
Uma descrição da máquina de estados.
StartAt
-
O nome do estado em que o IDT começa a executar o pacote de testes. O valor de
StartAt
deve ser definido como um dos estados listados no objetoStates
. States
-
Um objeto que mapeia nomes de estados definidos pelo usuário para estados válidos do IDT. Cada estado do objeto
state-name
contém a definição de um estado válido mapeado para ostate-name
.O objeto
States
deve incluir os estadosSucceed
eFail
. Para obter informações sobre estados válidos, consulte Estados válidos e definições de estado.
Estados válidos e definições de estado
Esta seção descreve as definições de estado de todos os estados válidos que podem ser usados na máquina de estados do IDT. Alguns dos estados a seguir oferecem suporte a configurações no nível do caso de teste. No entanto, recomendamos que você configure as regras de transição de estado no nível do grupo de teste em vez de no nível do caso de teste, a menos que seja absolutamente necessário.
Definições de estado
RunTask
O estado RunTask
executa casos de teste de um grupo de teste definido no pacote de testes.
{ "Type": "RunTask", "Next": "
<state-name>
", "TestGroup": "<group-id>
", "TestCases": [ "<test-id>
" ], "ResultVar": "<result-name>
" }
Todos os campos que contêm valores são necessários, conforme descrito aqui:
Next
-
O nome do estado para o qual fazer a transição após a execução das ações no estado atual.
TestGroup
-
Opcional. O ID do grupo de testes a ser executado. Se esse valor não for especificado, o IDT executará o grupo de teste selecionado pelo executor do teste.
TestCases
-
Opcional. Uma matriz de IDs de casos de teste do grupo especificado em
TestGroup
. Com base nos valores deTestGroup
eTestCases
, o IDT determina o comportamento da execução do teste da seguinte forma:-
Quando
TestGroup
eTestCases
são especificados, o IDT executa os casos de teste especificados do grupo de teste. -
Quando
TestCases
são especificados, masTestGroup
não é especificado, o IDT executa os casos de teste especificados. -
Quando
TestGroup
é especificado, masTestCases
não é especificado, o IDT executa todos os casos de teste dentro do grupo de testes especificado. -
Quando nem
TestGroup
nemTestCases
é especificado, o IDT executa todos os casos de teste do grupo de testes que o executor de testes seleciona na CLI do IDT. Para habilitar a seleção de grupos para executores de teste, você deve incluir os estadosRunTask
eChoice
em seu arquivostatemachine.json
. Para ver um exemplo de como isso funciona, consulte Exemplo de máquina de estados: executar grupos de testes selecionados pelo usuário.Para obter mais informações sobre como habilitar os comandos da CLI do IDT para executores de teste, consulte Habilitar os comandos da CLI do IDT.
-
ResultVar
-
O nome da variável de contexto a ser definida com os resultados da execução do teste. Não especifique esse valor se você não especificou um valor para
TestGroup
. O IDT define o valor da variável que você define emResultVar
paratrue
oufalse
com base no seguinte:-
Se o nome da variável estiver no formato
, o valor será definido como se todos os testes do primeiro grupo de teste tivessem sido aprovados ou ignorados.text
_text
_passed -
Em todos os outros casos, o valor é definido como se todos os testes em todos os grupos de testes tivessem sido aprovados ou ignorados.
-
Normalmente, você usará o estado RunTask
para especificar um ID de grupo de testes sem especificar IDs de caso de teste individuais, para que o IDT execute todos os casos de teste no grupo de testes especificado. Todos os casos de teste executados por esse estado são executados em paralelo, em uma ordem aleatória. No entanto, se todos os casos de teste exigirem a execução de um dispositivo e apenas um único dispositivo estiver disponível, os casos de teste serão executados sequencialmente.
Como tratar erros
Se algum dos grupos de testes ou IDs de casos de teste especificados não for válido, esse estado emitirá o erro de execução RunTaskError
. Se o estado encontrar um erro de execução, ele também definirá a variável hasExecutionError
no contexto da máquina de estados como true
.
Choice
O estado Choice
permite que você defina dinamicamente o próximo estado para o qual fazer a transição com base nas condições definidas pelo usuário.
{ "Type": "Choice", "Default": "
<state-name>
", "FallthroughOnError": true | false, "Choices": [ { "Expression": "<expression>
", "Next": "<state-name>
" } ] }
Todos os campos que contêm valores são necessários, conforme descrito aqui:
Default
-
O estado padrão para o qual fazer a transição se nenhuma das expressões definidas em
Choices
puder ser avaliada comotrue
. FallthroughOnError
-
Opcional. Especifica o comportamento quando o estado encontra um erro na avaliação de expressões. Defina como
true
se você quiser pular uma expressão se a avaliação resultar em um erro. Se nenhuma expressão tiver correspondência, a máquina de estados fará a transição para o estadoDefault
. Se o valorFallthroughOnError
não for especificado, ele assumefalse
como padrão. Choices
-
Uma matriz de expressões e estados para determinar para qual estado fazer a transição depois de executar as ações no estado atual.
Choices.Expression
-
Uma string de expressões que avalia para um valor booliano. Se a expressão for avaliada como
true
, a máquina de estados fará a transição para o estado definido emChoices.Next
. As strings de expressões recuperam valores do contexto da máquina de estados e, em seguida, executam operações neles para chegar a um valor booliano. Para obter informações sobre como acessar o contexto da máquina de estado, consulte Contexto da máquina de estados. Choices.Next
-
O nome do estado para o qual fazer a transição se a expressão definida em
Choices.Expression
for avaliada comotrue
.
Como tratar erros
O estado Choice
pode exigir tratamento de erros nos seguintes casos:
-
Algumas variáveis nas expressões de selecione não existem no contexto da máquina de estado.
-
O resultado de uma expressão não é um valor booliano.
-
O resultado de uma pesquisa JSON não é uma string, um número ou um booliano.
Você não pode usar um bloco Catch
para tratar erros nesse estado. Se você quiser parar de executar a máquina de estados quando ela encontrar um erro, defina FallthroughOnError
como false
. No entanto, recomendamos que você configure FallthroughOnError
para true
e, dependendo do caso de uso, execute um dos seguintes procedimentos:
-
Se for esperado que uma variável que você está acessando não exista em alguns casos, use o valor de
Default
e blocosChoices
adicionais para especificar o próximo estado. -
Se uma variável que você está acessando sempre existir, defina o estado
Default
comoFail
.
Parallel
O estado Parallel
permite que você defina e execute novas máquinas de estados paralelamente umas às outras.
{ "Type": "Parallel", "Next": "
<state-name>
", "Branches": [<state-machine-definition>
] }
Todos os campos que contêm valores são necessários, conforme descrito aqui:
Next
-
O nome do estado para o qual fazer a transição após a execução das ações no estado atual.
Branches
-
Uma matriz de definições de máquina de estados a serem executadas. Cada definição de máquina de estados deve conter seus próprios estados
StartAt
,Succeed
eFail
. As definições da máquina de estados nessa matriz não podem referenciar estados fora de sua própria definição.nota
Como cada máquina de estados de ramificação compartilha o mesmo contexto de máquina de estados, definir variáveis em uma ramificação e depois ler essas variáveis em outra ramificação pode resultar em um comportamento inesperado.
O estado Parallel
passa para o próximo estado somente depois de executar todas as máquinas de estados da ramificação. Cada estado que requer um dispositivo aguardará para ser executado até que o dispositivo esteja disponível. Se vários dispositivos estiverem disponíveis, esse estado executará casos de teste de vários grupos em paralelo. Se não houver dispositivos suficientes disponíveis, os casos de teste serão executados sequencialmente. Como os casos de teste são executados em uma ordem aleatória quando executados em paralelo, dispositivos diferentes podem ser usados para executar testes do mesmo grupo de testes.
Como tratar erros
Certifique-se de que tanto a máquina de estado da ramificação quanto a máquina de estado principal façam a transição para o estado Fail
para tratar erros de execução.
Como as máquinas de estado de ramificação não transmitem erros de execução para a máquina de estado principal, você não pode usar um bloco Catch
para lidar com erros de execução em máquinas de estados de ramificação. Em vez disso, use o valor hasExecutionErrors
no contexto da máquina de estados compartilhada. Para obter um exemplo de como isso funciona, consulte Exemplo de máquina de estado: execute dois grupos de teste em paralelo.
AddProductFeatures
O estado AddProductFeatures
permite adicionar atributos do produto ao arquivo awsiotdevicetester_report.xml
gerado pelo IDT.
Um atributo do produto é uma informação definida pelo usuário sobre critérios específicos que um dispositivo pode atender. Por exemplo, o atributo MQTT
do produto pode indicar que o dispositivo publica mensagens MQTT corretamente. No relatório, os atributos do produto são definidas como supported
, not-supported
ou um valor personalizado, com base na aprovação dos testes especificados.
nota
O estado AddProductFeatures
não gera relatórios sozinho. Esse estado deve fazer a transição para o estado Report para gerar relatórios.
{ "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 os campos que contêm valores são necessários, conforme descrito aqui:
Next
-
O nome do estado para o qual fazer a transição após a execução das ações no estado atual.
Features
-
Uma matriz de atributos do produto para mostrar no arquivo
awsiotdevicetester_report.xml
.Feature
-
O nome do atributo
FeatureValue
-
Opcional. O valor personalizado a ser usado no relatório em vez de
supported
. Se esse valor não for especificado, com base nos resultados do teste, o valor do atributo será definido comosupported
ounot-supported
.Se você usar um valor personalizado para
FeatureValue
, você poderá testar o mesmo atributo com condições diferentes, e o IDT concatena os valores do atributo para as condições compatíveis. Por exemplo, o trecho a seguir mostra o atributoMyFeature
com dois valores de atributo separados:... { "Feature": "MyFeature", "FeatureValue": "first-feature-supported", "Groups": ["first-feature-group"] }, { "Feature": "MyFeature", "FeatureValue": "second-feature-supported", "Groups": ["second-feature-group"] }, ...
Se os dois grupos de teste forem aprovados, o valor do atributo será definido como
first-feature-supported, second-feature-supported
. Groups
-
Opcional. Uma matriz de IDs de grupos de testes. Todos os testes dentro de cada grupo de testes especificado devem ser aprovados para que o atributo receba suporte.
OneOfGroups
-
Opcional. Uma matriz de IDs de grupos de testes. Todos os testes em pelo menos um dos grupos de testes especificados devem ser aprovados para que o atributo receba suporte.
TestCases
-
Opcional. Uma matriz de IDs de casos de teste. Se você especificar esse valor, o seguinte se aplica:
-
Todos os casos de teste especificados devem ser aprovados para que o atributo receba suporte.
-
Groups
deve conter somente um ID do grupo de testes. -
OneOfGroups
não deve ser especificado.
-
IsRequired
-
Opcional. Defina como
false
para marcar esse atributo como um atributo opcional no relatório. O valor padrão étrue
. ExecutionMethods
-
Opcional. Uma matriz de métodos de execução que correspondem ao valor
protocol
especificado no arquivodevice.json
. Se esse valor for especificado, os executores de teste deverão especificar um valorprotocol
que corresponda a um dos valores dessa matriz para incluir o atributo no relatório. Se esse valor não for especificado, o atributo sempre será incluído no relatório.
Para usar o estado AddProductFeatures
, você deve definir o valor de ResultVar
no estado RunTask
como um dos seguintes valores:
-
Se você especificou IDs de casos de teste individuais, defina
ResultVar
como
.group-id_test-id
_passed -
Se você não especificou IDs de casos de teste individuais, defina
ResultVar
como
.group-id
_passed
O estado AddProductFeatures
verifica os resultados dos testes da seguinte maneira:
-
Se você não especificou nenhum ID de caso de teste, o resultado de cada grupo de testes será determinado a partir do valor da variável
no contexto da máquina de estados.group-id
_passed -
Se você especificou IDs de casos de teste, o resultado de cada um dos testes será determinado a partir do valor da variável
no contexto da máquina de estados.group-id_test-id
_passed
Como tratar erros
Se um ID de grupo fornecida nesse estado não for uma ID de grupo válida, esse estado resultará no erro de execução AddProductFeaturesError
. Se o estado encontrar um erro de execução, ele também definirá a variável hasExecutionErrors
no contexto da máquina de estados como true
.
Relatório
O estado Report
gera os arquivos
e suite-name
_Report.xmlawsiotdevicetester_report.xml
. Esse estado também transmite o relatório para o console.
{ "Type": "Report", "Next": "
<state-name>
" }
Todos os campos que contêm valores são necessários, conforme descrito aqui:
Next
-
O nome do estado para o qual fazer a transição após a execução das ações no estado atual.
Você deve sempre fazer a transição para o estado Report
próximo ao final do fluxo de execução do teste para que os executores de testes possam visualizar os resultados do teste. Normalmente, o próximo estado após esse estado é Succeed
.
Como tratar erros
Se esse estado encontrar problemas com a geração dos relatórios, ele emitirá o erro de execução ReportError
.
LogMessage
O estado LogMessage
gera o arquivo test_manager.log
e transmite a mensagem de log para o console.
{ "Type": "LogMessage", "Next": "
<state-name>
" "Level": "info | warn | error" "Message": "<message>
" }
Todos os campos que contêm valores são necessários, conforme descrito aqui:
Next
-
O nome do estado para o qual fazer a transição após a execução das ações no estado atual.
Level
-
O nível de erro no qual criar a mensagem de log. Se você especificar um nível que não seja válido, esse estado gerará uma mensagem de erro e a descartará.
Message
-
A mensagem a ser registrada.
SelectGroup
O estado SelectGroup
atualiza o contexto da máquina de estados para indicar quais grupos estão selecionados. Os valores definidos por esse estado são usados por qualquer estado Choice
subsequente.
{ "Type": "SelectGroup", "Next": "
<state-name>
" "TestGroups": [<group-id>
" ] }
Todos os campos que contêm valores são necessários, conforme descrito aqui:
Next
-
O nome do estado para o qual fazer a transição após a execução das ações no estado atual.
TestGroups
-
Uma matriz de grupos de testes que serão marcados como selecionados. Para cada ID de grupo de testes nessa matriz, a variável
é definida comogroup-id
_selectedtrue
no contexto. Certifique-se de fornecer IDs de grupos de teste válidos porque o IDT não valida se os grupos especificados existem.
Fail
O estado Fail
indica que a máquina de estados não foi executada corretamente. Esse é um estado final para a máquina de estados e cada definição de máquina de estados deve incluir esse estado.
{ "Type": "Fail" }
Succeed
O estado Succeed
indica que a máquina de estados foi executada corretamente. Esse é um estado final para a máquina de estados e cada definição de máquina de estados deve incluir esse estado.
{ "Type": "Succeed" }
Contexto da máquina de estados
O contexto da máquina de estados é um documento JSON somente para leitura que contém dados que estão disponíveis para a máquina de estados durante a execução. O contexto da máquina de estados só é acessível a partir da máquina de estados e contém informações que determinam o fluxo de teste. Por exemplo, você pode usar as informações configuradas pelos executores de teste no arquivo userdata.json
para determinar se é necessário executar um teste específico.
O contexto da máquina de estados usa o seguinte 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
-
Informações sobre o grupo de dispositivos selecionado para a execução do teste. Para um grupo de dispositivos selecionados, essas informações são recuperadas a partir do elemento correspondente na matriz do grupo de dispositivos de nível superior definido no arquivo
device.json
. userData
-
Informações no arquivo
userdata.json
. config
-
Pin de informações no arquivo
config.json
. suiteFailed
-
O valor é definido como
false
quando a máquina de estados é iniciada. Se um grupo de teste falhar em um estadoRunTask
, esse valor será definido comotrue
pela duração restante da execução da máquina de estados. specificTestGroups
-
Se o executor de teste selecionar grupos de teste específicos para execução em vez do pacote de testes todo, essa chave será criada e conterá a lista de IDs de grupos de testes específicos.
specificTestCases
-
Se o executor de testes selecionar casos de teste específicos para execução em vez do pacote de testes todo, essa chave será criada e conterá a lista de IDs de casos de teste específicos.
hasExecutionErrors
-
Não sai quando a máquina de estados é iniciada. Se algum estado encontrar um erro de execução, essa variável será criada e definida para
true
pela duração restante da execução da máquina de estados.
Você pode consultar o contexto usando a notação JSONPath. A sintaxe para consultas JSONPath nas definições de estado é {{$.
. Você pode usar consultas JSONPath como strings de espaços reservados em alguns estados. O IDT substitui as strings de espaços reservados pelo valor da consulta JSONPath avaliada no contexto. Você pode usar espaços reservados para os valores a seguir:query
}}
-
O valor
TestCases
em estadosRunTask
. -
O valor
Expression
no estadoChoice
.
Ao acessar dados do contexto da máquina de estados, verifique se as seguintes condições são atendidas:
-
Seus caminhos JSON devem começar com
$.
-
Cada valor deve ser avaliado como uma string, um número ou um booliano.
Para obter mais informações sobre o uso da notação JSONPath para acessar dados do contexto, consulte Use o contexto do IDT.
Erros de execução
Erros de execução são erros na definição da máquina de estado que a máquina de estados encontra ao executar um estado. O IDT registra informações sobre cada erro no arquivo test_manager.log
e transmite a mensagem de log para o console.
É possível usar os seguintes métodos para lidar com erros de execução:
-
Adicione um bloco Catch na definição do estado.
-
Verifique o valor do valor hasExecutionErrors no contexto da máquina de estados.
Catch
Para usar Catch
, adicione o seguinte à sua definição de estado:
"Catch": [ { "ErrorEquals": [ "
<error-type>
" ] "Next": "<state-name>
" } ]
Todos os campos que contêm valores são necessários, conforme descrito aqui:
Catch.ErrorEquals
-
Uma matriz dos tipos de erro a serem capturados. Se um erro de execução corresponder a um dos valores especificados, a máquina de estados fará a transição para o estado especificado em
Catch.Next
. Consulte cada definição de estado para obter informações sobre o tipo de erro que ela produz. Catch.Next
-
O próximo estado para o qual fazer a transição se o estado atual encontrar um erro de execução que corresponda a um dos valores especificados em
Catch.ErrorEquals
.
Os blocos Catch são tratados sequencialmente até que um deles corresponda. Se os erros não corresponderem aos listados nos blocos Catch, as máquinas de estados continuarão a ser executadas. Como os erros de execução são resultado de definições de estado incorretas, recomendamos que você faça a transição para o estado Fail quando um estado encontrar um erro de execução.
hasExecutionError
Quando alguns estados encontram erros de execução, além de emitirem o erro, eles também definem o valor hasExecutionError
como true
no contexto da máquina de estados. Você pode usar esse valor para detectar quando ocorre um erro e, em seguida, usar um estado Choice
para fazer a transição da máquina de estados para o estado Fail
.
Esse método tem as seguintes características.
-
A máquina de estados não inicia com nenhum valor atribuído a
hasExecutionError
e esse valor não está disponível até que um determinado estado a defina. Isso significa que você deve definir explicitamente oFallthroughOnError
parafalse
para os estadosChoice
que acessam esse valor para evitar que a máquina de estado seja interrompida se nenhum erro de execução ocorrer. -
Depois de definido como
true
,hasExecutionError
nunca é definido como falso ou removido do contexto. Isso significa que esse valor só é útil na primeira vez em que é definido comotrue
e, para todos os estados subsequentes, ele não fornece um valor significativo. -
O valor
hasExecutionError
é compartilhado com todas as máquinas de estados da ramificação no estadoParallel
, o que pode resultar em resultados inesperados, dependendo da ordem em que ela é acessada.
Devido a essas características, não recomendamos que você use esse método se, em vez disso, puder usar um bloco Catch.
Exemplo de máquinas de estados
Esta seção fornece alguns exemplos de configurações de máquinas de estados.
Exemplos
- Exemplo de máquina de estados: execute um único grupo de testes
- Exemplo de máquina de estados: executa grupos de testes selecionados pelo usuário
- Exemplo de máquina de estados: executa um único grupo de testes com atributos do produto
- Exemplo de máquina de estado: execute dois grupos de teste em paralelo
Exemplo de máquina de estados: execute um único grupo de testes
Esta máquina de estados:
-
executa o grupo de testes com id
GroupA
, que deve estar presente no pacote em um arquivogroup.json
. -
Verifica se há erros de execução e transições para
Fail
se algum foi encontrado. -
Gera um relatório e faz a transição para
Succeed
se não houver erros eFail
, caso contrário.
{ "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" } } }
Exemplo de máquina de estados: executa grupos de testes selecionados pelo usuário
Esta máquina de estados:
-
verifica se o executor do teste selecionou grupos de testes específicos. A máquina de estados não verifica casos de teste específicos porque os executores de testes não podem selecionar casos de teste sem também selecionar um grupo de testes.
-
Se os grupos de testes forem selecionados:
-
executa os casos de teste nos grupos de testes selecionados. Para fazer isso, a máquina de estados não especifica explicitamente nenhum grupo de testes ou caso de teste no estado
RunTask
. -
Gera um relatório após executar todos os testes e saídas.
-
-
Se os grupos de testes não forem selecionados:
-
executa testes em grupo de testes
GroupA
. -
Gera relatórios e saídas.
-
{ "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" } } }
Exemplo de máquina de estados: executa um único grupo de testes com atributos do produto
Esta máquina de estados:
-
executa o grupo de testes
GroupA
. -
Verifica se há erros de execução e transições para
Fail
se algum foi encontrado. -
Adiciona o atributo
FeatureThatDependsOnGroupA
ao arquivoawsiotdevicetester_report.xml
:-
Se
GroupA
for aprovado, o atributo será definido comosupported
. -
O atributo não será marcado como opcional no relatório.
-
-
Gera um relatório e faz a transição para
Succeed
se não houver erros eFail
, caso contrário.
{ "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" } } }
Exemplo de máquina de estado: execute dois grupos de teste em paralelo
Esta máquina de estados:
-
Executa os grupos de teste
GroupA
eGroupB
em paralelo. As variáveisResultVar
armazenadas no contexto pelosRunTask
estados nas máquinas de estado da ramificação estão disponíveis para o estadoAddProductFeatures
. -
Verifica se há erros de execução e transições para
Fail
se algum foi encontrado. Essa máquina de estado não usa um blocoCatch
porque esse método não detecta erros de execução em máquinas de estado de ramificação. -
Adiciona atributos ao arquivo
awsiotdevicetester_report.xml
com base nos grupos que passam-
Se
GroupA
for aprovado, o atributo será definido comosupported
. -
O atributo não será marcado como opcional no relatório.
-
-
Gera um relatório e faz a transição para
Succeed
se não houver erros eFail
, caso contrário.
Se dois dispositivos estiverem configurados no grupo de dispositivos, GroupA
e GroupB
poderão ser executados ao mesmo tempo. No entanto, se GroupA
ou GroupB
tiver vários testes, os dois dispositivos poderão ser alocados para esses testes. Se somente um dispositivo estiver configurado, os grupos de testes serão executados sequencialmente.
{ "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" } } }