A ideia desse post é mostrar um pouco como funciona o capybara com o cucumber.
Vou criar um projeto com apenas um formulário para usar de exemplo para os testes de aceitação. Usarei o ruby 2.0.0-p0 e rails 3.2.13.
Cucumber é uma gem que cria um novo ambiente no projeto e permite a escrita de testes de aceitação em uma linguagem muito próxima da natural.
Capybara também é uma gem que ajuda a testar aplicações web, simulando como um usuário real iria interagir com o aplicativo.
Primeira etapa é adicionar a gem cucumber em seu gemfile. Adicione também a gem database_cleaner. Ela não é obrigatória, mas altamente recomendável. E por último, o 'bundle install'.
1 group :test do
2 gem 'cucumber-rails', :require => false
3 gem 'database_cleaner'
4 end
Após a instalação das gems, rode o comando para gerar os aquivos de configuração do cucumber.
1 $ rails generate cucumber:install
Agora execute o comando:
1 $ rake cucumber
Você deve obter o resultado a seguir:
1 0 scenarios
2 0 steps
3 0m0.000s
Crie um arquivo “/features/valida_form.feature” onde será escrito os Cenários. Descreva a ação de como o sistema deve se comportar.
1 # encoding: utf-8
2 # language: pt
3 Funcionalidade: Preencher o formulário
4
5 Cenário: Deve preencher todos os campos do forumlário e salvar com sucesso
6 Dado que eu estou na página do formulario
7 Quando eu preencher todos os campos
8 E clicar em "Salvar"
9 Então deve ver receber a mensagem "Usuarios cadastrado com sucesso"
Após salvar este arquivo, execute novamente o comando:
1 $ rake cucumber
O resultado obtido será:
1 1 scenario (1 undefined)
2 4 steps (4 undefined)
3 0m0.812s
Próximo passo para agilizar o processo será a criação de um scaffold de Usuário e validar a presença de todos os campos.
1 $ rails g scaffold usuario nome:string endereco:string telefone:string estado:string tipo:string
2 $ rake db:migrate
Vários Cenários podem ser criados. Um exemplo é não preencher todos os campos do formulário para um novo usuário e clicar em salvar. E sim, criar um passo onde deve-se garantir que não foi redirecionado para o “show” do usuário, mantendo-o na mesma página “new”. O capybara vai nos ajudar a preencher os fields do formulário.
Agora crie um arquivo “/features/step_definitions/valida_form_steps.rb” com o conteúdo abaixo:
1 # encoding: utf-8
2 Dado /^que eu estou na página do formulario$/ do
3 visit new_usuario_path
4 end
5
6 Quando /^eu preencher todos os campos$/ do
7 fill_in "usuario_nome", :with=> "Rodrigo Reginato"
8 fill_in "usuario_endereco", :with=> "Rua alagoas 3872"
9 fill_in "usuario_telefone", :with=> '4398765425'
10 page.select "SC", :from => 'usuario_estado'
11 page.choose("usuario_tipo_fisico")
12 end
13
14 E /^clicar em "(.*?)"$/ do |nome_do_botao|
15 find_button(nome_do_botao).click
16 save_and_open_page
17 end
18
19 Então /^deve ver receber a mensagem "(.*?)"$/ do |mensagem|
20 page.has_content?(mensagem)
21 end
Após adicionar este código rode novamente o comando:
1 $ rake cucumber
O resultado obtido será:
1 1 scenario (1 passed)
2 4 steps (4 passed)
3 0m0.425s
Para facilitar a nossa vida, existem algumas funções que são fundamentais, como:
1 save_and_open_page
Para utilizarmos este recurso, é necessário instalar a gem:
1 gem 'launchy'
Um browser é aberto no momento que este comando é adicionado entre os steps, facilitando para encontrar possíveis erros.
No caso da página ter algum javascript ou se quiser ver todo o processo passo a passo como se o usuário estivesse digitando os dados, é necessário instalar a gem selenium-webdriver.
Existem outras opções como o capybara-webkit, mas apresentou um erro na hora do bundle. Já o selenium-webdriver, funcionou perfeitamente.
1 gem 'selenium-webdriver'
Adicione @javascript na primeira linha antes do Cenário iniciar.
1 @javascript
2 Cenário: Deve preencher todos os campos do formulário e salvar com sucesso
Um browser será aberto logo no início do processo e todos os passos que descrevi acima ficarão visíveis como se um usuário estivesse preenchendo os campos.
É isso pessoal, até a próxima.
Comentários
Included file post/disqus_thread.html not found in _includes directory