KUTTL: faça testes de Kubernetes Operators

Neste artigo você vai ver:

Fazer testes de Kubernetes Operators tem seus desafios, não é mesmo? Mas e se eu te dissesse que existe uma ferramenta de código que pode te ajudar muito nessa missão. Pois hoje eu vou te apresentar ao KUbernetes Test TooL, ou simplesmente KUTTL.

Neste artigo vamos acompanhar o que é KUTTL, detalhes sobre a sua instalação e configuração, além de um exemplo de caso de teste utilizando essa ferramenta no macOs / Linux.

O que é o KUTTL?

KUbernetes Test TooL (KUTTL) é uma ferramenta open source de teste que facilita o teste de Kubernetes Operators. Para utilizá-la não é necessário conhecimento de nenhuma linguagem de programação específica, sendo todos os testes escritos em formato YAML de forma declarativa. 

As possibilidades de configuração de testes são inúmeras. É uma ferramenta de fácil utilização, possui documentação detalhada e foi criada pelo time de desenvolvimento do KUDO, o que passa confiança à ferramenta. Confira 

A documentação oficial do KUTTL é muito boa e vamos utilizá-la em alguns pontos desse tutorial. Inclusive, o site oficial da ferramenta também é bastante interessante.

Agora vamos acompanhar como fazer as primeiras configurações do KUTTL.

Pré-requisitos para instalar o KUTTL

É necessário ter um cluster Kubernetes configurado ou ter o Kind instalado.

Configure um cluster Kubernetes de versão 1.13 ou posterior no caso de necessitar rodar os testes em um cluster já configurado.

Tenha instalado também o kubectl de versão 1.13 ou posterior.

Instalação do krew

O krew é um gerenciador de plugins do kubectl necessário para a instalação do KUTTL. Para instalá-lo rode o seguinte comando no seu terminal:

(
    set -x; cd "$(mktemp -d)" &&
    OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
    ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
    KREW="krew-${OS}_${ARCH}" &&
    curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
    tar zxvf "${KREW}.tar.gz" &&
    ./"${KREW}" install krew
)

Adicione a linha <export PATH=”${KREW_ROOT:-$HOME/.krew}/bin:$PATH”> no arquivo $HOME/.krew/bin para atualizar o PATH do krew e reinicie o terminal para aplicar as alterações.

Instalação do KUTTL

Para instalar o KUTTL rode o seguinte comando no seu terminal:

   kubectl krew install kuttl

Para facilitar asserções de teste instale também o plugin de assert. Para isso rode o seguinte comando:

kubectl krew install assert

Configurações para os testes

Agora que já vimos as principais informações para configurar o KUTTL é chegada a hora de fazer as configurações próprias para os testes.

A seguir, além do passo a passo dos testes, eu vou abordar alguns conceitos importantes para esse tutorial.

Configuração dos diretórios de teste

Rode o seguinte comando para criar o diretório da suíte de testes:

 mkdir -p tests/integration

Cada pasta criada dentro do diretório “integration” irá representar um único teste. 

Configuração da suíte de teste

Para informar as configurações da suíte de testes crie o arquivo kuttl-test.yaml na raiz do projeto. O arquivo deve conter basicamente o diretório de testes e o tipo relacionado ao escopo de testes:

apiVersion: kuttl.dev/v1beta1
kind: TestSuite
startKIND: true
kindContainers:
- my-operator-image:latest
testDirs:
- tests/integration/
timeout: 120

A criação desse arquivo é opcional. Caso não seja criado, os argumentos devem ser passados por meio de linha de comando na execução dos testes, por exemplo:

kubectl kuttl test –start-kind=true ./tests/integration

Caso tenha criado o arquivo e utilize também argumentos na linha de comando, os argumentos irão sobrescrever as instruções do arquivo de configuração.

Para mais informações sobre as possibilidades de configuração do KUTTL acesse a documentação de referência

Neste contexto vamos usar o arquivo de configuração como o criado acima, onde o KUTTL irá se encarregar de criar um cluster utilizando o kind e aplicar a imagem docker do operator a ser testado. 

