Aprenda sobre a configuração do módulo experimental de teste do Terraform e como usá-la para executar testes na infraestrutura.
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
https://www.hashicorp.com/blog/testing-hashicorp-terraform
https://www.terraform.io/language/modules/testing-experiment
https://medium.com/marionete/using-terraform-to-manage-multiple-gcp-resources-c5b432a6d619
Comments