O blog da AWS

Apresentando o AWS Integrated Application Test Kit (IATK)

Por Dan Fox, principal arquiteto especializado em soluções, e Brian Krygsman, arquiteto sênior de soluções 

 

Hoje, a AWS anunciou o lançamento público da prévia do AWS Integrated Application Test Kit (IATK). O AWS IATK é uma biblioteca de software que ajuda você a escrever testes automatizados para aplicativos baseados em nuvem. Este blog apresenta vários recursos iniciais do AWS IATK e, em seguida, mostra exemplo de um aplicativo de processamento de vídeo. Se você está começando com testes Serverless, saiba mais em serverlessland.com/testing.

Visão geral

Quando você cria aplicativos compostos por serviços Serverless, como AWS Lambda, Amazon EventBridge ou AWS Step Functions, muitos dos seus componentes de arquitetura não podem ser implantados em seu desktop, mas existem apenas na nuvem da AWS. Ao contrário de trabalhar com aplicativos implantados localmente, esses tipos de aplicativos se beneficiam de estratégias baseadas em nuvem para realizar testes automatizados. Para o lançamento de sua prévia pública, o AWS IATK ajuda você a implementar algumas dessas estratégias para aplicativos Python. O AWS IATK oferecerá suporte a outras linguagens em lançamentos futuros.

Localizando recursos para testes

Ao escrever testes automatizados para recursos de nuvem, você precisa dos IDs físicos dos seus recursos. O ID físico é o nome que a AWS atribui a um recurso após a criação. Por exemplo, para enviar solicitações para o Amazon API Gateway, você precisa do ID físico, que forma o endpoint da API.

Se você implantar recursos de nuvem em uma infraestrutura separada como pilhas de aplicações, poderá ter dificuldade em localizar IDs físicos. No CloudFormation, você cria os IDs lógicas dos recursos em seu template, bem como o nome da pilha. Com o IATK, você pode obter o ID físico de um recurso se fornecer o ID lógico e o nome da pilha. Você também pode obter as saídas da pilha fornecendo o nome da pilha. Esses métodos convenientes simplificam a localização de recursos para os testes que você escreve.

Criação de “equipamento” de teste para arquiteturas orientadas a eventos

Para escrever testes de integração para arquiteturas orientadas por eventos, estabeleça limites lógicos dividindo seu aplicativo em subsistemas. Seus subsistemas devem ser simples o suficiente para raciocinar e conter entradas e saídas compreensíveis. Uma técnica útil para testar subsistemas é criar equipamentos de teste. Os equipamentos de teste são recursos que você cria especificamente para testar subsistemas.

Por exemplo, um teste de integração pode iniciar um processo de subsistema passando um evento de teste de entrada para ele. A IATK pode criar um equipamento de teste para você que escuta o Amazon EventBridge para eventos de saída. (ou seja, o equipamento é composto por uma regra do EventBridge que encaminha o evento de saída para o Amazon Simple Queue Service.) Em seguida, seu teste de integração consulta o equipamento de teste para examinar a saída e determinar se o teste é aprovado ou falhado. Esses equipamentos ajudam você a criar testes de integração na nuvem para arquiteturas orientadas a eventos.

Estabelecendo contratos de nível de serviço para testar recursos assíncronos

Se você escreve um serviço síncrono, seus testes automatizados fazem solicitações e esperam respostas imediatas. Quando sua arquitetura é assíncrona, seu serviço aceita uma solicitação e executa um conjunto de ações posteriormente. Como você pode testar o sucesso de uma atividade se ela não tem uma duração especificada?

Considere criar tempos limite (timeouts) razoáveis para seus sistemas assíncronos. Documente os tempos limite como acordos de nível de serviço (SLAs). Você pode decidir publicar seus SLAs externamente ou documentá-los como padrões internos. O IATK contém um recurso de pesquisa que permite estabelecer tempos limite. Esse recurso ajuda você a testar se seus sistemas assíncronos concluem tarefas em tempo hábil.

Usando o AWS X-Ray para testes detalhados

Se você quiser obter mais visibilidade dos detalhes do interior do seu aplicativo, instrumente com o AWS X-Ray. Com o AWS X-Ray, você traça o caminho de um evento por meio de vários serviços. A IATK fornece funcionaldiades que ajudam você a definir a taxa de amostragem do AWS X-Ray, obter árvores de rastreamento e determinar a duração do rastreamento. Esses recursos ajudam você a observar e testar seus sistemas distribuídos com mais detalhes.

Saiba mais sobre como testar arquiteturas assíncronas em aws-samples/serverless-test-samples.

Visão geral do aplicativo de exemplo

