Cucumber: Dicas e truques

Diogo Miranda
6 min readAug 1, 2018

--

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
Cucumber languages

Orientação para palavras chave em todas as linguas 😎

cucumber --i18n-keywords
Cucumber 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
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 de 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.

Exemplo de tag utilizando before e after

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. 😎

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, 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
Exemplo de relatório 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.

Feature login com sucesso
Feature login com falha

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). 😉

--

--