O KUTTL criará também um namespace exclusivo para cada caso de teste, possibilitando rodá-los em paralelo e com isolamento entre eles, porém caso necessite, também é possível configurar um namespace específico para seus testes.

Escrita de caso de teste

Crie uma pasta com o nome do teste no diretório /tests/integration, nesse caso vamos nomear o teste de my-frist-test.

  • Escrita de um TestStep

O TestStep é um objeto que pode ser usado para especificar as configurações dos steps de teste. Os nomes de cada arquivo YAML deve conter em seu nome o prefixo com o index do step dentro da pasta do caso de teste, por exemplo:

tests/integration/my-first-test/00-pod.yaml
tests/integration/my-first-test/00-assert.yaml
tests/example/my-first-test/01-staging.yaml

O índex serve para identificar a ordem em que os steps e asserts serão executados, onde os steps de mesmo índex são executados primeiro antes do assert de mesmo índex.

Neste exemplo vamos criar o arquivo 00-pod.yaml do tipo Deployment com o conteúdo abaixo:

apiVersion: apps/v1
kind: Deployment
metadata:
 name: test
 labels:
   app: nginx
spec:
 replicas: 4
 selector:
   matchLabels:
     app: nginx
 template:
   metadata:
     labels:
       app: nginx
   spec:
     containers:
     - name: nginx
       image: nginx:latest
       ports:
       - containerPort: 80

Você pode consultar e personalizar as opções de configurações do TestStep na documentação de referência.

  • Escrita de um TestAssert

O TestAssert é um objeto que é usado para especificar as configurações de um step de assert onde é possível comparar objetos específicos pelo nome ou qualquer objeto comparando um estado definido. O TestAssert deve ser criado na pasta de teste como um arquivo YAML, e assim como um step de teste deve seguir o mesmo padrão de nomenclatura do TestStep.

Neste exemplo vamos criar o arquivo 00-assert.yaml com o seguinte conteúdo:

apiVersion: kuttl.dev/v1beta1
kind: TestAssert
status:
 phase: Running
commands:
- command: kubectl assert exist-enhanced deployment test -n $NAMESPACE --field-selector status.readyReplicas=4

Neste assert vamos comparar se o deployment criado no cluster contém o número de réplicas especificado no arquivo 00-pod.yaml.

Assim como asserts também é possível criar steps de erros esperados, consulte a documentação de referência para saber mais. 

Execução dos testes

Para executar o teste criado, basta executar o seguinte comando:

kubectl kuttl test

Caso queira gerar o arquivo de report após a execução dos testes utilize o argumento –report <xml/json>

O resultado dos testes no console será apresentado da seguinte forma:

=== CONT  kuttl
    harness.go:399: run tests finished
    harness.go:508: cleaning up
    harness.go:517: collecting cluster logs to kind-logs-1647000814
    harness.go:563: removing temp folder: "/var/folders/dk/9t1ln8yd4q128cmny92mnr880000gn/T/kuttl973159101"
    harness.go:569: tearing down kind cluster
--- PASS: kuttl (114.64s)
    --- PASS: kuttl/harness (0.00s)
        --- PASS: kuttl/harness/my-first-test (44.47s)

Encerrando…

Espero que com esse artigo você tenha conseguido compreender as características e vantagens de usar o KUTTL. Com ele, seus testes de Kubernetes Operators nunca mais serão os mesmos.

E você, já conhecia o KUTTL? Conta pra gente nos comentários se já usava ou se está pensando em adotar agora.

Capa do artigo “KUTTL: faça testes de Kubernetes Operators” onde temos uma foto criativa de mesa do espaço de trabalho, vista superior com teclado, mouse e caderno preto em fundo de cor rosa e verde pastel, além de post its coloridos.
Foto de Angelica Lima
Quality Assurance Specialist
Amante de cachorros, patinação e adora estudar novas tecnologias. Possui as certificações CTFL, CTFL-AT e CTAL-TAE pelo BSTQB e é especialista em arquitetura e implementação de soluções de teste.

Este site utiliza cookies para proporcionar uma experiência de navegação melhor. Consulte nossa Política de Privacidade.