HE:labs

Postado por Rodrigo Reginato em 03/07/2013

Testes de aceitação com capybara e cucumber

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

Dicas

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