Implementar testes Terratest de ponta a ponta em projetos Terraform

Terraform permite a definição, visualização e implantação de infraestrutura em nuvem. Usando Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe HCL permite especificar 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 na infraestrutura antes que elas sejam implantadas. Depois de verificar as alterações, você aplica o plano de execução para implantar a infraestrutura.

O teste de ponta a ponta (E2E) é usado para validar o funcionamento de um programa antes de implantá-lo na produção. Um cenário de exemplo pode ser um módulo Terraform implantando duas máquinas virtuais em uma rede virtual. Você pode querer evitar que as duas máquinas façam ping uma na outra. Neste exemplo, você pode definir um teste para verificar o resultado pretendido antes da implantação.

O teste E2E é tipicamente 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 retirado (como a deslocalização de uma máquina virtual).

Neste artigo, vai aprender a:

  • Entenda os conceitos básicos dos testes de ponta a ponta com o Terratest
  • Aprenda a escrever teste de ponta a ponta usando o Golang
  • Saiba como usar o Azure DevOps para disparar automaticamente testes de ponta a ponta quando o código é confirmado no seu repositório

1. Configure seu ambiente

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.

2. Entenda os testes de ponta a ponta

Testes de ponta a ponta validam que um sistema funciona como um todo coletivo. Este tipo de teste é ao contrário de testar módulos específicos. Para projetos Terraform, os testes de ponta a ponta permitem a validação do que foi implantado. Esse tipo de teste difere de muitos outros tipos que testam cenários de pré-implantação. Os testes de ponta a ponta são essenciais para testar sistemas complexos que incluem vários módulos e atuam em 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. Terratest fornece todo o encanamento que é necessário para fazer a seguinte tarefa:

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

3. Entenda o exemplo de teste

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

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

O teste valida os seguintes cenários:

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

Sample end-to-end test scenario

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

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

Atenção

O cenário de exemplo apresentado neste artigo é apenas para fins ilustrativos. Propositadamente, mantivemos as coisas simples para nos concentrarmos nas etapas de um teste de ponta a ponta. Não recomendamos ter máquinas virtuais de produção que exponham portas SSH em um endereço IP público.

4. Examine o exemplo de teste

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

O código fonte a seguir mostra a estrutura padrão de um teste Golang usando 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 trecho de código anterior, o teste é composto por três etapas:

  • setup: Executa o Terraform para implantar a configuração
  • validate': As verificações e asserções de validação
  • teardown: limpa a infraestrutura após a execução do teste

A lista a seguir mostra algumas das principais funções fornecidas pela estrutura Terratest:

  • terraforme. InitAndApply: Habilita a execução terraform init e terraform apply a partir do código Go
  • terraforme. Saída: Recupera o valor da variável de saída de implantação.
  • terraforme. Destruir: Executa o comando a terraform destroy partir do código Go.
  • test_structure. LoadTerraformOptions: Carrega as 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. Execute o exemplo de teste

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

  1. Abra uma janela bash/terminal.

  2. Inicie sessão na sua conta do Azure.

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

    export TEST_SSH_KEY_PATH="~/.ssh/id_rsa"
    
  4. Dentro do diretório de exemplo, navegue até o src/test diretório.

  5. Execute o teste.

    go test -v ./ -timeout 10m
    

6. Verificar os resultados

Depois de executar go testcom êxito o , 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óximos passos