Testes automatizados no Jenkins: recursos, plugins e dicas para aumentar a produtividade

Há alguns anos, nos projetos em que atuo, venho trabalhando com Jenkins para gerenciar os testes automatizados em diferentes aplicações web, desktop, mobile e webservices. Desta vez, fiz um compilado com alguns recursos que me auxiliam bastante na análise e gerenciamento dos testes.

Sobre o Jenkins

O Jenkins, assim como outras ferramentas de CI (Continuous Integration), é utilizado na automação de builds durante o desenvolvimento do software, prevenindo e alertando qualquer problema de integração após um commit ou merge de código, podendo ainda disparar de forma automática testes unitários e funcionais automatizados da aplicação, para garantir que nada saiu errado. Em um time ágil, são comuns constantes integrações de código durante o dia, tornando ainda mais necessário o uso destas ferramentas. O Jenkins é a ferramenta de CI mais popular e, por consequência, existem diversos plugins e recursos disponíveis. Vou falar de alguns que utilizo nos processos de automação de testes e QA. Antes de começar, apenas para contextualizar, falarei neste artigo sobre Job e Build. No Jenkins um Job é qualquer projeto ou tarefa que você queira executar e build é cada uma das execuções do Job.

1. Tendência de Resultado dos Testes (JUnit Plugin)

O JUnit plugin apresenta um gráfico simples, porém muito útil, da tendência dos testes automatizados, com base nas últimas execuções do job. Como ele aparece logo quando acessamos o job no Jenkins, podemos ter um feedback rápido sobre a quantidade de testes executados, passados e falhados. Quando ocorre uma mudança muito drástica neste gráfico, é um bom indicativo que algo mudou no sistema ou no ambiente em que os testes automatizados estão rodando. Abaixo um exemplo do gráfico gerado:

Link:
https://wiki.jenkins.io/display/JENKINS/JUnit+Plugin
Requisitos:

JUnit, TestNG ou qualquer tecnologia que gere arquivos no formato xml do JUnit.
Como configurar:
1 — Acesse Configurações do Job > Ações de pós-build > Publicar relatório de testes do JUnit.
2 — Adicione o caminho dos arquivos .xml gerados pelo JUnit após a execução dos testes. Se você utiliza Maven, os arquivos são gerados na pasta “surefire-reports”.

3 — Execute algumas vezes o job para que o gráfico seja gerado.

2. Test Results Analyser

Este plugin apresenta de forma consolidada os resultados de todos os testes em todos os builds de um Job. É apresentado em formato de tabela, onde na linha estão os cenários de teste e na coluna estão os builds, mostrando o resultado: PASS, FAILED, SKIP, etc.

Este é um dos principais plugins que utilizo para analisar a causa das falhas. Com ele consigo, de forma fácil, perceber quando um teste está instável (vezes passando, vezes falhando) ou se começou a falhar constantemente e a data exata em que isto começou a acontecer. Sem isto, seria necessário acessar build a build manualmente para verificar estas informações, desperdiçando bastante nosso tempo.

Uma boa dica para ajudar você a descobrir porque algum teste está falhando é utilizar esta visão de tabela para encontrar qual foi a última vez que o teste passou e comparar com o resultado da execução que falhou. Se você coleta evidências durante a execução do teste automatizado, prática que eu recomendo, facilita ainda mais esta análise. Além da apresentação em formato de tabela, alguns gráficos também são gerados:

Link: https://wiki.jenkins.io/display/JENKINS/Test+Results+Analyzer+Plugin
Requisitos: JUnit, TestNG ou qualquer tecnologia que gere arquivos no formato xml do JUnit.
Como configurar:​
Igual ao explicado no tópico anterior: JUnit Plugin.

3. Arquivar artefatos (Archive the Artifacts)

A função de arquivamento de artefatos é um recurso nativo do Jenkins que permite anexar ao build qualquer artefato gerado durante sua execução. Em um job de testes automatizados, você pode utilizar este recurso, por exemplo, para guardar evidências dos testes, screenshot de tela, relatórios gerados pela automação ou arquivos exportados pelo sistema, ficando disponível para consulta a qualquer momento. Caso algum de seus testes comece a falhar e você queira consultar como uma tela do seu sistema era a 3 meses atrás, as evidências estarão lá para você comparar :)

Como configurar: 
1 — Acesse Configurações do Job > Ações de pós-build > Arquivar os artefatos.
2 — Adicione o caminho dos arquivos que você deseja arquivar.

4. Programação automática de execução (trigger build)

Este também é um recurso nativo do Jenkins, que permite agendar a execução de um job para qualquer horário do dia de forma recorrente. Você pode agendar a execução de uma suite completa de testes em um horário alternativo (por exemplo, às 23h). Assim, quando você chegar pela manhã, é só acessar o job e analisar o resultado dos testes.

Nem sempre um teste automatizado será executado logo após um deploy de aplicação no ambiente ou terá um pipeline com todas as etapas configuradas, incluindo o disparo automático dos testes, principalmente se seu time trabalha no modelo waterfall. Mas nem por isso você deve deixar de utilizar uma ferramenta de integração contínua para execução dos seus testes automatizados, pelo contrário, você poderá ter alguns processos automatizados (não somente testes) onde queira executar todo dia no mesmo horário, ou então queira programar alguns testes para monitorar as funcionalidades mais críticas em ambiente de produção algumas vezes ao dia. Estes são alguns exemplos de uso deste recurso.

