Cucumber: Dicas e truques
Existem diversas ferramentas para automação de testes, mas uma muito conhecida é o Cucumber, que possui por objetivo, tornar mais clara e coesa a especificação por exemplo, e desta forma facilitar o entendimento de todos. Importante que seja:
- De fácil entendimento
- Envolva o time escrevendo cenários antes do desenvolvimento
- Sirva de guia para o desenvolvimento do produto
- Gere relatórios para o cliente
Na especificação por exemplo, as funcionalidades são escritas utilizando a linguagem chamada Gherkin (próxima linguagem natural), e contém algumas palavras chave.
É escrito em mais de 60 linguas 😱
cucumber --i18n-languages
Orientação para palavras chave em todas as linguas 😎
cucumber --i18n-keywords
Iniciando as estruturas de projeto Cucumber
cucumber --init
Cria as estruturas de pastas e arquivos necessários em um projeto padrão de cucumber.
create features
create features/step_definitions
create features/support
create features/support/env.rb
Gerando steps de forma rápida
cucumber -d
Com um arquivo.feature criado, já é possível utilizar alguns recursos do Cucumber e agilizar a geração dos primeiros snippets. Assim, não será necessário aguardar o emulador ou browser iniciar e finalizar a execução dos testes, para somente depois gerar os snippets.
Não mostrar na tela os snippets que ainda faltam concluir
cucumber — no-snippets ou cucumber -i
Não mostra na tela os snippets que ainda não estão concluídos, ou seja, aqueles com o status de pendente.
Executando os testes
cucumber
Executando os cenários por tags
cucumber -t @name_tag
Utilizar tag é uma ótima maneira de organizar features e cenários, e também de definir estratégias que indicam como estão estruturadas as features.
Hooks: Utilizando Before e After é possível definir algumas tags que serão executadas antes ou depois de específicos cenários.
Veja mais sobre Cucumber tags neste repositório
Especificar o número de vezes para repetir os testes com falha
cucumber --retry 2
Testes de UI são mais lentos, e isso basicamente acontece porque eles buscam testar o aplicativo de uma maneira completa. Alguns dos problemas podem ocorrer devido:
- Instabilidade da rede
- Lentidão de servidor
- Timeout
- Flaky test
No exemplo abaixo foi executado o teste da funcionalidade login. Inicialmente o teste falhou, por uma falha que eu forcei ( mas, poderia ser por problema de rede, lentidão do servidor, etc..).
Na segunda tentativa realizada, o teste foi executado e o resultado esperado foi gerado com sucesso. 😎
Definir que os cenários sejam executados de forma aleatória
cucumber --order random
Isso faz validar o fato de cada cenário ser independente, e garantir que não ocorra dependência de um cenário para outro. Esta sequencia pode ser:
Defined: Executa os cenários na ordem em que são definidos
Random: Sorteia e executa os cenários de forma aleatórias.
É possível especificar certas features e cenários que serão executados de forma aleatória. Por exemplo. — — order random: 5738
Exibir os arquivos carregados durante a execução
cucumber --verbose
Verbose mostra todos os arquivos carregados durante a execução do teste. Desta forma é possível verificar quais arquivos estão sendo executados no momento deste teste. Abaixo segue um exemplo dos arquivos carregados ao executar um cenário da feature de login.
* features/ios/support/01_launch.rb
* features/ios/support/02_pre_stop_hooks.rb
* features/support/dados.rb
* features/support/hooks.rb
* features/support/utils.rb
* features/ios/ios_screen_base.rb
Cancelar a execução dos testes, caso o primeiro cenário falhar
cucumber --fail-fast
Este comando faz com que seja cancelado imediatamente a execução dos testes, caso o primeiro cenário falhar. Sendo assim, as próximas features e cenários nem mesmo são executados.
Em um ambiente ágil, pode ser interessante que se determinado cenário não passar não seja válido nem mesmo executar os próximos, e já verificar o motivo da falha inicial.
Executar os testes, de acordo com determinado perfil
cucumber — profile
É Possível configurar o arquivo yml que existe no projeto, e desta forma poderá configurar e armazenar determinados perfis no Cucumber. Isso se torna útil se você estiver executando os testes em diferentes ambientes. Na imagem abaixo é possível ver o exemplo de um arquivo yml.
# config/cucumber.yml##YAML Template---android: PLATFORM=android -r features/support -r features/android -r features/step_definitions --exclude features/ios ios: PLATFORM=ios -r features/support -r features/ios -r features/step_definitions --exclude features/android
Reports
As informações nos relatórios fornecem em detalhes as evidências sobre os cenários, contendo os registros de cada passo. A geração de logs ou reports que o cucumber disponibiliza é um recurso interessante para evidenciar os testes que foram executados.
Os reports podem ser gerados em diferentes formatos durante a execução, de forma muito simples, utilizando os plugins formatadores:
Pretty, HTML, JSON, JUnit, rerun, progress
Alguns exemplos de relatórios em um projeto iOS automatizado com Appium
Para gerar o relatório, basta atribuir alguns comandos ao executar o cenário, como nos exemplos abaixo:
cucumber --format html --out reports.html
cucumber --format json ou --format json_pretty
Exportando para o formato json ou json_pretty é possível realizar uma interação com algum outro software.
{
"uri": "features/login.feature",
"id": "login",
"keyword": "Funcionalidade",
"name": "Login",
"description": " Autenticação do usuário na aplicação.",
"line": 4,
"comments": [
{
"value": "# coding: utf-8",
"line": 1
}
],
"elements": [
{
"keyword": "Contexto",
"name": "",
"description": "",
"line": 7,
"type": "background",
"before": [
{
"match": {
"location": "features/support/hooks.rb:1"
},
"result": {
"status": "passed",
"duration": 14995716000
}
}
],
"after": [
{
"match": {
"location": "features/support/hooks.rb:5"
},
"result": {
"status": "passed",
"duration": 1415712000
}
}
]
}
]
}
Na imagem a seguir, é mostrado um relatório gerado pelo Jenkins, o qual utiliza um plugin do cucumber.
Este plugin apresenta os resultados dos testes em um report HTML acessível pelo próprio Jenkins. As informações estão agrupadas por abas: aprovados, falharam, não executados, número de cenários executados, número de etapas executadas, tempo total de execução de scripts.
Ainda podem ser realizadas exportações para vários outros formatos, JUnit, summary, progress, rerun, entre outros.
Conclusão
Cucumber não serve apenas para automatizar os testes.
“Cucumber é uma ferramenta de colaboração com a intenção de criar um entendimento comum entre todos os membros do time ”
A ideia foi fazer um resumo com algumas dicas e curiosidades que possam facilitar a vida de quem trabalha com Cucumber. Essas dicas entre outras podem ser facilmente encontradas na documentação deste framework, fique a vontade para estudar e utilizar outros recursos (cucumber -help). 😉