Este artigo foi publicado originalmente em: https://www.concrete.com.br/2018/08/24/cucumber-truques-e-dicas/
***
Existem diversas ferramentas para automação de testes, mas uma muito conhecida é o Cucumber, que tem como objetivo tornar mais clara e coesa a especificação, por exemplo. Importante que ela:
- 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 línguas!
cucumber --i18n-languages
Iniciando as estruturas de projeto Cucumber:
cucumber --init
Criando 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 vai 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
Execução padrão dos testes
Executando os cenários por tags:
cucumber -t @name_tag
Utilizar tag é uma ótima maneira de organizar features e cenários e também definir estratégias que indicam como estão estruturadas as features.
Exemplo de tags
- 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 a:
- 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 um problema 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.
Na primeira execução o teste falhou.
No segundo momento o cucumber Flaky executou 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, além de garantir que não ocorra dependência de um cenário para outro. Essa sequência 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 vão ser executados de forma aleatória. Por exemplo: — — order random: 5738.
Exibir os arquivos carregados durante a execução:
cucumber --verbose
Verbosa 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 cancelada imediatamente a execução dos testes, caso o primeiro cenário falhar. Sendo assim, as próximas features e cenários nem mesmo vão ser 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. Além de 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 e 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 à vontade para estudar e utilizar outros recursos (cucumber -help).