You are on page 1of 23

TESTES IN-BROWSER EM

RAILS COM CAPYBARA E


WEBDRIVER
Maurcio Linhares mauricio.linhares@gmail.com
Quem?
Maurcio Linhares
Joo Pessoa, terra que o sol nasce primeiro
Ruby e Java developer;
De Onde?
Testes in-browser em Rails A.C.
A.C. Antes do Capybara
Teste na mo chamando o Selenium RC;
Surge o WebRat que funciona quando acha que
deve e ainda chamando o Selenium RC;
Timeouts, loops eternos, browser que no abre...;
Selenium RC
Selenium RC
Lento;
WebServer em Java que de l controla o
navegador como um controle remoto (remote
control);
Se voc est do lado Java, tudo uma maravilha,
se no, pois ...
Selenium original
Selenium original era escrito em JavaScript;
Browsers so muito chatos no que JavaScript pode
fazer ou no (como se voc no soubesse disso);
Lento (engines de JS antigas) e muita coisa ficava
de fora;
Selenium 2 - WebDriver
Escrito utilizando a forma nativa do browser de ser
controlado:
Plugin no Firefox;
Automation tools no IE;
Fast! Fast! Fast!
API orientada a objetos e simplificada;
D.C. Depois do Capybara
Como Webrat, mas com WebDriver j integrado e
utilizado por padro;
Sintaxe praticamente igual a dos testes antigos
escritos com Webrat;
Est virando a opo padro pra testes in-
browser pra apps Rails com Cucumber;
DEMO
Montando a fbrica de objetos
Dado /^que (?:o|os|a|as) seguint(?:e|es) (.+)
exist(?:e|em):$/ do |nome, table|
table.hashes.each do |hash|
Factory( nome.singularize, hash )
end
end
Preenchendo um formulrio de login
# language: pt
Funcionalidade: Fazer login do usurio
Como usurio do sistema
Eu quero me autenticar no mesmo
Para poder acessar meu carrinho de compras
Cenrio: Fazer login
Dado que o seguinte usuario existe:
| nome | email | senha | senha_confirmation |
| Jos da Silva | jose@silva.com| 123456 | 123456 |
E que estou na pgina de login
Quando preencho "email" com "jose@silva.com"
E preencho "senha" com "123456"
E pressiono "Enviar"
Ento devo ver "Seja bem vindo a nossa loja, Jos da Silva"
E devo estar na listagem de produtos
features/support/paths.rb
def path_to(page_name)
case page_name
when /pgina inicial/
'/'
when 'listagem de produtos'
produtos_path
when 'pgina do carrinho'
itens_path
else
raise_path_error( page_name )
end
end
Cadastrando um usurio
# language: pt
Funcionalidade: Cadastrar um usurio no sistema
Como usurio do sistema
Eu quero ser capaz de criar uma conta no mesmo
Para poder me identificar e fazer meus pedidos
Cenrio: Cadastro com sucesso
Dado que estou na pgina de cadastro de usurio
Quando preencho "usuario[nome]" com "Marcos Silva"
E preencho "usuario[email]" com "marcos.silva@email.com"
E preencho "usuario[senha]" com "123456"
E preencho "usuario[senha_confirmation]" com "123456"
E marco "usuario[termos_e_condicoes]"
E pressiono "Enviar"
Ento devo ver "Dados recebidos com sucesso"
E devo estar na listagem de produtos
Testando chamadas Ajax
# language: pt
@javascript
Funcionalidade: Adicionar e remover itens do carrinho
Como usurio do sistema
Eu quero adicionar e remover itens ao carrinho
Para ser capaz efetuar compras
Contexto:
Dado que os seguintes produtos existem:
| nome | preco |
| Agile Estimating and Planning | 30.00 |
| Lean Software Development | 25.00 |
@javascript
Capybara usa tags do Cucumber para marcar se a sua
funcionalidade precisa ser testada com JavaScript ou no;
No necessrio ter os arquivos em pastas separadas nem
implementar steps de forma diferente;
Voc deve instalar a gem database_cleaner para que o
banco de dados seja limpo;
O prprio Capybara inicia um servidor e abre o navegador
pra fazer o servio;
Adicionando itens ao carrinho
Cenrio: Adicionar item ao carrinho
Dado que estou na listagem de produtos
Quando adiciono "5" itens do produto "Lean Software
Development" ao carrinho
Ento devo ver "Lean Software Development - 5"
Step especfico
Quando /^adiciono "([^\"]*)" itens do produto "([^\"]*)" ao
carrinho$/ do |quantidade, nome|
produto = Produto.find_by_nome( nome )
Quando "preencho \"quantidade\" com
\"#{quantidade}\" em \"#produto_#{produto.id}\""
Quando "pressiono \"Adicionar\" em
\"#produto_#{produto.id}\"
end
Removendo itens do carrinho
Cenrio: Remover itens do carrinho
Dado que estou na listagem de produtos
E adiciono "5" itens do produto "Lean Software Development" ao
carrinho
E adiciono "5" itens do produto "Agile Estimating and Planning" ao
carrinho
Quando vou pra pgina do carrinho
E removo o produto "Agile Estimating and Planning" do carrinho
Entao devo ver "Lean Software Development
Mas no devo ver "Agile Estimating and Planning"
Step especfico
Quando /^removo o produto "([^"]*)" do carrinho$/ do |nome|
produto = Produto.find_by_nome( nome )
Quando "clico em \"Remover produto\" em
\"#produto_#{produto.id}\"
end
Usando Chrome como navegador
padro
Capybara::Driver::Selenium.class_eval do
def self.driver
unless @driver
@driver = Selenium::WebDriver.for :chrome
at_exit do
@driver.quit
end
end
@driver
end
end
Referncias
Cucumber -
http://wiki.github.com/aslakhellesoy/cucumber/
Capybara http://github.com/jnicklas/capybara
Projeto de Exemplo -
http://github.com/mauricio/linuxfi-loja
@mauriciojr

You might also like