

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á.

# Execute testes de unidade para trabalhos de ETL do Python AWS Glue usando a estrutura pytest
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework"></a>

*Praveen Kumar Jeyarajan e Vaidy Sankaran, da Amazon Web Services*

## Resumo
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-summary"></a>

Você pode executar testes unitários para trabalhos de extração, transformação e carregamento (ETL) do Python AWS Glue em um [ambiente de desenvolvimento local](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html), mas replicar esses testes em um DevOps pipeline pode ser difícil e demorado. O teste unitário pode ser especialmente desafiador quando você está modernizando o processo de ETL de mainframe em AWS pilhas de tecnologia. Esse padrão mostra como simplificar os testes de unidade, mantendo intactas as funcionalidades existentes, evitando interrupções nas principais funcionalidades do aplicativo ao lançar novos atributos e mantendo um software de alta qualidade. Você pode usar as etapas e os exemplos de código nesse padrão para executar testes de unidade para trabalhos de ETL do Python AWS Glue usando a estrutura pytest em. AWS CodePipeline Você também pode usar esse padrão para testar e implantar vários AWS Glue trabalhos.

## Pré-requisitos e limitações
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-prereqs"></a>

**Pré-requisitos **
+ Um ativo Conta da AWS
+ Um URI de imagem do Amazon Elastic Container Registry (Amazon ECR) para AWS Glue sua biblioteca, baixado da Galeria Pública do [Amazon](https://gallery.ecr.aws/glue/aws-glue-libs) ECR
+ Terminal Bash (em qualquer sistema operacional) com um perfil para o alvo Conta da AWS e Região da AWS
+ [Python 3.10](https://www.python.org/downloads/) ou posterior
+ [Pytest](https://github.com/pytest-dev/pytest)
+ Biblioteca [Moto](https://github.com/getmoto/moto) Python para testes Serviços da AWS

## Arquitetura
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-architecture"></a>

O diagrama a seguir descreve como incorporar testes unitários para processos de AWS Glue ETL baseados em Python em um pipeline típico AWS DevOps de escala empresarial.

![Teste unitário para processos de ETL do AWS Glue.](https://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/82781ca8-4da0-4df0-bf23-32992fece231/images/6286dafc-f1e0-4967-beed-4dedc6047c10.png)


O diagrama mostra o seguinte fluxo de trabalho:

1. No estágio de origem, AWS CodePipeline usa um bucket versionado do Amazon Simple Storage Service (Amazon S3) para armazenar e gerenciar ativos de código-fonte. Esses ativos incluem um exemplo de job (`sample.py`) de ETL em Python, um arquivo de teste unitário (`test_sample.py`) e um modelo. AWS CloudFormation Em seguida, CodePipeline transfere o código mais recente da ramificação principal para o AWS CodeBuild projeto para processamento adicional.

1. No estágio de criação e publicação, o código mais recente do estágio de origem anterior é testado em unidade com a ajuda de uma imagem AWS Glue pública do Amazon ECR. Em seguida, o relatório do teste é publicado nos grupos de CodeBuild relatórios. A imagem do contêiner no repositório público do Amazon ECR para AWS Glue bibliotecas inclui todos os binários necessários para executar tarefas ETL [PySparkbaseadas em](https://spark.apache.org/docs/latest/api/python/) testes unitários localmente. AWS Glue O repositório público de contêineres tem três tags de imagem, uma para cada versão suportada pelo AWS Glue. Para fins de demonstração, esse padrão usa a tag de imagem `glue_libs_4.0.0_image_01`. Para usar essa imagem de contêiner como imagem de tempo de execução em CodeBuild, copie o URI da imagem que corresponde à tag de imagem que você pretende usar e, em seguida, atualize o `pipeline.yml` arquivo no GitHub repositório do `TestBuild` recurso.

1. Na fase de implantação, o CodeBuild projeto é lançado e ele publica o código em um bucket do Amazon S3 se todos os testes forem aprovados.

1. O usuário implanta a AWS Glue tarefa usando o CloudFormation modelo na `deploy` pasta.

## Ferramentas
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-tools"></a>

**Serviços da AWS**
+ O [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) é um serviço de compilação totalmente gerenciado que permite compilar o código-fonte, realizar testes de unidade e produzir artefatos preparados para a implantação.
+ O [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) ajuda você a modelar e configurar rapidamente os diferentes estágios de uma versão de software, além de automatizar as etapas necessárias para a implantação contínua de alterações.
+ O [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) é um serviço gerenciado de registro de imagens de contêineres seguro, escalável e confiável.
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html)é um serviço ETL totalmente gerenciado. Ele ajuda você a categorizar de forma confiável, limpar, enriquecer e mover dados de forma confiável entre armazenamento de dados e fluxos de dados.
+ [O Amazon Simple Storage Service (Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)) é um serviço de armazenamento de objetos que oferece escalabilidade, disponibilidade de dados, segurança e desempenho líderes do setor.

**Outras ferramentas**
+ [Python](https://www.python.org/) é uma linguagem de programação interpretada de alto nível e de uso geral.
+ [Moto](https://github.com/getmoto/moto) é uma biblioteca Python para testes. Serviços da AWS
+ O [Pytest](https://github.com/pytest-dev/pytest) é uma estrutura para escrever pequenos testes unitários que se escalam para suportar testes funcionais complexos para aplicativos e bibliotecas.
+ A [biblioteca Python ETL](https://github.com/awslabs/aws-glue-libs) for AWS Glue é um repositório para bibliotecas Python que são usadas no desenvolvimento local de trabalhos em lote para. PySpark AWS Glue

**Repositório de código**

O código desse padrão está disponível no repositório GitHub [aws-glue-jobs-unit-testing](https://github.com/aws-samples/aws-glue-jobs-unit-testing). O repositório inclui os seguintes recursos:
+ Um exemplo de AWS Glue tarefa baseada em Python na pasta `src`
+ Casos de teste de unidade associados (criados usando a estrutura pytest) na pasta `tests`
+ Um CloudFormation modelo (escrito em YAML) na pasta `deploy`

## Práticas recomendadas
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-best-practices"></a>

**Segurança para CodePipeline recursos**

É uma prática recomendada usar criptografia e autenticação para os repositórios de origem que se conectam aos seus pipelines em. CodePipeline Para obter mais informações, consulte [as melhores práticas de segurança](https://docs.aws.amazon.com/codepipeline/latest/userguide/security-best-practices.html) na CodePipeline documentação.

**Monitoramento e registro de CodePipeline recursos**

É uma prática recomendada usar os recursos de AWS registro para determinar quais ações os usuários realizam em sua conta e quais recursos eles usam. Os arquivos de log exibem o seguinte:
+ Data e hora das ações.
+ Endereço IP de origem das ações
+ As ações que falharam devido a permissões inadequadas.

Os recursos de registro estão disponíveis no AWS CloudTrail Amazon CloudWatch Events. Você pode usar CloudTrail para registrar chamadas de AWS API e eventos relacionados feitos por ou em nome do seu Conta da AWS. Para obter mais informações, consulte [Logging CodePipeline API de chamadas AWS CloudTrail](https://docs.aws.amazon.com/codepipeline/latest/userguide/monitoring-cloudtrail-logs.html) na CodePipeline documentação.

Você pode usar CloudWatch Eventos para monitorar seus Nuvem AWS recursos e aplicativos em execução AWS. Você também pode criar alertas em CloudWatch Eventos. Para obter mais informações, consulte [Monitoramento de CodePipeline eventos](https://docs.aws.amazon.com/codepipeline/latest/userguide/detect-state-changes-cloudwatch-events.html) na CodePipeline documentação.

## Épicos
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-epics"></a>

### Implantar o código-fonte
<a name="deploy-the-source-code"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Prepare o arquivo de código para implantação. | 1. Faça o download `code.zip` do repositório GitHub [aws-glue-jobs-unit-testing](https://github.com/aws-samples/aws-glue-jobs-unit-testing) ou crie você mesmo o arquivo.zip usando uma ferramenta de linha de comando. Por exemplo, você pode criar o arquivo .zip no Linux ou Mac executando os seguintes comandos no terminal:<pre>git clone https://github.com/aws-samples/aws-glue-jobs-unit-testing.git<br />cd aws-glue-jobs-unit-testing<br />git checkout master<br />zip -r code.zip src/ tests/ deploy/</pre><br />2. Faça login no [Console de gerenciamento da AWS](https://aws.amazon.com/console/)e escolha o Região da AWS de sua preferência.<br />3. [Crie um bucket do Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) e, em seguida, carregue o pacote e o `code.zip` arquivo .zip (baixados anteriormente) para o bucket do Amazon S3 que você criou. | DevOps engenheiro | 
| Crie a CloudFormation pilha. | 1. Faça login no Console de gerenciamento da AWS e abra o [CloudFormation console](https://console.aws.amazon.com/cloudformation/).<br />2. Escolha **Criar pilha**, e, em seguida, selecione **Com recursos existentes (importar recursos)**.<br />3. Na seção **Especificar modelo** da página **Criar pilha**, escolha **Carregar um arquivo de modelo** e, em seguida, escolha o modelo **pipeline.yml** (baixado do repositório). GitHub Em seguida, escolha **Próximo**.<br />4. Em **Nome da pilha **glue-unit-testing-pipeline****, insira ou escolha um nome de pilha de sua preferência.<br />5. Para **ApplicationStackName**, use o nome pré-preenchido. **glue-codepipeline-app** Esse é o nome da CloudFormation pilha criada pelo pipeline.<br />6. Para **BucketName**, use o nome pré-preenchido do bucket **aws-glue-artifacts-us-east-1**. Esse é o nome do bucket do Amazon S3 que contém o arquivo.zip e é usado pelo pipeline para armazenar artefatos de código.<br />7. Para **CodeZipFile**, use o valor **code.zip** pré-preenchido. Esse é o nome da chave do objeto Amazon S3 de código de amostra. O objeto deve ser um arquivo .zip.<br />8. Para **TestReportGroupName**, use o nome pré-preenchido. **glue-unittest-report** Esse é o nome do grupo de relatórios de CodeBuild teste criado para armazenar os relatórios de teste unitário.<br />9. Escolha **Avançar** e, em seguida, escolha **Avançar** novamente na página **Configurar opções de pilha**.<br />10. Na página de **revisão**, em **Capacidades**, escolha a opção **Eu reconheço que CloudFormation pode criar recursos do IAM com nomes personalizados**.<br />11. Selecione **Enviar**. Depois que a criação da pilha for concluída, você poderá ver os recursos criados na guia **Recursos**. A pilha leva aproximadamente 5-7 minutos para ser criada.A pilha cria uma CodePipeline visualização usando o Amazon S3 como fonte. Nas etapas acima, o pipeline é **aws-glue-unit-test-pipeline**. | AWS DevOps, DevOps engenheiro | 

### Execute os testes de unidade
<a name="run-the-unit-tests"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Execute os testes de unidade no pipeline. | 1. Para testar o pipeline implantado, faça login no Console de gerenciamento da AWS e abra o [CodePipeline console](https://console.aws.amazon.com/codepipeline/).<br />2. Selecione o pipeline criado pela CloudFormation pilha e escolha **Release change**. O pipeline começa a ser executado (usando o código mais recente no bucket do Amazon S3).<br />3. Depois que a fase **Testar e compilar** for concluída, escolha a guia **Detalhes** e, em seguida, examine os logs.<br />4. Escolha a guia **Relatórios** e, em seguida, escolha o relatório de teste em **Histórico de relatórios** para visualizar os resultados do teste de unidade.<br />5. Depois que o estágio de implantação estiver concluído, execute e monitore o AWS Glue trabalho implantado no AWS Glue console. Para obter mais informações, consulte [Monitoramento AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/monitor-glue.html) na AWS Glue documentação. | AWS DevOps, DevOps engenheiro | 

### Limpe todos os AWS recursos
<a name="clean-up-all-aws-resources"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Limpe os recursos no seu ambiente. | Para evitar custos adicionais de infraestrutura, certifique-se de excluir a pilha depois de experimentar os exemplos fornecidos nesse padrão.1. Abra o [CloudFormation console](https://console.aws.amazon.com/cloudformation/) e selecione a pilha que você criou.<br />2. Escolha **Excluir**. Isso exclui todos os recursos que sua pilha criou, incluindo funções AWS Identity and Access Management (IAM), políticas e CodeBuild projetos do IAM. | AWS DevOps, DevOps engenheiro | 

## Solução de problemas
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-troubleshooting"></a>


| Problema | Solução | 
| --- | --- | 
| A função CodePipeline de serviço não pode acessar o bucket do Amazon S3. | + Para a política anexada à sua função de CodePipeline serviço, adicione `s3:ListBucket` à lista de ações em sua política. Para obter instruções sobre como visualizar a política da função de serviço, consulte [Exibir o ARN do pipeline e o ARN da função de serviço (console)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-settings-console.html). Edite a declaração de política para sua função de serviço conforme detalhado em [Adicionar permissões à função CodePipeline de serviço](https://docs.aws.amazon.com/codepipeline/latest/userguide/security-iam.html#how-to-update-role-new-services).<br />+ Para a política baseada em recursos anexada ao bucket de artefatos do Amazon S3 para seu pipeline, também chamada de política de compartimento de *artefatos*, adicione uma declaração que permita que a função de serviço use CodePipeline a permissão. `s3:ListBucket` | 
| CodePipeline retorna um erro informando que o bucket do Amazon S3 não está versionado. | CodePipeline exige que o bucket de origem do Amazon S3 seja versionado. Ative o controle de versão em seu bucket do Amazon S3. Para obter instruções, consulte [Habilitar o controle de versão em buckets.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html) | 

## Recursos relacionados
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-resources"></a>
+ [AWS Glue](https://aws.amazon.com/glue/)
+ [Desenvolvendo e testando AWS Glue trabalhos localmente](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html)
+ [AWS CloudFormation para AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/populate-with-cloudformation-templates.html)

## Mais informações
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-additional"></a>

Além disso, você pode implantar os AWS CloudFormation modelos usando o AWS Command Line Interface (AWS CLI). Para obter mais informações, consulte [Implantação rápida de modelos com transformações](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-deploy.html) na CloudFormation documentação.