Para demonstrar os recursos do IATK, este post usa uma parte de um aplicativo de vídeo Serverless projetado com uma arquitetura de plug-in. Uma equipe de desenvolvimento cria o aplicativo principal. Equipes de desenvolvimento distribuídas em toda a organização criam os plug-ins. Uma pilha do AWS CloudFormation implanta o aplicativo principal. Pilhas separadas implantam cada plug-in.

As comunicações entre o aplicativo principal e os plug-ins são gerenciadas por um barramento EventBridge. Os plug-ins retiram os eventos do ciclo de vida do aplicativo e devem colocar os eventos de notificação de conclusão de volta no barramento em 20 segundos. Para testes, a equipe principal criou um fluxo de trabalho do AWS Step Functions que copia o processo de produção ao emitir exemplos de eventos de ciclo de vida devidamente formatados. Os desenvolvedores executam esse fluxo de trabalho de teste em ambientes de desenvolvimento e teste para verificar se seus plug-ins estão se comunicando adequadamente com o barramento de eventos.

A demonstração a seguir mostra um teste de integração para o aplicativo de exemplo que valida o comportamento do plug-in. No teste de integração, o IATK localiza o fluxo de trabalho do Step Functions. Ele cria um equipamento de teste para ouvir a notificação de conclusão do evento a ser enviada pelo plug-in. Em seguida, o teste executa o fluxo de trabalho para iniciar o processo do ciclo de vida e iniciar as ações do plug-in. Em seguida, o IATK usa um mecanismo de pesquisa com um tempo limite (timeout) para verificar se o plug-in está em conformidade com o contrato de nível de serviço de 20 segundos. Esta é a sequência do processamento:
Sequence of processing

  1. O teste de integração inicia a execução do fluxo de trabalho de teste.
  2. O fluxo de trabalho coloca um evento de ciclo de vida no barramento.
  3. O plug-in extrai o evento do ciclo de vida do barramento.
  4. Quando o plug-in é concluído, ele coloca um evento de conclusão no barramento.

O teste de integração faz uma pesquisa para o evento de conclusão para determinar se o teste foi aprovado no SLA

Implantando e testando o aplicativo de exemplo

Follow these steps to review this application, build it locally, deploy it in your AWS account, and test it.

Baixando o aplicativo de exemplo

  1. Abra seu terminal e clone o aplicativo de exemplo do GitHub com o comando a seguir ou baixe o código. Esse repositório também inclui outros exemplos de padrões para testar aplicativos Serverless.
    git clone https://github.com/aws-samples/serverless-test-samples
    Bash
  2. O diretório inícial do aplicativo de exemplo do IATK está em python-test-samples/integrated-application-test-kit. Mude para este diretório:
    cd serverless-test-samples/python-test-samples/integrated-application-test-kit
    Bash

Analisando o teste de integração

Antes de implantar o aplicativo, analise como o teste de integração usa o IATK abrindo plugins/2-postvalidate-plugins/python-minimal-plugin/tests/integration/test_by_polling.pyem seu editor de texto. A classe de teste instancia o IATK na parte superior do arquivo.

iatk_client = aws_iatk.AwsIatk(region=aws_region)
Bash

No método setUp(), a classe de teste usa o IATK para buscar as saídas da pilha do CloudFormation. Essas saídas são referências a componentes de nuvem implantados, como o fluxo de trabalho do testador de plug-ins AWS Step Functions:

stack_outputs = self.iatk_client.get_stack_outputs(
    stack_name=self.plugin_tester_stack_name,
    output_names=[
        "PluginLifecycleWorkflow",
        "PluginSuccessEventRuleName"
    ],
)
Python

A classe de teste conecta um ouvinte ao barramento de eventos padrão usando uma regra de evento fornecida nas saídas da pilha. O teste usa esse ouvinte posteriormente para pesquisar eventos.

add_listener_output = self.iatk_client.add_listener(
    event_bus_name="default",
    rule_name=self.existing_rule_name
)
Python

A classe de teste limpa do ouvinte no método tearDown().

self.iatk_client.remove_listeners(
    ids=[self.listener_id]
)
Python

Quando as configurações estiverem concluídas, o método test_minimal_plugin_event_published_polling()
implementa o teste real.

O teste primeiro inicializa o evento de gatilho.

The test first initializes the trigger event.

trigger_event = {
    "eventHook": "postValidate",
    "pluginTitle": "PythonMinimalPlugin"
}
Python

Em seguida, o teste inicia a execução do fluxo de trabalho Step Functions do testador de plug-ins. Ele usa o
plugin_tester_arn
que foi obtido durante a configuração.

self.step_functions_client.start_execution(
    stateMachineArn=self.plugin_tester_arn,
    input=json.dumps(trigger_event)
)
Python

O teste pesquisa o ouvinte, esperando que o plug-in emita eventos. Ele interrompe a pesquisa quando atinge o tempo limite do SLA ou recebe o número máximo de mensagens.

