Implementación de pruebas de Terratest de un extremo a otro en proyectos de Terraform

Las pruebas de un extremo a otro (E2E) se usan 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 recomendable evitar que las dos máquinas se envíen 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. Una configuración se aplica a un entorno de prueba.
  2. El código se ejecuta para comprobar los resultados.
  3. El entorno de prueba se reinicializa o se desasigna (por ejemplo, desasignar una máquina virtual).

En este artículo aprenderá a:

  • Descripción de los conceptos básicos de las pruebas de un extremo a otro con Terratest
  • Obtenga información sobre cómo escribir pruebas de un extremo a otro mediante Golang
  • Aprenda a usar Azure DevOps para desencadenar automáticamente pruebas de un extremo a otro cuando se confirma el código en el repositorio.

1. Configurar su entorno

  • Suscripción de Azure: Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Lenguaje de programación Go: instale Go.

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

2. Comprender las pruebas de un extremo a otro

Las pruebas de un extremo a otro validan que un sistema funciona como un conjunto colectivo. Este tipo de prueba es distinto a los módulos específicos de prueba. En el caso de los proyectos de Terraform, las pruebas de un extremo a otro permiten la validación de lo que se ha implementado. Este tipo de prueba difiere de muchos otros tipos que prueban los escenarios anteriores a la implementación. Las pruebas de un extremo a otro son fundamentales para probar sistemas complejos que incluyen varios módulos y actúan en varios recursos. En estos escenarios, las pruebas de un extremo a otro son la única manera de determinar si los distintos módulos interactúan correctamente.

Este artículo se centra en el uso de Terratest para implementar pruebas de un extremo a otro. Terratest proporciona todas las canalizaciones necesarias para realizar la siguiente tarea:

  • Implementación de una configuración de Terraform
  • Permite escribir una prueba mediante el lenguaje Go para validar lo que se ha implementado.
  • Orquestación de pruebas en fases
  • Desglose de la infraestructura implementada

3. Comprender el ejemplo de prueba

En este artículo, vamos a usar un ejemplo disponible en el repositorio de ejemplo de 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 VM con el nombre vm-linux-1 tiene una dirección IP pública. Solo se abre el puerto 22 para permitir conexiones SSH. La segunda VM vm-linux-2 no tiene ninguna dirección IP pública definida.

La prueba valida los siguientes escenarios:

  • La infraestructura está implementada correctamente.
  • Con el puerto 22, es posible abrir una sesión SSH en vm-linux-1.
  • Mediante la sesión SSH en vm-linux-1, es posible hacer ping en vm-linux-2.

Escenario de prueba de un extremo a otro de muestra

Si descargó el ejemplo, la configuración de Terraform para este escenario se puede encontrar en el 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 que se presenta en este artículo tiene una finalidad meramente informativa. Hemos simplificado las cosas con el fin de centrarnos en los pasos de una prueba de un extremo a otro. 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. Examen del ejemplo de prueba

La prueba de un extremo a otro está escrita en el lenguaje Go y usa el marco Terratest. Si descargó el ejemplo, la prueba se define en el archivo .

En el código fuente siguiente se muestra la estructura estándar de una prueba de Golang con 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 puede ver en el fragmento de código anterior, la prueba se compone de tres fases:

  • setup: ejecuta Terraform para implementar la configuración.
  • validate: realiza las aserciones y comprobaciones de validación.
  • teardown: limpia la infraestructura una vez ejecutada la prueba.

En la lista siguiente se muestran algunas de las funciones clave que proporciona el marco de trabajo de Terratest:

  • terraform. InitAndApply: permiteejecutar y desde el código de terraform apply Go
  • terraform.Output: Recupera el valor de la variable de salida de la implementación.
  • terraform. Destroy:ejecuta el comando desde el código de 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. Ejecución del ejemplo de prueba

En los pasos siguientes se ejecuta la prueba con la configuración y la implementación de ejemplo.

  1. Abra una ventana de Bash/terminal.

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

  3. Para ejecutar esta prueba de ejemplo, necesita un nombre de par de claves pública y privada SSH id_rsa y id_rsa.pub en el directorio principal. Reemplace <your_user_name> por el nombre del directorio principal.

    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. Verificación de los resultados

Después de ejecutar correctamente go test , verá resultados similares a la siguiente salida:

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