Compartir a través de


Implemente pruebas de Terratest de extremo a extremo en proyectos de Terraform

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

Las pruebas de extremo a extremo (E2E) se utilizan para validar que un programa funciona antes de implementarlo en producción. Un escenario de ejemplo podría ser un módulo de Terraform que implementa dos máquinas virtuales en una red virtual. Es posible que quiera impedir que las dos máquinas se hagan ping entre sí. En este ejemplo, podría definir una prueba para comprobar el resultado previsto antes de la implementación.

Las pruebas de E2E suelen ser un proceso de tres pasos.

  1. Se aplica una configuración a un entorno de prueba.
  2. Se ejecuta código para comprobar los resultados.
  3. El entorno de prueba se reinicializa o se desactiva (por ejemplo, mediante la desasignación de una máquina virtual).

En este artículo aprenderá a:

  • Comprenda los conceptos básicos de las pruebas de extremo a extremo con Terratest
  • Aprenda a escribir pruebas de extremo a extremo con Golang
  • Aprenda a usar Azure DevOps para desencadenar automáticamente pruebas de un extremo a otro cuando el código se confirma en el repositorio

1. Configuración del entorno

  • Suscripción de Azure: si no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.
  • Lenguaje de programación Go: Instalar Go.

  • Ejemplo de código y recursos: Con la herramienta DownGit, descargue de GitHub el proyecto de pruebas de extremo a extremo y descomprímalo en un nuevo directorio para que contenga el código de ejemplo. Este directorio se conoce como directorio de ejemplo.

2. Comprender las pruebas de extremo a extremo

Las pruebas de extremo a extremo validan que un sistema funciona como un todo colectivo. Este tipo de prueba es lo opuesto a la prueba de módulos específicos. Para los proyectos de Terraform, las pruebas de extremo a extremo permiten la validación de lo que se ha implementado. Este tipo de prueba difiere de muchos otros tipos que prueban escenarios previos a la implementación. Las pruebas de extremo a extremo son fundamentales para probar sistemas complejos que incluyen varios módulos y actúan sobre varios recursos. En tales escenarios, las pruebas de extremo a extremo son la única forma de determinar si los distintos módulos están interactuando correctamente.

Este artículo se centra en el uso de Terratest para implementar pruebas de extremo a extremo. Terratest proporciona toda la plomería que se requiere para realizar la siguiente tarea:

  • Implementación de una configuración de Terraform
  • Permite escribir una prueba con el lenguaje Go para validar lo que se ha implementado
  • Organice las pruebas en etapas
  • Desmantelar la infraestructura implementada

3. Comprender el ejemplo de prueba

Para este artículo, usaremos un ejemplo disponible en el repositorio de ejemplo Azure/terraform.

En este ejemplo se define una configuración de Terraform que implementa dos máquinas virtuales Linux en la misma red virtual. Una máquina virtual, con nombre vm-linux-1 , tiene una dirección IP pública. Solo se abre el puerto 22 para permitir conexiones SSH. La segunda máquina virtual - vm-linux-2 - no tiene ninguna dirección IP pública definida.

La prueba valida los siguientes escenarios:

  • La infraestructura se despliega correctamente
  • Usando el puerto 22, es posible abrir una sesión SSH para vm-linux-1
  • Usando la sesión SSH en vm-linux-1, es posible hacer ping vm-linux-2

Ejemplo de escenario de prueba de un extremo a otro

Si descargó el ejemplo, la configuración de Terraform para este escenario se puede encontrar en el src/main.tf archivo. El main.tf archivo contiene todo lo necesario para implementar la infraestructura de Azure representada en la ilustración anterior.

Si no está familiarizado con cómo crear una máquina virtual, consulte Creación de una máquina virtual Linux con infraestructura en Azure mediante Terraform.

Precaución

El escenario de ejemplo presentado en este artículo es solo para fines ilustrativos. Hemos simplificado las cosas a propósito para centrarnos en los pasos de una prueba de extremo a extremo. No se recomienda tener máquinas virtuales de producción que expongan puertos SSH a través de una dirección IP pública.

4. Examine el ejemplo de prueba

La prueba de extremo a extremo está escrita en el lenguaje Go y utiliza el marco Terratest. Si descargó el ejemplo, la prueba se define en el src/test/end2end_test.go archivo.

El siguiente código fuente muestra la estructura estándar de una prueba de Golang utilizando Terratest:

package test

import (
    "testing"

    "github.com/gruntwork-io/terratest/modules/terraform"
    test_structure "github.com/gruntwork-io/terratest/modules/test-structure"
)

func TestEndToEndDeploymentScenario(t *testing.T) {
    t.Parallel()

    fixtureFolder := "../"

    // Use Terratest to deploy the infrastructure
    test_structure.RunTestStage(t, "setup", func() {
        terraformOptions := &terraform.Options{
            // Indicate the directory that contains the Terraform configuration to deploy
            TerraformDir: fixtureFolder,
        }

        // Save options for later test stages
        test_structure.SaveTerraformOptions(t, fixtureFolder, terraformOptions)

        // Triggers the terraform init and terraform apply command
        terraform.InitAndApply(t, terraformOptions)
    })

    test_structure.RunTestStage(t, "validate", func() {
        // run validation checks here
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
		    publicIpAddress := terraform.Output(t, terraformOptions, "public_ip_address")
    })

    // When the test is completed, teardown the infrastructure by calling terraform destroy
    test_structure.RunTestStage(t, "teardown", func() {
        terraformOptions := test_structure.LoadTerraformOptions(t, fixtureFolder)
        terraform.Destroy(t, terraformOptions)
    })
}

Como puedes ver en el fragmento de código anterior, la prueba se compone de tres etapas:

  • setup: Ejecuta Terraform para desplegar la configuración
  • validate': ¿Las comprobaciones y aserciones de validación
  • desmontaje: limpia la infraestructura después de que se haya ejecutado la prueba

La siguiente lista muestra algunas de las funciones clave proporcionadas por el marco Terratest:

  • terraforme. InitAndApply: habilita la ejecución terraform init y terraform apply desde el código Go
  • terraforme. Salida: Recupera el valor de la variable de salida de implementación.
  • terraforme. Destruir: Ejecuta el comando desde el terraform destroy código Go.
  • test_structure. LoadTerraformOptions: Carga las opciones de Terraform, como la configuración y las variables, desde el estado
  • test_structure. SaveTerraformOptions: Guarda las opciones de Terraform, como la configuración y las variables, en el estado

5. Ejecute el ejemplo de prueba

En los pasos siguientes se ejecuta la prueba en la configuración e implementación de ejemplo.

  1. Abra una ventana bash/terminal.

  2. Inicio de sesión en la cuenta de Azure

  3. Para ejecutar esta prueba de ejemplo, necesita un nombre id_rsa de par de claves privadas/públicas SSH y id_rsa.pub estar en su directorio principal. Reemplácelo <your_user_name> con el nombre de su directorio de inicio.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. En el directorio de ejemplo, vaya al directorio src/test.

  5. Ejecute la prueba.

    go test -v ./ -timeout 10m
    

6. Comprobación de los resultados

Después de ejecutarse go testcorrectamente, verá resultados similares a los siguientes resultados:

--- PASS: TestEndToEndDeploymentScenario (390.99s)
PASS
ok      test    391.052s

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes