Implementar o teste de ponta a ponta do Terratest em projetos do Terraform

O Terraform permite a definição, a visualização e a implantação da infraestrutura de nuvem. Usando o Terraform, você cria arquivos de configuração usando sintaxe de HCL. A sintaxe da HCL permite que você especifique o provedor de nuvem, como o Azure, e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações de infraestrutura antes de serem implantadas. Depois de verificar as alterações, aplique o plano de execução para implantar a infraestrutura.

O teste E2E (de ponta a ponta) é usado para validar se um programa funciona antes de implantá-lo na produção. Um cenário de exemplo seria um módulo do Terraform implantando duas máquinas virtuais em uma rede virtual. Talvez você queira impedir que as duas máquinas executem ping entre si. Neste exemplo, você pode definir um teste para verificar se o resultado pretendido foi alcançado antes da implantação.

O teste E2E normalmente consiste em um processo de três etapas.

  1. Uma configuração é aplicada a um ambiente de teste.
  2. O código é executado para verificar os resultados.
  3. O ambiente de teste é reinicializado ou desativado (como ao desalocar uma máquina virtual).

Neste artigo, você aprenderá como:

  • Entender os conceitos básicos de testes de ponta a ponta com o Terratest
  • Aprender a escrever um teste de ponta a ponta usando o Golang
  • Aprender a usar o Azure DevOps para disparar automaticamente testes de ponta a ponta quando o código está confirmado em seu repositório

1. Configurar seu ambiente

  • Assinatura do Azure: caso você não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.
  • Linguagem de programação Go: instalar o Go.

  • Código de exemplo e recursos: usando a ferramenta DownGit, baixe o projeto de teste de ponta a ponta do GitHub e descompacte-o em um novo diretório que conterá o código de exemplo. Esse diretório é conhecido como diretório de exemplo.

2. Entender o teste de ponta a ponta

Testes de ponta a ponta validam se um sistema funciona como um todo. Esse tipo de teste é o oposto de testar módulos específicos. Para projetos do Terraform, o teste de ponta a ponta permite a validação do que foi implantado. Esse tipo de teste difere de muitos outros tipos que testam cenários pré-implantação. Os testes de ponta a ponta são essenciais para testar sistemas complexos que incluem vários módulos e operam vários recursos. Nesses cenários, o teste de ponta a ponta é a única maneira de determinar se os vários módulos estão interagindo corretamente.

Este artigo se concentra no uso do Terratest para implementar testes de ponta a ponta. O Terratest fornece todo o direcionamento necessário para realizar a seguinte tarefa:

  • Implantar uma configuração do Terraform
  • Permite que você escreva um teste usando a linguagem Go para validar o que foi implantado
  • Orquestrar os testes em fases
  • Desmontar a infraestrutura implantada

3. Entender o teste de exemplo

Para este artigo, estamos usando um exemplo disponível no repositório de exemplo Azure/terraform.

Este exemplo define uma configuração do Terraform que implanta duas máquinas virtuais do Linux na mesma rede virtual. Uma VM, denominada vm-linux-1, tem endereço IP público definido. Somente a porta 22 está aberta para permitir conexões SSH. A segunda VM, vm-linux-2, não tem endereço IP público definido.

O teste valida os seguintes cenários:

  • A infraestrutura foi implantada corretamente
  • Usando a porta 22, é possível abrir uma sessão SSH para vm-linux-1
  • Usando a sessão SSH em vm-linux-1, é possível executar ping em vm-linux-2

Sample end-to-end test scenario

Se você baixou o exemplo, a configuração do Terraform para esse cenário pode ser encontrada no arquivo src/main.tf. O arquivo main.tf contém tudo o que é necessário para implantar a infraestrutura do Azure representada na figura anterior.

Se você não sabe como criar uma máquina virtual, confira Criar uma VM do Linux com infraestrutura no Azure usando o Terraform.

Cuidado

O cenário de exemplo apresentado neste artigo é apenas para fins ilustrativos. Nós procuramos manter as coisas simples para se concentrar nas etapas do teste de ponta a ponta. Não é recomendável ter máquinas virtuais de produção que exponham portas SSH em um endereço IP público.

4. Examinar o teste de exemplo

O teste de ponta a ponta é escrito em linguagem Go e usa a estrutura do Terratest. Se você baixou o exemplo, o teste estará definido no arquivo src/test/end2end_test.go.

O seguinte código-fonte mostra a estrutura padrão de um teste da Golang usando o 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 você pode ver no snippet de código anterior, o teste é composto por três fases:

  • setup: Executa o Terraform para implantar a configuração
  • validate': Verifica e faz as afirmações de validação
  • Demolição: limpa a infraestrutura após a execução do teste

A seguinte lista mostra algumas das principais funções fornecidas pela estrutura do Terratest:

  • terraforme. InitAndApply: Habilita a execução terraform init e terraform apply o código Go
  • terraforme. Saída: recupera o valor da variável de saída de implantação.
  • terraforme. Destruir: Executa o terraform destroy comando do código Go.
  • test_structure. LoadTerraformOptions: Carrega opções do Terraform - como configuração e variáveis - do estado
  • test_structure. SaveTerraformOptions: Salva as opções do Terraform - como configuração e variáveis - no estado

5. Executar o teste de exemplo

As etapas a seguir executam o teste em relação à configuração e à implantação de exemplo.

  1. Abra uma janela bash/terminal.

  2. Faça logon na sua conta do Azure.

  3. Para executar este teste de exemplo, você precisa de um nome de par de chaves privadas/públicas SSH id_rsa e id_rsa.pub em seu diretório base. Substitua <your_user_name> pelo nome de seu diretório base.

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. No diretório de exemplo, acesse o diretório src/test.

  5. Execute o teste.

    go test -v ./ -timeout 10m
    

6. Verificar os resultados

Depois de executar go test com sucesso, você verá resultados semelhantes à seguinte saída:

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

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure

Próximas etapas