SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
TESTES IN-BROWSER EM
RAILS COM CAPYBARA E
WEBDRIVER
Maurício Linhares – mauricio.linhares@gmail.com
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 | 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"
   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 "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"
   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 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
    pra 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

Contenu connexe

En vedette

O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a ObjetosO que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a ObjetosDanilo Sato
 
Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Robson Silva Espig
 
Como o Cucumber Funciona
Como o Cucumber FuncionaComo o Cucumber Funciona
Como o Cucumber FuncionaLaís Berlatto
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Mario Jorge Pereira
 
Programação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e ImplementaçãoProgramação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e ImplementaçãoEvandro Júnior
 
Introdução a programação Orientada a Objeto
Introdução a programação Orientada a ObjetoIntrodução a programação Orientada a Objeto
Introdução a programação Orientada a ObjetoMarconi Rodrigues
 
RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteEduardo Mendes
 
Apostila Lógica de Programação
Apostila Lógica de ProgramaçãoApostila Lógica de Programação
Apostila Lógica de ProgramaçãoRicardo Terra
 
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃOCURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃOMicrosoft
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java BasicoJoel Lobo
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetosCleyton Ferrari
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programaçãorodfernandes
 

En vedette (15)

O que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a ObjetosO que você NÃO aprendeu sobre Programação Orientada a Objetos
O que você NÃO aprendeu sobre Programação Orientada a Objetos
 
BDD & Cucumber
BDD & CucumberBDD & Cucumber
BDD & Cucumber
 
Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)Programacao Orientada A Objetos (Java)
Programacao Orientada A Objetos (Java)
 
Como o Cucumber Funciona
Como o Cucumber FuncionaComo o Cucumber Funciona
Como o Cucumber Funciona
 
BDD: Cucumber + Selenium + Java
BDD: Cucumber + Selenium + JavaBDD: Cucumber + Selenium + Java
BDD: Cucumber + Selenium + Java
 
Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java Revisão Sobre Programação Orientada a Objetos com Java
Revisão Sobre Programação Orientada a Objetos com Java
 
Programação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e ImplementaçãoProgramação Orientada á Objeto - Paradigmas e Implementação
Programação Orientada á Objeto - Paradigmas e Implementação
 
BDD com Cucumber
BDD com CucumberBDD com Cucumber
BDD com Cucumber
 
Introdução a programação Orientada a Objeto
Introdução a programação Orientada a ObjetoIntrodução a programação Orientada a Objeto
Introdução a programação Orientada a Objeto
 
RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em Teste
 
Apostila Lógica de Programação
Apostila Lógica de ProgramaçãoApostila Lógica de Programação
Apostila Lógica de Programação
 
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃOCURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
CURSO JAVA - AULA 1 - INTRODUÇÃO LÓGICA DE PROGRAMAÇÃO
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Programação orientada a objetos
Programação orientada a objetosProgramação orientada a objetos
Programação orientada a objetos
 
Material de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de ProgramaçãoMaterial de Apoio de Algoritmo e Lógica de Programação
Material de Apoio de Algoritmo e Lógica de Programação
 

Similaire à TESTES IN-BROWSER EM RAILS COM CAPYBARA E WEBDRIVER

pepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSSpepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSSRodrigo Urubatan
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Daniel Makiyama
 
QArentena 21: BDD - com Fábio Araújo
QArentena 21: BDD - com Fábio AraújoQArentena 21: BDD - com Fábio Araújo
QArentena 21: BDD - com Fábio AraújoJosé Correia
 
Caipira agil automacao front end selenium
Caipira agil automacao front end seleniumCaipira agil automacao front end selenium
Caipira agil automacao front end seleniumQualister
 
Express checkout PayPal
Express checkout PayPalExpress checkout PayPal
Express checkout PayPalJeff Prestes
 
O processo de criação de um web site | By Alessandra Soares
O processo de criação de um web site | By Alessandra SoaresO processo de criação de um web site | By Alessandra Soares
O processo de criação de um web site | By Alessandra SoaresProdv Comunicação
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaCharles Kilesse
 
Além do page object tdc2015 fln
Além do page object   tdc2015 flnAlém do page object   tdc2015 fln
Além do page object tdc2015 flnGustavo Fonseca
 
Automatizando Tarefas com o Watir-Webdriver - Case
Automatizando Tarefas com o Watir-Webdriver - CaseAutomatizando Tarefas com o Watir-Webdriver - Case
Automatizando Tarefas com o Watir-Webdriver - CaseLucas Prim
 
Ruby on Rails I - Modelos
Ruby on Rails I - ModelosRuby on Rails I - Modelos
Ruby on Rails I - ModelosTiago Lima
 
Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1mateuscaletti
 
