TESTES IN-BROWSER EM
RAILS COM CAPYBARA E
WEBDRIVER
Quem?
Maurício Linhares
João Pessoa, terra que o sol nasce primeiro
A.C. – Antes do Capybara
Teste na mão chamando o Selenium RC;
Surge o WebRat que funciona quando acha que
deve e ainda chamando o 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,
Selenium original
Selenium original era escrito em JavaScript;
Browsers são muito chatos no que JavaScript pode
fazer ou não (como se você não soubesse disso);
Lento (engines de JS antigas) e muita coisa ficava
Selenium 2 - WebDriver
Escrito utilizando a forma nativa do browser de ser
controlado:
Plugin no Firefox;
Automation tools no IE;
Fast! Fast! Fast!
D.C. – Depois do Capybara
Como Webrat, mas com WebDriver já integrado e
utilizado por padrão;
Sintaxe praticamente igual a dos testes antigos
escritos com Webrat;
Está virando a opção padrão pra testes
Montando a fábrica 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 formulário de login
# language: pt
Funcionalidade:Fazer login do usuário
Como usuário do sistema
Eu quero me autenticar no mesmo
Para poder acessar meu carrinho de compras
Cenário: 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 página de login
Quando preencho "email" com "jose@silva.com"
E preencho "senha" com "123456"
E pressiono "Enviar"
Então devo ver "Seja bem vindo a nossa loja, José da Silva"
features/support/paths.rb
def path_to(page_name)
case page_name
when /página inicial/
'/'
when 'listagem de produtos'
produtos_path
when 'página do carrinho'
itens_path
else
raise_path_error( page_name )
end end
Cadastrando um usuário
# language: pt
Funcionalidade:Cadastrar um usuário no sistema
Como usuário do sistema
Eu quero ser capaz de criar uma conta no mesmo Para poder me identificar e fazer meus pedidos
Cenário:Cadastro com sucesso
Dado que estou na página de cadastro de usuário
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"
Então devo ver "Dados recebidos com sucesso"
Testando chamadas Ajax
# language: pt
@javascript
Funcionalidade: Adicionar e remover itens do carrinho
Como usuário 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 não;
Não é necessário 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 próprio Capybara inicia um servidor e abre o navegador
Adicionando itens ao carrinho
Cenário: Adicionar item ao carrinho
Dado que estou na listagem de produtos
Quando adiciono "5" itens do produto "Lean Software Development" ao carrinho
Step específico
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}\"“
Removendo itens do carrinho
Cenário: 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 página do carrinho
E removo o produto "Agile Estimating and Planning" do carrinho
Entao devo ver "Lean Software Development“
Step específico
Quando /^removo o produto "([^"]*)" do carrinho$/ do |nome|
produto = Produto.find_by_nome( nome )
Quando "clico em \"Remover produto\" em \"#produto_#{produto.id}\"“
Usando Chrome como navegador
padrão
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