Upload
mauricio-linhares
View
7.353
Download
5
Embed Size (px)
DESCRIPTION
Apresentação sobre testes utilizando Rails, Capybara, WebDriver e Cucumber. Palestra apresentada originalmente no OxenteRails 2010.
Citation preview
Quem?
Maurício Linhares
João 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 mão chamando o Selenium RC;
Surge o WebRat que funciona quando acha que
deve e ainda chamando o Selenium RC;
Timeouts, loops eternos, browser que não 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 não, pois é...
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
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 padrão;
Sintaxe praticamente igual a dos testes antigos
escritos com Webrat;
Está virando a opção padrão pra testes “in-
browser” pra apps Rails com Cucumber;
DEMO
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 | [email protected] | 123456 | 123456 |
E que estou na página de login
Quando preencho "email" com "[email protected]"
E preencho "senha" com "123456"
E pressiono "Enviar"
Então 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 /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 "[email protected]"
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"
E devo estar na listagem de produtos
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 suafuncionalidade precisa ser testada com JavaScript ou não;
Não é necessário ter os arquivos em pastas separadas nemimplementar 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 navegadorpra fazer o serviço;
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
Então devo ver "Lean Software Development - 5"
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}\"“
end
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“
Mas não devo ver "Agile Estimating and Planning"
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}\"“
end
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
Referências
Cucumber -http://wiki.github.com/aslakhellesoy/cucumber/
Capybara – http://github.com/jnicklas/capybara
Projeto de Exemplo -http://github.com/mauricio/linuxfi-loja
@mauriciojr