[GUTS-RS] Evento Outubro 2017 - Entrega contínua do zero ao sucesso
[GUTS-RS] Evento Outubro 2017 - Entrega contínua  do zero ao sucesso[GUTS-RS] Evento Outubro 2017 - Entrega contínua  do zero ao sucesso
[GUTS-RS] Evento Outubro 2017 - Entrega contínua do zero ao sucessoGUTS-RS
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.jsGiovanni Bassi
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best PracticesKaroline Leite
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfGabrielaMota46
 

Similaire à TESTES IN-BROWSER EM RAILS COM CAPYBARA E WEBDRIVER (20)

pepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSSpepinos do cliente no código de testes da aplicação com OSS
pepinos do cliente no código de testes da aplicação com OSS
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
 
Daw slide 06
Daw slide 06Daw slide 06
Daw slide 06
 
QArentena 21: BDD - com Fábio Araújo
QArentena 21: BDD - com Fábio AraújoQArentena 21: BDD - com Fábio Araújo
QArentena 21: BDD - com Fábio Araújo
 
Caipira agil automacao front end selenium
Caipira agil automacao front end seleniumCaipira agil automacao front end selenium
Caipira agil automacao front end selenium
 
Express checkout PayPal
Express checkout PayPalExpress checkout PayPal
Express checkout PayPal
 
O processo de criação de um web site | By Alessandra Soares
O processo de criação de um web site | By Alessandra SoaresO processo de criação de um web site | By Alessandra Soares
O processo de criação de um web site | By Alessandra Soares
 
Além do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completaAlém do Webdriver e Page Objects - Versão completa
Além do Webdriver e Page Objects - Versão completa
 
Além do page object tdc2015 fln
Além do page object   tdc2015 flnAlém do page object   tdc2015 fln
Além do page object tdc2015 fln
 
Automatizando Tarefas com o Watir-Webdriver - Case
Automatizando Tarefas com o Watir-Webdriver - CaseAutomatizando Tarefas com o Watir-Webdriver - Case
Automatizando Tarefas com o Watir-Webdriver - Case
 
Daw slide 07
Daw slide 07Daw slide 07
Daw slide 07
 
04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf
 
Ruby on Rails I - Modelos
Ruby on Rails I - ModelosRuby on Rails I - Modelos
Ruby on Rails I - Modelos
 
Daw slide 08
Daw slide 08Daw slide 08
Daw slide 08
 
Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1Automação de Testes com SoapUI v1
Automação de Testes com SoapUI v1
 
[GUTS-RS] Evento Outubro 2017 - Entrega contínua do zero ao sucesso
[GUTS-RS] Evento Outubro 2017 - Entrega contínua  do zero ao sucesso[GUTS-RS] Evento Outubro 2017 - Entrega contínua  do zero ao sucesso
[GUTS-RS] Evento Outubro 2017 - Entrega contínua do zero ao sucesso
 
LambdaDay: Backbone.js
LambdaDay: Backbone.jsLambdaDay: Backbone.js
LambdaDay: Backbone.js
 
Vb
VbVb
Vb
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best Practices
 
LPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdfLPII_Aula_7-JQuery.pdf
LPII_Aula_7-JQuery.pdf
 

Plus de Maurício Linhares

Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropMaurício Linhares
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMaurício Linhares
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleçõesMaurício Linhares
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratosMaurício Linhares
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemMaurício Linhares
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Maurício Linhares
 

Plus de Maurício Linhares (20)

Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
 
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Curso java 07 - exceções
Curso java   07 - exceçõesCurso java   07 - exceções
Curso java 07 - exceções
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleções
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratos
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Curso java 02 - variáveis
Curso java   02 - variáveisCurso java   02 - variáveis
Curso java 02 - variáveis
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Feature Driven Development
Feature Driven DevelopmentFeature Driven Development
Feature Driven Development
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvem
 
Mercado hoje
Mercado hojeMercado hoje
Mercado hoje
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Revisão html e java script
Revisão html e java scriptRevisão html e java script
Revisão html e java script
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010
 

TESTES IN-BROWSER EM RAILS COM CAPYBARA E WEBDRIVER

  • 1. TESTES IN-BROWSER EM RAILS COM CAPYBARA E WEBDRIVER Maurício Linhares – mauricio.linhares@gmail.com
  • 2. Quem?  Maurício Linhares  João Pessoa, terra que o sol nasce primeiro  Ruby e Java developer;
  • 4. Testes “in-browser” em Rails – A.C.
  • 5. 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...;
  • 7. 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 é...
  • 8. 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;
  • 9. 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;
  • 10. 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;
  • 11. DEMO
  • 12. 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
  • 13. 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" E devo estar na listagem de produtos
  • 14. 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
  • 15. 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" E devo estar na listagem de produtos
  • 16. 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 |
  • 17. @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 pra fazer o serviço;
  • 18. 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"
  • 19. 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
  • 20. 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"
  • 21. 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
  • 22. 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
  • 23. 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