Olá pessoal. Hoje, estamos compartilhando com você a parte final do artigo
"Testando a infraestrutura como um código usando Pulumi" , cuja tradução foi preparada especificamente para os alunos do curso
"DevOps Practices and Tools" .

Teste de implantação
O estilo de teste testado é uma abordagem poderosa; permite testar uma caixa branca para verificar o interior do nosso código de infraestrutura. No entanto, limita um pouco o que podemos verificar. Os testes são executados com base no plano de implantação em memória criado por Pulumi antes da implantação direta e, portanto, a implantação em si não pode ser testada. Para esses casos, Pulumi possui uma estrutura de teste de integração. E essas duas abordagens funcionam muito bem juntas!
A estrutura de teste de integração Pulumi está escrita em Go e é com sua ajuda que testamos a maior parte do nosso código interno. Se a abordagem de teste de unidade discutida anteriormente era mais parecida com o teste de caixa branca, o teste de integração é uma caixa preta. (Também existem opções para testes internos completos.) Essa estrutura foi criada para aproveitar o programa Pulumi completo e executar várias operações de ciclo de vida, como implantar uma nova pilha do zero, atualizá-la com variações e excluí-la, possivelmente várias vezes. Nós os executamos regularmente (por exemplo, à noite) e como testes de estresse.
(Estamos
trabalhando para garantir que recursos semelhantes de teste de integração estejam no SDK do idioma nativo. Você pode usar a estrutura de teste de integração Go, independentemente do idioma em que o seu programa Pulumi estiver escrito).
Executando o programa usando essa estrutura, você pode verificar o seguinte:
- O código do seu projeto está sintaticamente correto e funciona sem erros.
- As definições de configuração de pilha e segredos funcionam e são interpretadas corretamente.
- Seu projeto pode ser implantado com sucesso no provedor de nuvem escolhido.
- Seu projeto pode ser atualizado com sucesso do estado inicial para outros N estados.
- Seu projeto pode ser destruído e excluído com sucesso do seu provedor de nuvem.
Como veremos em breve, essa estrutura também pode ser usada para executar a validação de tempo de execução.
Teste de integração simples
Para ver isso em ação, veremos o repositório
pulumi/examples
, conforme nossa equipe e a comunidade Pulumi o usam para testar seu próprio conjunto de solicitações, confirmações e compilações noturnas.
Abaixo está um teste simplificado do nosso
exemplo, que provisiona o bucket do S3 e alguns outros objetos :
example_test.go:
package test import ( "os" "path" "testing" "github.com/pulumi/pulumi/pkg/testing/integration" ) func TestExamples(t *testing.T) { awsRegion := os.Getenv("AWS_REGION") if awsRegion == "" { awsRegion = "us-west-1" } cwd, _ := os.Getwd() integration.ProgramTest(t, &integration.ProgramTestOptions{ Quick: true, SkipRefresh: true, Dir: path.Join(cwd, "..", "..", "aws-js-s3-folder"), Config: map[string]string{ "aws:region": awsRegion, }, }) }
Esse teste passa pelo ciclo de vida básico de criação, modificação e destruição da pilha da
aws-js-s3-folder
. Levará cerca de um minuto para relatar o teste aprovado:
$ go test . PASS ok ... 43.993s
Existem muitas opções para personalizar o comportamento desses testes. Consulte a
estrutura ProgramTestOptions
para obter uma lista completa de opções. Por exemplo, você pode configurar o ponto de extremidade Jaeger para rastrear (
Tracing
), indicar que espera que o teste
ExpectFailure
durante o teste negativo (
ExpectFailure
), aplicar uma série de "edições" ao programa para transições sucessivas de estado (
EditDirs
) e muito mais. Vamos ver como usá-los para verificar a implantação do aplicativo.
Verificando as propriedades do recurso
A integração mencionada acima garante que o nosso programa "funcione" - ele não trava. Mas e se quisermos verificar as propriedades da pilha resultante? Por exemplo, que certos tipos de recursos foram (ou não foram) preparados e que possuem certos atributos.
O parâmetro
ExtraRuntimeValidation
para
ExtraRuntimeValidation
nos permite examinar o estado registrado por Pulumi após a implantação (estado pós-implantação), para que possamos fazer verificações adicionais. Isso inclui uma captura instantânea completa do estado da pilha resultante, incluindo configuração, valores de saída exportados, todos os recursos e seus valores de propriedade, bem como todas as dependências entre os recursos.
Para ver um exemplo básico disso, vamos verificar se nosso programa cria um
S3 Bucket :
integration.ProgramTest(t, &integration.ProgramTestOptions{
Agora, quando executarmos o teste de execução, ele não apenas passará pela bateria dos testes de ciclo de vida, mas também, depois que a pilha tiver sido implantada com sucesso, ela executará uma verificação adicional do estado resultante.
Testes de tempo de execução
Até o momento, todos os testes foram exclusivamente sobre o comportamento de implantação e sobre o modelo de recursos Pulumi. E se você quiser verificar se sua infraestrutura preparada realmente funciona? Por exemplo, que a máquina virtual está em execução, o bucket S3 contém o que esperamos e assim por diante.
Você já deve ter descoberto como fazer isso: a opção
ExtraRuntimeValidation
para
ExtraRuntimeValidation
é uma ótima oportunidade para isso. Neste ponto, você executa um teste Go arbitrário com acesso ao estado completo dos recursos do seu programa. Esse estado inclui informações como endereços IP de máquinas virtuais, URLs e tudo o que é necessário para uma interação real com os aplicativos e a infraestrutura de nuvem recebidos.
Por exemplo, nosso programa de teste exporta uma propriedade de depósito
webEndpoint
chamada
websiteUrl
, que é a URL completa na qual podemos obter o
index document
personalizado. Embora possamos nos aprofundar no arquivo de status para encontrar o
bucket
e ler essa propriedade diretamente, em muitos casos, nossas pilhas exportam propriedades úteis, como esta, que são convenientes para verificarmos:
integration.ProgramTest(t, &integration.ProgramTestOptions{
Como nossas verificações anteriores, essa verificação será executada imediatamente após o aumento da pilha e tudo isso em resposta a uma simples chamada para
go test
. E esta é apenas a ponta do iceberg - todos os recursos de teste Go que você pode escrever em código estão disponíveis.
Integração Contínua de Infraestrutura
É bom poder executar testes em um laptop quando muitas alterações são feitas na infraestrutura para testá-las antes de enviá-las para revisões de código. Mas nós e muitos de nossos clientes estamos testando a infraestrutura em vários estágios do ciclo de vida do desenvolvimento:
- Em cada pool aberto, a solicitação para o teste antes da fusão.
- Em resposta a cada confirmação, verifique novamente se a mesclagem foi realizada corretamente.
- Periodicamente, por exemplo, à noite ou semanalmente para testes adicionais.
- Como parte do teste de desempenho ou teste de estresse, que geralmente são executados por um longo período de tempo e executam testes em paralelo e / ou implantam o mesmo programa várias vezes.
Para cada um deles, o Pulumi suporta a integração com o seu sistema de integração contínua favorito. Com a integração contínua, isso oferece a mesma cobertura de teste para sua infraestrutura e para o software aplicativo.
Pulumi tem suporte para sistemas comuns de IC. Aqui estão alguns deles:
Para mais informações, consulte a documentação de
Entrega contínua .
Ambientes efêmeros
Um recurso muito poderoso que se abre é a capacidade de implantar ambientes efêmeros apenas para fins de teste de aceitação. O
projeto Pulumi
e o conceito de
pilha foram projetados para implantar e demolir facilmente ambientes completamente isolados e independentes, tudo em alguns comandos simples da CLI ou por meio de uma estrutura de teste de integração.
Se você estiver usando o GitHub, a Pulumi oferece o
aplicativo GitHub , que o ajudará a conectar o teste de aceitação ao pool de solicitações no pipeline do seu CI. Basta instalar o aplicativo no repositório GitHub e o Pulumi adicionará informações sobre a visualização da infraestrutura, atualizações e resultados de testes ao seu IC e pool de solicitações:

Ao usar o Pulumi para seus testes básicos de aceitação, você terá novos recursos de automação que melhorarão o desempenho da equipe e darão confiança na qualidade das mudanças.
Sumário
Neste artigo, vimos que, ao usar linguagens de programação de uso geral, muitos métodos de desenvolvimento de software que foram úteis no desenvolvimento de nossos aplicativos ficam disponíveis para nós. Eles incluem teste de unidade, teste de integração e sua interação para realizar testes extensivos em tempo de execução. Os testes são fáceis de executar sob demanda ou em seu sistema de IC.
Pulumi é um software de código aberto, é gratuito para uso e funciona com suas linguagens de programação e nuvens favoritas -
experimente hoje !
→
A primeira parte