Test de integración en los procesos de integración continua con Azure Devops
En un proyecto de programación, es muy recomendable que exista un proceso de integración continua para verificar que el código que se encuentra en el repositorio compila. En este proceso de validación generalmente se suele incluir la ejecución de test unitarios. Estos test verifican una parte de la aplicación y no todo en su conjunto.
Los test de integración, como su nombre indica (integran) son los encargados de probar varios módulos o funcionalidades de la aplicación. Uno de los ejemplos más claros de estos test es probar la conexión e integración con una base de datos.
Hay varios programas que nos permiten realizar los procesos de integración continua como Jenkins, Team City, Azure Devops, …. En el caso de este artículo nos vamos a centrar en Azure Devops, en posteriores veremos las demás opciones. Con Azure Devops tenemos las siguientes opciones para poder realizar los Test de integración contra una base de datos:
- Crear una base de datos en Azure SQL Database.
- En una máquina virtual e Azure tener instalado el SQL Server y el Agente de Azure Devops.
- Utilizar un contenedor de Docker que contenga la base de datos.
Nos vamos a fijar en este último punto. En el ejemplo que voy a explicar paso a paso, voy a partir de una aplicación .Net (framework 4.6.2) contra una base de datos SQL Server y con Test de integración.
Creación de la aplicación
Lo primero que se tiene que hacer es crear la aplicación con test de integración. Importante, el código se tiene que subir al repositorio de código de donde la integración continua lo va a recuperar para ejecutar el proceso de compilación.
El ejemplo es muy sencillo, primero por medio de Entity Framework se inserta un registro en la base de datos y luego se recupera de la base de datos para verificar el test.
Crear el script de sql
En el mismo repositorio en el que se encuentra la aplicación se tiene que crear un script de sql para crear la base de datos contra la que se va a realizar los test.
Crear el fichero Dockerfile
En el mismo repositorio y al lado del script que se ha creado en el punto anterior tenemos que crear el fichero Dockerfile que va a ser el encargado de crear la imagen con la base de datos.
Tenemos que tener en cuenta que tipo de agente va a realizar la compilación. Si la compilación la va a realizar un agente de Windows, se tiene que seleccionar una imagen de sql server de tipo Windows, si fuera de tipo Linux se tendría que seleccionar una imagen de sql server sobre Linux.
En el ejemplo, se selecciona una imagen de Sql Server sobre Windows ya que la aplicación que se va a compilar esta creada en Net Framework 4.6.2 y solo corre sobre Windows.
Una vez seleccionado el FROM en el fichero Dockerfile por medio del comando FROM, se tiene que realizar los siguientes pasos:
- Copiar el script de creación de la base de datos por medio del comando COPY.
- Establecer las variables de entorno: ACCEPT_EULA=Y para indicar que aceptamos la licencia SA_PASSWORD para establecer la contraseña del administrador (sa)
- Y por último ejecutamos el script con la herramienta sqlcmd
Con este simple fichero Dockerfile nos va a permitir crear una imagen personalizada de Sql Server.
Creación del pipeline
A continuación se tiene que crear un nuevo pipeline para la creación de build y ejecución de los test. En el pipeline primero se descargará el código del repositorio fuente y luego se ejecutará la compilación del código
A continuación añadimos una nueva tarea Docker para la creación de la imagen.
En esta tarea se configura la creación de la imagen. Hay varios grupos de propiedades a configurar:
- Display name: el nombre de la tarea
- Container Registry: contiene todas las propiedades de los registros de la imagen tanto para descargar como para subir. Container register type: indica el tipo de registro donde puede almacenar u obtener la imagen. Podemos seleccionar entre dos valores: Azure Container Register: es el registro de contenedores en Azure. En el campo siguiente se tiene que indicar la suscripción de Azure. Container Registry: otro registro de imágenes. Si indicamos este, se tiene que indicar la url y las credenciales de acceso. Azure container registry: es el nombre del registro de contenedores de azure donde se puede almacenar la imagen si se selecciona un comando push
- Commands: en este grupo de propiedades se configura las propiedades del comando a ejecutar. Los comandos que se pueden ejecutar son (build, tag, run, push, login y logout). Para crear la imagen seleccionamos las siguientes opciones: Seleccionamos el comando build para construir la imagen Seleccionamos el fichero Dockerfile que se quiere utilizar para construir la imagen. Si tenemos que pasar algún argumento para la construcción de la imagen se indica en el campo Arguments. Para utilizar el contexto actual para crear la imagen se tiene que activar el checkbox Use Default build context. Y por último indicamos en nombre de la imagen.
A continuación se vuelve a añadir una nueva tarea de tipo Docker. En esta tarea se va a crear el contenedor con la imagen creada en la tarea anterior. A diferencia del anterior, tenemos que seleccionar la opción Run en el comando. Las propiedades relacionadas con Container Registry son las mismas que en el caso anterior. Las propiedades que se tiene que configurar para el comando run son:
- Puedes indicar los parámetros del comando en la opción Arguments.
- Se tiene que indicar el nombre de la imagen de la que se quiere ejecutar el comando en la opción Image name.
- Los puertos que se quiere mapear en la opción Ports.
- Los volúmenes que necesitamos configurar en la opción Volumenes.
- Las variables de entorno necesarias en la opción Environment Variables.
- El directorio de trabajo en la opción Working Directory.
- El comando a ejecutar cuando se arranque el contenedor en la opción Entry Point override.
- Si el comando se tiene que ejecutar en segundo plano seleccionando la opción Run in background.
Ya por último tenemos que crear la tarea que se va a ejecutar los test. Una cosa que tenemos que tener en cuenta que en la cadena de conexión con la base de datos en la aplicación es que apunte a la “localhost, 15000” que es el puerto que se ha configurado en el punto anterior. Si no se cambia esta dirección en el código o en el fichero de configuración los test nunca se ejecutarán de forma satisfactoria por que no van a encontrar la base de datos.
Ejecución de la build
Ahora solo nos falta ejecutar la build para verificar que los test se han ejecutado de forma satisfactoria.
Una vez finalizada la ejecución de la build se puede verificar que el paso encargado de crear la build puede tardar bastante más tiempo que el resto, esto es porque se tiene que bajar la imagen base para poder crear la imagen, y dependiendo de la imagen y sistema operativo esta pesa más o menos. En nuestro ejemplo se puede ver que tarda unos 16 minutos
En la parte superior de la ejecución de la build, está la opción Tests. Una vez pulsamos en el podemos ver cómo nos aparece el resultado de la ejecución de los test.
Conclusión
Como habéis podido leer, la forma de crear test de integración contra un contenedor docker que contenga cualquier base datos es bastante fácil de configurar y ejecutar en Azure Devops. En el ejemplo nos hemos basado en una base de datos sql server, pero se podría haber utilizado cualquier otra como MySql, Maria DB, PostgreSql, etc.