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/