Desenvolvimento

9 out, 2017

Utilizando Rake + Cucumber ao seu favor – Parte 02

Publicidade

No artigo anterior, citei alguns passos sobre como configurar o Rake e o Cucumber. Hoje, vou mostrar a facilidade de utilizar essas maravilhosas ferramentas. A ideia é citar e apresentar outros cenários que vão contextualizar melhor a minha motivação para escrever a série.

No exemplo anterior, tínhamos somente uma feature cadastro com apenas três cenários. Nesse contexto até faria sentido criar alguma task para executar, mas para mim, só faria mesmo sentido se o comando para rodar essa feature fosse muito grande, como a do Calabash:

ADB_DEVICE_ARG= id_do_device bundle exec calabash-android run caminho_para_o_apk features/ -t @critic

Olhando para esse comando ainda não faria sentido, pois você poderia usar alguma busca recursiva e achar isso no histórico do seu terminal. Vamos dar mais complexidade só para mostrar a eficiência do Rake com Cucumber?

Faremos isso criando mais duas features.

Primeira:

touch busca.feature

Os cenários da busca.feature estão aqui, com isso já temos mais cenários que precisam ser executados de forma diferente. Mas ainda podemos dar um pouquinho mais de complexidade…

Segunda:

touch pull_request.feature

Cenários da pull_request.feature. Nessas features existem algumas tags:

@critic = Cenários de maior valor de negócio
@slow = Cenários cuja execução demora muito
@medium = Cenários com um tempo razoável de execução
@fast = Cenários com execução muito rápida

Como faríamos para executar essas features? Lembrando que ainda temos três tags de bônus.

@pull_request
@search
@register

Se fôssemos executar apenas as features que são @register, teríamos o seguinte comando (usando apenas o Cucumber, sem integração com Appium, Capybara e outros frameworks):

cucumber -t ~@pull_request -t ~@search

Isso vai fazer somente a feature @register seguir a execução, o resto vai desaparecer do “radar” do Cucumber. E se agora alguém pedisse para rodar somente as features com tags @search e @register, utilizando somente as tags @fast e @slow?

cucumber -t ~@register -t ~@search -t ~@medium -t ~@critic

Conforme a complexidade aumenta, seu comando para criar uma execução também, o que é péssimo em nível de manutenção, por conta dos scripts do CI e das tags. Além disso, alguém com um mínimo conhecimento pode ter dificuldade em fazer essa abstração.

No post anterior criamos um arquivo Rake, que ainda se encontra vazio. Vamos criar agora nossa primeira task e ver que, com o nível de complexidade, fica mais fácil entender o que está acontecendo.

require 'rubygems'
 
require 'cucumber'
 
require 'cucumber/rake/task'
 
desc 'Execute fast scenarios'
 
task :fast_scenarios do
 
puts 'Running fast scenarios'
 
sh 'cucumber -t @fast'
 
end
 
desc 'Execute critic scenarios'
 
task :critic_scenarios do
 
puts 'Running critic scenarios'
 
sh 'cucumber -t @critic'
 
end
 
desc 'Execute slow scenarios'
 
task :slow_scenarios do
 
puts 'Running slow scenarios'
 
sh 'cucumber -t @slow'
 
end
 
desc 'Execute medium scenarios'
 
task :medium_scenarios do
 
puts 'Running medium scenarios'
 
sh 'cucumber -t @medium'
 
end
 
desc 'Execute register feature with fast scenarios'
 
task :medium_scenarios do
 
puts 'Running medium scenarios'
 
sh 'cucumber -t ~@pull_request -t ~@search'
 
end

E então, para rodar essas tasks, nós simplesmente executaríamos:

bundle exec rake fast_scenarios

Ainda assim, temos que escrever muito para executar. Então que tal falar para as suas tasks que o bundle exec também faz parte dela?

desc 'Execute fast scenarios'
 
task :fast_scenarios do
 
puts 'Running fast scenarios'
 
sh 'bundle exec cucumber -t @fast'
 
end

Agora, para executar a task é só utilizar o comando:

rake fast_scenarios

Até aí, beleza: temos um dos cenários legais mapeados. Mas e quando começarmos a ter 20 tags, vamos precisar replicar todos essas tasks? Não.

Tasks Rake também recebem parâmetros, ou seja, se você consegue passar qual feature e quais tags de cenário você deseja executar, podemos mudar as tasks para:

task :run_features, [:feature, :scenario] do |_task, args|

puts "Running #{args[:feature]} feature with #{args[:scenario]} scenarios "

sh "cucumber -t @#{args[:feature]} -t @#{args[:scenario]}""

end

Podemos também já incluir que em toda execução, o Cucumber vai gerar relatório de cada uma dessas tags:

task :run_features, [:feature, :scenario] do |_task, args|

puts "Running #{args[:feature]} feature with #{args[:scenario]} scenarios and report"

sh "cucumber -t @#{args[:feature]} -t @#{args[:scenario]} -f html -o #{args[:scenario]}_scenarios.html"

end

Para rodar esse tipo de task, utilizando parâmetros, ficaria assim:

rake run_features['register', 'fast']

E é isso! Espero que você consiga absorver tudo o que eu falei por aqui e aplicar em algum projeto, mas não precisa se apegar apenas a esses exemplos. Para o mundo mobile, você pode ter tasks que vão fazer o build dos projetos para você. A ideia é viajar na hora de criar as suas tasks.

***

Este artigo foi publicado originalmente em: https://www.concrete.com.br/2017/09/18/utilizando-rake-cucumber-ao-seu-favor-parte-2/