Implementación de pruebas integrales de Terratest 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 integrales 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.
- La configuración se aplica a un entorno de prueba.
- El código se ejecuta para verificar los resultados.
- El entorno de prueba se reinicializará o se desactivará (por ejemplo, se puede 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.
Configuración de Terraform: si aún no lo ha hecho, configure Terraform con una de las siguientes opciones:
Lenguaje de programación Go: instale Go.
Código de ejemplo y recursos: use la herramienta DownGit para descargar de GitHub el proyecto de pruebas integrales 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. Descripción de las pruebas integrales
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. Descripción del ejemplo de prueba
En este artículo, vamos a usar un ejemplo disponible en el repositorio de muestra 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 envm-linux-2
.
Si descargó la muestra, puede encontrar la configuración de Terraform para este escenario en el archivo src/main.tf
. El archivo main.tf
contiene todo lo necesario para implementar la infraestructura de Azure representada en la figura anterior.
Si no tiene experiencia en la creación de máquinas virtuales, 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 está definida en el archivo src/test/end2end_test.go
.
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 comprobaciones de validación y las aserciones.
- desmontaje: limpia la infraestructura después de que se haya ejecutado la prueba.
En la lista siguiente se muestran algunas de las funciones clave que proporciona el marco de trabajo de Terratest:
- terraform. InitAndApply: habilita la ejecución
terraform init
yterraform apply
desde el código de Go - terraform. Salida: recupera el valor de la variable de salida de implementación.
- terraform. Destroy: ejecuta el
terraform destroy
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, ejecutará la prueba con la configuración y la implementación de muestra.
Abra una ventana de Bash/terminal.
Inicio de sesión en la cuenta de Azure
Para ejecutar esta prueba de ejemplo, necesita un nombre de par de claves pública y privada SSH
id_rsa
yid_rsa.pub
en el directorio principal. Reemplace<your_user_name>
por el nombre del directorio principal.export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
En el directorio de ejemplo, vaya al directorio
src/test
.Ejecute la prueba.
go test -v ./ -timeout 10m
6. Verificación de los resultados
Tras ejecutar go test
correctamente, 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