03.01
O Webrat é uma ferramenta fantástica mas que possui uma limitação severa: não consegue dar conta sozinho de funcionalidades que dependam de Javascript. Como é difícil imaginar uma aplicação web hoje que não faça uso de AJAX e como infelizmente nem toda funcionalidade que envolva javascript é possível de ser degradada, precisamos então de uma alternativa.
O objetivo desse post é mostrar como configurar o Cucumber para utilizar Webrat em modo Selenium quando conveniente com reaproveitamento quase total das definições de passos e permitindo também o uso de Selenium nativo nos casos onde não existe paralelo na API do Webrat.
Esse tutorial foi testado especificamente no Ubuntu Linux 9.10 e é provável que funcione em ambientes diferentes com pouca ou nenhuma alteração. As gems utilizadas e suas respectivas versões foram:
rails = 2.3.5
cucumber = 0.6.2
cucumber-rails = 0.2.4
database_cleaner = 0.4.3
webrat = 0.6.0
selenium-client = 1.2.17
Estrutura de diretórios
No projeto rails execute script/generate cucumber e altere a estrutura gerada para a seguinte:
- features/ ( Aqui ficam as features que podem ser executadas com o Webrat )
- js_dependent/ ( Aqui vão as features que exigem o Selenium )
- support/
- env.rb ( Configurações comuns à todos )
- selenium.rb ( Configurações específicas para o Selenium )
- webrat.rb ( Configurações específicas para o Webrat )
- paths.rb
- step_definitions/ ( Definições comuns a todos os modos )
- webrat/ ( Definições de passos que só funcionam em modo Webrat )
- selenium/ ( Definições de passos que só funcionam em modo Selenium )
Configurações de ambiente
Conforme a estrutura de diretórios definida, no arquivo features/support/env.rb temos as configurações comuns a todos os perfis de execução, no meu caso aqui fica as configurações para factory_girl e matchers do rspec, se não usar nenhum dos dois remova as referências aos mesmos.
No arquivo features/support/selenium.rb configuramos o webrat em modo selenium, desabilitamos o uso de transactional fixtures e definimos a estratégia de limpeza do banco.
No arquivo features/support/webrat.rb apenas configuramos webrat em modo rails.
Perfis de execução
Criaremos 4 perfis de execução para o Cucumber a saber:
- default: Execução de todas as features não marcadas com a tag @wip utilizando o Webrat em modo rails
- wip: Execução das features marcadas com a tag @wip utilizando o Webrat em modo Rails
- selenium: Execução de todas as features não marcadas com a tag @wip utilizando o Webrat em modo Selenium
- selenium_wip: Execução de features marcadas com a tag @wip utilizando o Webrat em modo Selenium
A tag @wip(work in progress) serve para sinalizar cenários em que estamos trabalhando no momento.
Utilizaremos também um recurso interessante das últimas versões do Cucumber para sinalizar os cenários que estão falhando na execução de forma a executar somente estes da próxima vez.
Na execução do Cucumber utilizaremos o formato progress(mais limpo) por padrão, mas quando a execução falhar em algum cenário o formato será mudado para o pretty(mais informativo) de forma a facilitar a leitura.
Para definir os perfis do Cucumber crie o arquivo cucumber.yml na raiz da aplicação.
Tarefas Rake
Como mudamos os perfis de execução padrões, as tarefas rake geradas pelo Cucumber (quando você digitou script/generate cucumber) não são mais compatíveis. É necessário alterar o arquivo lib/tasks/cucumber.rake para refletir os perfis atuais.
Para ver as tarefas agora disponíveis digite: rake -T cucumber
A vantagem da execução através das tarefas rake ao invés da execução direta (cucumber -p nome_do_perfil) é que a tarefa rake realiza a preparação do banco de teste (rake db:test:prepare) antes de cada execução.
Conclusões
Você pode me perguntar: por que não uso o Cucumber apenas em modo Selenium já que o Webrat possui a limitação quanto ao Javascript?
Baterias de testes de aceitação com Selenium demoram muito mais para executar. Da forma como foi mostrado podemos aproveitar o melhor dos dois mundos: a velocidade e praticidade do Webrat e toda a abrangência do Selenium quando ela for necessária.
Olá, gostei bastante do post.
Mas me resta uma duvida, tentei usar Selenium pra testar umas telas que usam Jquery para manipular elementos visuais e pra ajax.
E varias vezes o Selenium dava “timeout” por clicar em um botão e não achar o resultado que aparecia via ajax.
Alguma dica pra isso?!
Olá Diego, para evitar que esse problema de timeout aconteça você pode criar um método wait_for_ajax dessa forma e utilizá-lo nos pontos onde a próxima ação depende de retorno via AJAX.
Cara,
Estou começando um outro projeto e seu post já está me ajudando.
Valeu!!
[...] possível para os testes passarem mantendo assim o design e implementação simples. Leia também o artigo do Jefferson Girão que fala sobre como usar um MIX de selenium (para testes client-side) e webrat (para server-side) [...]
[...] post onde abordei a configuração do Webrat em modo Selenium surgiu uma dúvida do Diego sobre timeout quando estamos testando algo que depende de retorno via AJAX. Como a dúvida é [...]