poll_output = self.iatk_client.poll_events(
    listener_id=self.listener_id,
    wait_time_seconds=self.SLA_TIMEOUT_SECONDS,
    max_number_of_messages=1,
)
Python

Finalmente, o teste afirma que ele recebe o número certo de eventos e que eles estão bem formados.

self.assertEqual(len(poll_output.events), 1)
self.assertEqual(received_event["source"], "video.plugin.PythonMinimalPlugin")
self.assertEqual(received_event["detail-type"], "plugin-complete")
Python

Instalando pré-requisitos

Você precisa dos seguintes pré-requisitos para criar esse exemplo:

Crie e implante os componentes do aplicativo de exemplo

  1. Use o AWS SAM para criar e implantar o testador de plug-ins na sua conta da AWS. O testador de plug-ins é o fluxo de trabalho do Step Functions mostrado no diagrama anterior. Durante o processo de criação, você pode adicionar a sinalização –use-container ao comando build para instruir o AWS SAM a criar o aplicativo em um contêiner fornecido. Você pode aceitar ou substituir os valores padrão durante o processo de implantação. Você usará “Stack Name” e “AWS Region” posteriormente para executar o teste de integração.
    cd plugins/plugin_tester # Move to the plugin tester directory
    
    sam build --use-container # Build the plugin tester
    
    Bash

    sam build

  2. Implante o testador:
    sam deploy --guided # Deploy the plugin tester
    Bash

    Deploy the tester

  3. Depois que o testador de plug-in for implantado, use o AWS SAM para implantar o plug-in.
    cd ../2-postvalidate-plugins/python-minimal-plugin # Move to the plugin directory
    
    sam build --use-container # Build the plugin
    Bash

    Deploy the plugin

  4. Implante o plug-in:
    sam deploy --guided # Deploy the plugin
    Bash

Executando o teste

Você pode executar testes escritos com o IATK usando executores de teste unitário do Python, como unittest e pytest. O exemplo de teste de aplicativo usa unittest.

1, Use um ambiente virtual para organizar suas dependências. Na raiz do aplicativo de exemplo, execute:

python3 -m venv .venv # Create the virtual environment
source .venv/bin/activate # Activate the virtual environment
Bash

2. Instale as dependências, incluindo o IATK:

cd tests 
pip3 install -r requirements.txt
Bash

3. Execute o teste, fornecendo as variáveis de ambiente necessárias das implantações anteriores. Você pode encontrar os valores corretos no arquivo samconfig.toml do diretório plugin_tester.

samconfig.toml

 

cd integration

PLUGIN_TESTER_STACK_NAME=video-plugin-tester \
AWS_REGION=us-west-2 \
python3 -m unittest ./test_by_polling.py
Bash

Você deve ver a saída quando o unittest executa o teste.

Abra o console do Step Functions em sua conta da AWS e escolha o fluxo de trabalho PluginLifecycleWorkflow-<random value> para validar se o testador do plug-in foi executado com sucesso. Uma execução recente mostra o status bem-sucedido:

Recent execution status

Analise outros recursos do IATK

O aplicativo inclui exemplos de outros recursos do IATK, como gerar eventos simulados e recuperar traços do AWS X-Ray.

Limpando

Use o AWS SAM para limpar os recursos do plug-in e do testador de plug-ins da sua conta da AWS.

  1. Exclua os recursos do plug-in:
    cd ../.. # Move to the plugin directory
    sam delete # Delete the plugin
    Bash

    Deleting resources

  2. Exclua os recursos do testador de plug-ins:
    cd ../../plugin_tester # Move to the plugin tester directory
    sam delete # Delete the plugin tester
    Bash

    Deleting the tester

Os recursos de teste temporários que o IATK criou durante o teste são limpos quando o método tearDown é executado. Se houver problemas durante a desmontagem, alguns recursos podem não ser excluídos. O IATK adiciona tags a todos os recursos que ele cria. Você pode usar essas tags para localizar os recursos e removê-los manualmente. Você também pode adicionar suas próprias tags.

Conclusão

O AWS Integrated Application Test Kit é uma biblioteca de software que fornece conveniências para ajudá-lo a escrever testes automatizados para seus aplicativos em nuvem. Este blog mostra alguns dos recursos da versão inicial do IATK em Python.

Para saber mais sobre testes automatizados para aplicativos Serverless, visite serverlessland.com/testing. Você também pode ver exemplos de código em serverlessland.com/testing/patterns ou no repositório AWS serverless-test-samples no GitHub.

Para obter mais recursos de aprendizado Serverless, visite Serverless Land.

ste artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Dan Fox é principal arquiteto especializado em soluções

 

 

 

 

Brian Krygsma é arquiteto sênior de soluções

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/