Práticas recomendadas para testes

Este documento fornece diretrizes e recomendações para testar módulos e configurações do Terraform para Google Cloud.

Às vezes, testar módulos e configurações do Terraform segue padrões e convenções diferentes do teste de código do aplicativo. Embora o teste do código do aplicativo envolva principalmente o teste da lógica de negócios dos próprios aplicativos, o teste completo do código da infraestrutura requer a implantação de recursos reais da nuvem para minimizar o risco de falhas de produção. Há algumas considerações ao executar testes do Terraform:

  • A execução de um teste do Terraform cria, modifica e destrói a infraestrutura real. Portanto, os testes podem ser demorados e caros.
  • Não é possível realizar somente um teste de unidade em uma arquitetura de ponta a ponta. A melhor abordagem é dividir a arquitetura em módulos e testá-los individualmente. Os benefícios dessa abordagem incluem desenvolvimento iterativo mais rápido devido ao tempo de execução mais rápido, custos reduzidos para cada teste e chances reduzidas de falhas de teste devido a fatores além do seu controle.
  • Evite reutilizar o estado, se possível. Pode haver situações em que você está fazendo testes com configurações que compartilham dados com outras configurações, mas o ideal é que cada teste seja independente e não reutilize o estado deles.

Use métodos de teste mais baratos primeiro

Há vários métodos que você pode usar para testar o Terraform. Em ordem crescente de custo, tempo de execução e profundidade, eles incluem o seguinte:

  • Análise estática:teste a sintaxe e a estrutura da configuração sem implantar recursos usando ferramentas como compiladores, lints e simulações. Para fazer isso, use terraform validate.
  • Teste de integração do módulo: para garantir que os módulos funcionem corretamente, teste os módulos individuais isoladamente. O teste de integração de módulos envolve a implantação do módulo em um ambiente de teste e a verificação de que os recursos esperados foram criados. Há vários frameworks de teste que facilitam a criação de testes da seguinte maneira:
  • Teste de ponta a ponta:ao estender a abordagem de teste de integração a um ambiente inteiro, você pode confirmar se vários módulos funcionam juntos. Nessa abordagem, implante todos os módulos que compõem a arquitetura em um ambiente de teste atualizado. O ideal é que o ambiente de teste seja o mais semelhante possível ao ambiente de produção. Isso é caro, mas oferece a maior confiança de que as alterações não afetam seu ambiente de produção.

Vá aos poucos.

Certifique-se de que seus testes são criados iterativamente uns nos outros. Recomendamos executar testes menores primeiro e, em seguida, passar para testes mais complexos usando uma abordagem falha rápida.

Ordem aleatória de IDs de projetos e nomes de recursos

Para evitar conflitos de nomenclatura, verifique se as configurações têm um ID do projeto globalmente exclusivo e nomes de recursos não sobrepostos em cada projeto. Para fazer isso, use namespaces nos seus recursos. O Terraform tem um provedor aleatório integrado para isso.

Usar um ambiente separado para testar

Durante os testes, muitos recursos são criados e excluídos. Verifique se o ambiente está isolado dos projetos de desenvolvimento ou produção para evitar exclusões acidentais durante a limpeza de recursos. A melhor abordagem é fazer com que cada teste crie um novo projeto ou pasta. Para evitar configurações incorretas, considere criar contas de serviço especificamente para cada execução de teste.

Limpar todos os recursos

O teste do código da infraestrutura significa que você está implantando recursos reais. Para evitar cobranças, implemente uma etapa de limpeza.

Para destruir todos os objetos remotos gerenciados por uma configuração específica, use o comando terraform destroy. Alguns frameworks de teste têm uma etapa de limpeza integrada para você. Por exemplo, se você estiver usando o Terratest, adicione defer terraform.Destroy(t, terraformOptions) ao teste. Se você estiver usando Kitchen-Terraform, exclua seu espaço de trabalho usando terraform kitchen delete WORKSPACE_NAME.

Depois de executar o comando terraform destroy, execute também procedimentos de limpeza adicionais para remover todos os recursos que o Terraform não conseguiu destruir. Para fazer isso, exclua todos os projetos usados para execução do teste ou use uma ferramenta como o módulo project_cleanup.

Otimizar o tempo de execução do teste

Para otimizar o tempo de execução do teste, use as seguintes abordagens:

  • Executar testes em paralelo. Alguns frameworks de teste são compatíveis com a execução de vários testes do Terraform simultaneamente.
    • Por exemplo, com o Terratest, é possível fazer isso adicionando t.Parallel() após a definição da função de teste.
  • Teste em etapas. Separe seus testes em configurações independentes que possam ser testadas separadamente. Essa abordagem elimina a necessidade de passar por todos os estágios ao executar um teste e acelera o ciclo de desenvolvimento iterativo.
    • Por exemplo, no Kitchen-Terraform, divida testes em pacotes separados. Ao iterar, execute cada pacote de forma independente.
    • Da mesma forma, usando o Terratest, envolva cada estágio do teste com stage(t, STAGE_NAME, CORRESPONDING_TESTFUNCTION). Defina variáveis de ambiente que indicam quais testes serão executados. Exemplo, SKIPSTAGE_NAME="true".
    • O framework de teste de blueprint é compatível com a execução gradual.

A seguir