top of page
Foto do escritorRafael Natali

Como testar seu código Terraform

Atualizado: 9 de ago. de 2023

Aprenda sobre a configuração do módulo experimental de teste do Terraform e como usá-la para executar testes na infraestrutura.

teste de terraforma

Este artigo foi originalmente publicado em Inglês no Medium e apresentado na conferência HashiBuild: Talks 2022.

Teste é vital para entender se o código que criamos está fazendo o que deveria. Executar um terraform plan ajuda, mas não é uma garantia. A melhor maneira é implantar os recursos de maneira controlada.

Terratest e kitchen-terraform ambos foram pioneiros na ideia de escrever testes para módulos Terraform com orquestração explícita escrita nas linguagens de programação Go e Ruby, respectivamente. Como o Terraform CLI v0.15.0 Hashicorp introduziu um módulo de teste experimental, é sobre isso que gostaria de falar.

Como escrever testes para um módulo

Usarei um módulo do Terraform que cria buckets no GCP como exemplo. Você pode encontrar o código neste repositório GitHub. Quero testar se o Terraform está criando um bucket. Então, meu teste será criar um bucket e verificar a execução comparando o nome do bucket. Primeiro, configuro o arquivo outputs.tf para guardar o nome do bucket ao final da execução:

output “bucket_name” {
  value = google_storage_bucket.bucket.name
}

Segundo, certifico-me de que o arquivo variables.tf tem um valor padrão atribuído a cada variável. Finalmente, dentro do diretório terraform-google-cloud-storage/cloud-storage-module, crio uma nova subpasta tests/defaults. No diretório padrão, crio o arquivo defaults.tf. O arquivo tests/defaults/defaults.tf contém uma chamada para o módulo principal com um conjunto adequado de argumentos e recursos que servirão para definir os resultados dos testes. Por exemplo:


module "main" {  
# source is always ../.. for test suite configurations,  
# because they are placed two subdirectories deep under  
# the main module directory.  source = "../.."   # This test suite is aiming to test the "defaults" for  
# this module, so it doesn't set any input variables  
# and just lets their default values be selected instead.
}
The following code is the test assertion configuration:
# The special test_assertions resource type, which belongs
# to the test provider we required above, is a temporary
# syntax for writing out explicit test assertions.resource "test_assertions" "bucket" {  
# "component" serves as a unique identifier for this  
# particular set of assertions in the test results.    component = "bucket"     equal "bucket_name" {    
    description = "default bucket_name is natali-test-eu-627"    
    got         = module.main.bucket_name # value from the output
    want        = "natali-test-eu-627"  
  }
}

No bloco equal, estou comparando o nome do bucket que o módulo principal gerou (got ) com o valor que defini no variables.tf (want). Se forem iguais, o teste foi executado com sucesso.

Executando os testes

O comando terraform test é um comando experimental para ajudar no teste de integração automatizado de módulos compartilhados. Ele executa as operações do Terraform semelhantes à seguinte sequência de comandos:

  • validação de terraform

  • terraform apply

  • terraforma destruir

Neste exemplo, navegue até a pasta terraform-google-cloud-storage/cloud-storage-module e execute o terraform test :

$ terraform test

Success! All of the test assertions passed.

Para forçar um erro, altere o valor want no teste sem alterar o valor no variables.tf

──────────────────────────────────────────────────────── 
Failed: defaults.bucket.bucket_name 
(default bucket_name is natali-test-eu-627) ────────────────────────────────────────────────────────
wrong value
    got:  "natali-test-eu-627"
    want: "natali-test-eu-628"

Limitações conhecidas

Por ser um módulo experimental, existem algumas limitações em seu funcionamento. No momento em que escrevo (março de 2022), as duas principais limitações que gostaria de destacar são:

  • Atualmente, os testes escritos dessa maneira só podem exercitar os comportamentos de criação e destruição.

  • Você não pode testar contra recursos não reais.

Consulte a documentação da Hashicorp para uma lista completa.

Referências

  1. https://www.hashicorp.com/blog/testing-hashicorp-terraform

  2. https://www.terraform.io/language/modules/testing-experiment

  3. https://medium.com/marionete/using-terraform-to-manage-multiple-gcp-resources-c5b432a6d619


11 visualizações0 comentário

Comments


bottom of page