

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.

# Ejecute pruebas unitarias para trabajos ETL de Python AWS Glue utilizando el marco pytest
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework"></a>

*Praveen Kumar Jeyarajan y Vaidy Sankaran, Amazon Web Services*

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

Puede ejecutar pruebas unitarias para trabajos de extracción, transformación y carga (ETL) de Python AWS Glue en un [entorno de desarrollo local](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html), pero replicar esas pruebas en una DevOps canalización puede resultar difícil y llevar mucho tiempo. Las pruebas unitarias pueden resultar especialmente complicadas cuando se moderniza el proceso de ETL de un mainframe basándolo en AWS tecnologías. Este patrón le muestra cómo simplificar las pruebas unitarias y, al mismo tiempo, mantener intacta la funcionalidad existente, evitar interrupciones de funcionalidad de la aplicaciones clave cuando se lanzan nuevas características y mantener un software de alta calidad. Puede usar los pasos y los ejemplos de código de este patrón para ejecutar pruebas unitarias para trabajos ETL de Python AWS Glue utilizando el marco pytest en AWS CodePipeline. También puedes usar este patrón para probar e implementar varios AWS Glue trabajos.

## Requisitos previos y limitaciones
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS
+ Un URI de imagen de Amazon Elastic Container Registry (Amazon ECR) para AWS Glue su biblioteca, descargado de la galería pública de [Amazon](https://gallery.ecr.aws/glue/aws-glue-libs) ECR
+ Un terminal Bash (en cualquier sistema operativo) con un perfil para el destino y Cuenta de AWS Región de AWS
+ [Python 3.10](https://www.python.org/downloads/) o posterior
+ [Pytest](https://github.com/pytest-dev/pytest)
+ Biblioteca [Moto](https://github.com/getmoto/moto) Python para pruebas Servicios de AWS

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

El siguiente diagrama describe cómo incorporar las pruebas unitarias para los procesos de AWS Glue ETL basados en Python en una canalización típica de escala empresarial AWS DevOps .

![Pruebas unitarias para los procesos de ETL de AWS Glue](https://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/82781ca8-4da0-4df0-bf23-32992fece231/images/6286dafc-f1e0-4967-beed-4dedc6047c10.png)


En el diagrama, se muestra el siguiente flujo de trabajo:

1. En la fase de código fuente, AWS CodePipeline utiliza un bucket versionado de Amazon Simple Storage Service (Amazon S3) para almacenar y gestionar los activos del código fuente. Estos activos incluyen un ejemplo de trabajo ETL de Python (`sample.py`), un archivo de prueba unitaria (`test_sample.py`) y una AWS CloudFormation plantilla. A continuación, CodePipeline transfiere el código más reciente de la rama principal al AWS CodeBuild proyecto para su posterior procesamiento.

1. En la fase de creación y publicación, el código más reciente de la fase fuente anterior se somete a pruebas unitarias con la ayuda de una imagen AWS Glue pública de Amazon ECR. A continuación, el informe de la prueba se publica en los grupos de CodeBuild informes. La imagen del contenedor del repositorio público de Amazon ECR para AWS Glue bibliotecas incluye todos los binarios necesarios para ejecutar tareas ETL [PySparkbasadas](https://spark.apache.org/docs/latest/api/python/) en AWS Glue pruebas unitarias de forma local. El repositorio de contenedores público tiene tres etiquetas de imagen, una para cada versión compatible con AWS Glue. Con fines de demostración, este patrón usa la etiqueta de imagen `glue_libs_4.0.0_image_01`. Para usar esta imagen de contenedor como imagen en tiempo de ejecución CodeBuild, copie el URI de la imagen que corresponda a la etiqueta de imagen que pretende usar y, a continuación, actualice el `pipeline.yml` archivo en el GitHub repositorio del recurso. `TestBuild`

1. En la fase de despliegue, el CodeBuild proyecto se lanza y publica el código en un bucket de Amazon S3 si se aprueban todas las pruebas.

1. El usuario implementa la AWS Glue tarea mediante la CloudFormation plantilla de la `deploy` carpeta.

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

**Servicios de AWS**
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) es un servicio de compilación completamente administrado que le permite compilar código fuente, poner en marcha pruebas unitarias y producir artefactos listos para implementar.
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) permite diseñar y configurar rápidamente las diferentes etapas de un proceso de lanzamiento de software y automatizar los pasos necesarios para lanzar los cambios en el software de manera continua.
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable.
+ [AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/what-is-glue.html) es un servicio de ETL completamente administrado. Ayuda a clasificar, limpiar, enriquecer y mover datos de forma fiable entre almacenes de datos y flujos de datos.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) es un servicio de almacenamiento de objetos que ofrece escalabilidad, disponibilidad de datos, seguridad y rendimiento líderes del sector.

**Otras herramientas**
+ [Python](https://www.python.org/) es un lenguaje de programación de uso general interpretado de alto nivel.
+ [Moto](https://github.com/getmoto/moto) es una biblioteca de Python para realizar pruebas Servicios de AWS.
+ [Pytest](https://github.com/pytest-dev/pytest) es un marco para escribir pruebas unitarias pequeñas que se escalan para permitir pruebas funcionales complejas para aplicaciones y bibliotecas.
+ La [biblioteca ETL de Python](https://github.com/awslabs/aws-glue-libs) para AWS Glue es un repositorio de bibliotecas de Python que se utilizan en el desarrollo local de trabajos PySpark por lotes para AWS Glue.

**Repositorio de código**

El código de este patrón está disponible en el repositorio GitHub [aws-glue-jobs-unit-testing](https://github.com/aws-samples/aws-glue-jobs-unit-testing). El repositorio incluye los siguientes recursos:
+ Un ejemplo de AWS Glue trabajo basado en Python en la carpeta `src`
+ Los casos de pruebas unitarias asociados (creados con el marco pytest) están en la carpeta `tests`
+ Una CloudFormation plantilla (escrita en YAML) en la carpeta `deploy`

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

**Seguridad de los recursos CodePipeline **

Se recomienda utilizar el cifrado y la autenticación en los repositorios de origen que se conectan a tus canalizaciones. CodePipeline Para obtener más información, consulta [las prácticas recomendadas de seguridad](https://docs.aws.amazon.com/codepipeline/latest/userguide/security-best-practices.html) en la CodePipeline documentación.

**Supervisión y registro de los CodePipeline recursos**

Se recomienda utilizar las funciones de AWS registro para determinar qué acciones realizan los usuarios en tu cuenta y qué recursos utilizan. Los archivos de registro muestran lo siguiente:
+ La fecha y la hora de las acciones
+ Dirección IP de origen de las acciones
+ Las acciones que han fallado debido a permisos inadecuados

Las funciones de registro están disponibles en AWS CloudTrail Amazon CloudWatch Events. Puede utilizarlas CloudTrail para registrar las llamadas a la AWS API y los eventos relacionados realizados por usted o en su nombre Cuenta de AWS. Para obtener más información, consulta Cómo [registrar las llamadas a la CodePipeline API AWS CloudTrail](https://docs.aws.amazon.com/codepipeline/latest/userguide/monitoring-cloudtrail-logs.html) en la CodePipeline documentación.

Puede usar CloudWatch Events para supervisar Nube de AWS los recursos y las aplicaciones que se estén ejecutando AWS. También puede crear alertas en CloudWatch Eventos. Para obtener más información, consulte [Supervisión de CodePipeline eventos](https://docs.aws.amazon.com/codepipeline/latest/userguide/detect-state-changes-cloudwatch-events.html) en la CodePipeline documentación.

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

### Implementar el código fuente
<a name="deploy-the-source-code"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Prepare el archivo de códigos para su implementación. | 1. Descárguelo `code.zip` del repositorio GitHub [aws-glue-jobs-unit-testing](https://github.com/aws-samples/aws-glue-jobs-unit-testing) o cree el archivo.zip usted mismo mediante una herramienta de línea de comandos. Por ejemplo, puede crear el archivo .zip en Linux o Mac ejecutando los siguientes comandos en la 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. Inicie sesión en [Consola de administración de AWS](https://aws.amazon.com/console/)y elija el que prefiera. Región de AWS <br />3. [Cree un bucket de S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) y, a continuación, cargue el paquete .zip y el archivo `code.zip` (descargados anteriormente) en el bucket de Amazon S3 creado. | DevOps ingeniero | 
| Crea la CloudFormation pila. | 1. Inicie sesión en la [CloudFormation consola Consola de administración de AWS y, a continuación, ábrala](https://console.aws.amazon.com/cloudformation/).<br />2. Elija **Create stack** (Crear pila) y, a continuación, seleccione **With existing resources (import resources)** (Con recursos existentes (importar recursos)).<br />3. En la sección **Especificar la plantilla** de la página **Crear pila**, selecciona **Cargar un archivo de plantilla** y, a continuación, elige la plantilla **pipeline.yml** (descargada del repositorio). GitHub A continuación, elija **Siguiente**.<br />4. En **Nombre de pila **glue-unit-testing-pipeline****, introduce o elige el nombre de pila que prefieras.<br />5. Para **ApplicationStackName**, usa el **glue-codepipeline-app**nombre rellenado previamente. Este es el nombre de la CloudFormation pila que crea la canalización.<br />6. Para ello **BucketName**, usa el nombre del bucket **aws-glue-artifacts-us-east-1** rellenado previamente. Este es el nombre del bucket de Amazon S3 que contiene el archivo .zip y que la canalización utiliza para almacenar artefactos de código.<br />7. **Para **CodeZipFile**, utilice el valor code.zip rellenado previamente.** Este es el nombre de la clave del objeto de Amazon S3 del código de ejemplo. El objeto debe ser un archivo .zip.<br />8. Para **TestReportGroupName**, utilice el nombre rellenado previamente **glue-unittest-report**. Es el nombre del grupo de informes de CodeBuild pruebas que se creó para almacenar los informes de las pruebas unitarias.<br />9. Seleccione **Next** (Siguiente) y, a continuación, vuelva a seleccionar **Next** (Siguiente) en la página **Configure stack options** (Configurar opciones de pila).<br />10. En la página de **revisión**, en **Capacidades**, elija la opción **Reconozco que CloudFormation podría crear recursos de IAM con nombres personalizados**.<br />11. Elija **Submit** (Enviar). Una vez finalizada la creación de la pila, podrá ver los recursos creados en la pestaña **Resources** (Recursos). Las pilas tardan aproximadamente entre 5 y 7 minutos en crearse.La pila crea una CodePipeline vista con Amazon S3 como fuente. En los pasos anteriores, la canalización es **aws-glue-unit-test-pipeline**. | AWS DevOps, DevOps ingeniero | 

### Ejecute las pruebas unitarias
<a name="run-the-unit-tests"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Ejecute las pruebas unitarias en la canalización. | 1. Para probar la canalización implementada, inicie sesión en la [CodePipeline consola y Consola de administración de AWS, a continuación, ábrala](https://console.aws.amazon.com/codepipeline/).<br />2. Selecciona la canalización creada por la CloudFormation pila y, a continuación, selecciona **Release change**. La canalización comienza a ponerse en marcha (utilizando el código más reciente del bucket de Amazon S3).<br />3. Una vez finalizada la etapa de **Test\_and\_build**, seleccione la pestaña **Details** (Detalles) y, a continuación, examine los registros.<br />4. Seleccione la pestaña **Reports** (Informes) y, a continuación, elija el informe de prueba en el **Report history** (Historial de informes) para ver los resultados de las pruebas unitarias.<br />5. Una vez finalizada la fase de despliegue, ejecute y supervise el AWS Glue trabajo desplegado en la AWS Glue consola. Para obtener más información, consulte [Supervisión AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/monitor-glue.html) en la AWS Glue documentación. | AWS DevOps, DevOps ingeniero | 

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


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Limpie los recursos del entorno. | Para evitar costos de infraestructura adicionales, asegúrese de eliminar la pila después de experimentar con los ejemplos que se proporcionan en este patrón.1. Abre la [CloudFormation consola](https://console.aws.amazon.com/cloudformation/) y, a continuación, selecciona la pila que has creado.<br />2. Elija **Eliminar**. De este modo, se eliminan todos los recursos que creó tu pila, incluidos los roles AWS Identity and Access Management (de IAM), las políticas de IAM y los proyectos. CodeBuild  | AWS DevOps, DevOps ingeniero | 

## Resolución de problemas
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-troubleshooting"></a>


| Problema | Solución | 
| --- | --- | 
| El rol CodePipeline de servicio no puede acceder al bucket de Amazon S3. | + Para la política asociada a su función de CodePipeline servicio, `s3:ListBucket` añádala a la lista de acciones de su política. Para obtener instrucciones sobre cómo ver la política de roles de servicio, consulte [View the pipeline ARN and service role ARN (console)](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-settings-console.html). Edita la declaración de política de tu función de servicio tal y como se detalla en [Añadir permisos a la función CodePipeline de servicio](https://docs.aws.amazon.com/codepipeline/latest/userguide/security-iam.html#how-to-update-role-new-services).<br />+ En el caso de la política basada en recursos que se adjunta al depósito de artefactos de Amazon S3 de su canalización, también denominada *política de cubos de artefactos*, añada una declaración que permita al rol de CodePipeline servicio utilizar el permiso. `s3:ListBucket` | 
| CodePipeline devuelve un error que indica que el bucket de Amazon S3 no está versionado. | CodePipeline requiere que el bucket Amazon S3 de origen esté versionado. Habilite el control de versiones en el bucket de origen de Amazon S3 Para obtener instrucciones, consulte [Habilitar el control de versiones en 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/)
+ [Desarrollar y probar AWS Glue trabajos a nivel local](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)

## Información adicional
<a name="run-unit-tests-for-python-etl-jobs-in-aws-glue-using-the-pytest-framework-additional"></a>

Además, puede implementar las AWS CloudFormation plantillas mediante AWS Command Line Interface (AWS CLI). Para obtener más información, consulte [Implementación rápida de plantillas con transformaciones](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-cli-deploy.html) en la CloudFormation documentación.