Como configurar: 
1 — Acesse Configurações do Job > Trigger de builds.
2 — Na figura abaixo, o job está configurado para rodar de segunda a sexta-feira (1–5) sempre às 7 e às 19 horas(0 7, 19).

Builds executados no horário programado

5. Cucumber Living Documentation

Para você que escreve os testes com Cucumber, um plugin bacana é o Living Documentation. Quando configurado no job, este plugin gera uma documentação completa em PDF e HTML baseado nas suas User Stories. Esta documentação inclui quais funcionalidades, cenários e steps passaram e quais falharam, além do tempo que a automação levou para testar cada step. Esta documentação é gerada em tempo real, ou seja, logo após a execução do job de testes automatizados, a documentação é atualizada com o resultado dos testes e fica disponível em uma URL no Jenkins. Seu time, stackholders, PO podem utilizar este documento como especificação do sistema.

Documentação em PDF com base nas User Stories do Cucumber

Link: 
https://wiki.jenkins.io/display/JENKINS/Cucumber+Living+Documentation+Plugin
Requisitos:
Cucumber.
Como configurar:
 
1 — Primeiro é necessário configurar o Cucumber para gerar um o arquivo json. No exemplo abaixo, em Java, está demarcado o parâmetro necessário para esta geração.

2 — Acesse Configurações do Job > Ações de pós-build > Living documentation.
3 — Adicione o caminho onde o json é gerado.

6. Build Failure Analyser

Na medida em que aumentamos cobertura de testes automatizados no nosso sistema, também devemos ter um cuidado maior para que nada saia do controle, pois teremos uma grande quantidade de testes para mantermos funcionando e analisarmos as falhas que possam aparecer.

Para facilitar a análise destas falhas, podemos utilizar o plugin Failure Cause Manager, que permite registrarmos no Jenkins as causas na qual um job ou testes falharam. Isto é útil quando duas ou mais pessoas estão analisando as falhas ao mesmo tempo e queremos evitar que uma mesma falha seja analisada por duas pessoas. Quando uma falha está cadastrada e ela ocorre em algum build, o build apresentará um ícone em formato de lâmpada, como na imagem abaixo:

Quando clicamos no ícone, somos direcionados para saída de console e a linha onde ocorreu o erro ficará marcada em vermelho.

Para cadastrar a falha, o plugin oferece uma tela onde devemos informar algum texto que identifique a falha na saída de console. Esta é a tela:

Link: 
https://wiki.jenkins.io/display/JENKINS/Build+Failure+Analyzer
Como configurar:
 
1 — Acessando qualquer Job, vá em Failure Cause Management.
2 — Clique em Create new.
3 — Preencha as informações sobre a falha. Neste momento é importante preencher o campo “Build Log Indication”, pois ele é quem identificará se no build ocorreu a falha.
4 — Pronto. Qualquer build em que a falha ocorrer será identificado.

7. Cucumber Reports

Este plugin apresenta de forma bem completa os resultados dos testes do Cucumber em um report HTML acessível pelo próprio Jenkins. As informações estão agrupadas por abas: “Feature”, “Tags”, “Steps”, “Trends” e “Failures”.

Link: 
https://wiki.jenkins.io/display/JENKINS/Cucumber+Reports+Plugin
Como configurar:
 
1 — Configure o Cucumber para gerar um o arquivo json, como explicado anteriormente.
2 — Acesse Configurações do Job > Ações de pós-build > Cucumber reports.
3 — Execute algum teste para que as informações sejam geradas e o report disponibilizado.

8. Jenkins API

Imagine que seu cliente ou gerente chega em você e diz: “Preciso saber quantos testes executaram este ano, quantas vezes cada teste executou e quais foram os resultados (Passed/Failed)”. Daí você lembra que possui mais de 500 testes automatizados que rodaram todos os dias em diferentes sistemas. A coleta destas informações de forma manual seria totalmente inviável.

Sim, passei exatamente por isto! A solução foi coletar estas informações através da API Rest do Jenkins. Através da API, podemos coletar informações sobre qualquer job, build, resultado de testes, artefatos, duração, etc, permitindo filtrar as informações que mais nos interessam. Os formatos disponíveis são json, xml e um formato específico em python.

Existem bibliotecas em diversas linguagens que interpretam esta API tornando mais fácil o uso, como esta aqui em Java: https://github.com/jenkinsci/java-client-api. Você também pode criar suas métricas de qualidade coletando informações através desta API e montar gráficos ou tabelas em HTML para monitorar estas métricas.

Ao adicionar na URL do Jenkins um “/API”, será apresentado uma tela conforme abaixo, com informações sobre a API:

Não são todas as URLs que possuem este recurso. Nesta tela da imagem acima, ao clicar em algum dos formatos disponíveis, por exemplo json, as informações do Job ou resultados dos testes serão apresentados no formato escolhido:


Concluindo, estes são alguns recursos e plugins do Jenkins que mais me auxiliam nas atividades de automação de testes, espero ter ajudado! Qualquer dúvida, deixe seu comentário!