SlideShare uma empresa Scribd logo
1 de 77
Boas Práticas de Automação de Testes
Camilo Ribeiro

        Sr. QA Consultant na ThoughtWorks
        Developer e Devops nos fins de semana
        Blogger www.bugbang.com.br

        about.me/camiloribeiro
             @camiloribeiro
        github.com/camiloribeiro

        http://join.thoughtworks.com/profiles/camilo-ribeiro

Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
Carlos Palhares
     Development Consultant na
     ThoughtWorks

     Developer nos finais de semana

     cpalhares@thoughtworks.com

     xjunior.me
     twitter.com/xjunior
     github.com/xjunior


Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
~ 2.000Twers
                                                                           25 escritórios
                                                                             11 países
                                                                             1 cultura




http://social-impact.thoughtworks.com/


Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
Por que automatizar?
Record and Replay
require 'watir-webdriver'

browser = Watir::Browser.new :firefox
browser.goto "http://google.com.br"
browser.text_field(:name => 'q').set('Automação Rocks!')
browser.button(:name => 'btnG').click
sleep 1
if browser.text.include? 'The Bug Bang Theory 2.0'
puts 'Sucess'
else puts 'fail'
end
browser.close
require 'watir-webdriver'

browser = Watir::Browser.new :firefox
browser.goto "http://google.com.br"
browser.text_field(:name => 'q').set('Automação Rocks!')
browser.button(:name => 'btnG').click
sleep 1
if browser.text.include? 'The Bug Bang Theory 2.0'
puts 'Sucess'
else puts 'fail'
end
browser.close
Record and Replay
Bare Sleep
//pseudo-code
click_login_button();
fill_user(“Mario”);
//pseudo-code
click_login_button();
fill_user(“Mario”);
Erro: Campo “user” não encontrado
//pseudo-code
click_login_button();
sleep(3000)
fill_user(“Mario”);
Testes Lentos




Testes Irreais
Bare Sleep
Keep Pooling / Implicit Wait Time
//pseudo-code
  click_login_button();
  TIMEOUT.times do
       break if user_field.present?
       sleep 1
  end
  fill_user(“Mario”);



http://martinfowler.com/articles/nonDeterminism.html
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = TIMEOUT

click_login_button
element = driver.find_element(:id => ”user")




http://seleniumhq.org/docs/04_webdriver_advanced.html
Lack of Isolation
Teste 1 – Verifica Soma dos produtos cadastrados:
   Produto A = 100,00
   Produto B = 50,00
   Soma produtos = 150,00

   Teste 2 – Cadastra um novo produto:
   Cadastra Produto C = 200,00
   Verifica se existe um produto chamado “Produto C”



http://martinfowler.com/articles/nonDeterminism.html
Ordem dos testes:

 Verificando soma dos produtos
 Cadastrando novo produto
Produtos
  Verificando soma dos produtos
    A soma dos produtos deve ser 150
  Cadastrando novo produto
    Devo cadastrar o produto C
Ordem dos testes:

 Cadastrando novo produto
 Verificando soma dos produtos
Produtos
  Cadastrando novo produto
    Devo cadastrar o produto C
  Verificando soma dos produtos
    A soma dos produtos deve ser 150

ExpectationNotMetError: expected: 4
Experado = 150,00
Resultado = 350,00
Testes isolados
Cenário: Cadastrar produtos
 Dado que eu estou na página de cadastro de produtos
 Quando eu cadastro o produto “C”
 E salvo
 Então eu devo ver o produto cadastrado

Cenário: Verificar soma dos produtos
 Dado que os produtos A e B estão cadastrados
 Quando eu solicito ver o valor total dos produtos
 Então eu devo ver o valor total como 150,00
Ordem dos testes:

 Verificando soma dos produtos
 Cadastrando novo produto
Cenário: Verificar soma dos produtos
 Dado que os produtos A e B estão cadastrados
 Quando eu solicito ver o valor total dos produtos
 Então eu devo ver o valor total como 150,00

Cenário: Cadastrar produtos
 Dado que eu estou na página de cadastro de produtos
 Quando eu cadastro o produto “C”
 E salvo
 Então eu devo ver o produto cadastrado
Ordem dos testes:

 Cadastrando novo produto
 Verificando soma dos produtos
Cenário: Cadastrar produtos
 Dado que eu estou na página de cadastro de produtos
 Quando eu cadastro o produto “C”
 E salvo
 Então eu devo ver o produto cadastrado

Cenário: Verificar soma dos produtos
 Dado que os produtos A e B estão cadastrados
 Quando eu solicito ver o valor total dos produtos
 Então eu devo ver o valor total como 150,00
Given When Then
Given I have an amazing chocolate (and I love it!)
When I eat the chocolate (Uhmm *.*)
Then there is no more chocolate :(
Clean up your mess
DRY – Don’t Repeat Yourself
(and don’t reinvent the wheel)
Data-Driven Testing
http://xunitpatterns.com/Data-Driven%20Test.html
var lado1 = 10
var lado2 = 10
var lado3 = 10

mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()
mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘equilatero’)

var lado1 = 3
var lado2 = 4
var lado3 = 5

mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()
mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘isóceles’)

var lado1 = 4
var lado2 = 4
var lado3 = 5

mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()
mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘escaleno’)

…
var arquivo = File.read(“dados.csv”)

arquivo.each do
  var lado1 = arquivo[‘lado 1’]
  var lado2 = arquivo[‘lado 2’]
  var lado3 = arquivo[‘lado 3’]
  var tipoTriangulo = arquivo[‘tipo esperado’]

  mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()

  var tipoRetornado = mathService.tipoTriangulo(lado1, lado2, lado3)
  tipoRetornado.should().be(tipoTriangulo)
end
Factory Pattern
http://blog.fossmo.net/post/What-is-the-factory-method-pattern.aspx
FactoryGirl.define do
 factory :candidate do
   name      'Candidato Fulano de Tal'
   short_name 'Fulano Legal'
   role    'Vereador'
end


 factory :candidate_without_role, :parent => :candidate do
   after(:build) do |candidate|
    candidate.role = nil
   end
 end




https://github.com/thoughtworks/voto-como-vamos
Separation Of Concerns
require 'watir-webdriver'

  browser = Watir::Browser.new :firefox
  browser.goto "http://google.com.br"
  browser.text_field(:name =>
  'q').set('Automação Rocks!')
  browser.button(:name => 'btnG').click
  sleep 1
  if browser.text.include? 'The Bug Bang Theory
  2.0'
  puts 'Sucess'
  else puts 'fail'
  end
  browser.close
http://www.bugbang.com.br/?p=2108
Mais vinte testes por favor 
require 'watir-webdriver'

                   browser = Watir::Browser.new :firefox
                   browser.goto "http://google.com.br"
                   browser.text_field(:name => 'q').set('Automação Rocks!')
                   browser.button(:name => 'btnG').click
                   if browser.text.include? 'The Bug Bang Theory 2.0'
                   puts 'Sucess'
                   else
                   puts 'fail'
                   end
                   browser.close

                   browser = Watir::Browser.new :firefox
                   browser.goto "http://google.com.br"
                   browser.text_field(:name => 'q').set('Selenium history')
                   browser.button(:name => 'btnG').click
                   if browser.text.include? 'ThoughtWorks'
                   puts 'Sucess'
                   else
                   puts 'fail'
                   end
                   browser.close

                   browser = Watir::Browser.new :firefox
                   browser.goto "http://google.com.br"
                   browser.text_field(:name => 'q').set('Desafio Selenium')
                   browser.button(:name => 'btnG').click
                   if browser.text.include? 'sembugs.blogspot.com.br'
                   puts 'Sucess'
                   else
                   puts 'fail'
                   end
                   browser.close

http://www.bugbang.com.br/?p=2108
Page-Object Model
Test Flow



Page 1   Page 2   …………   Page N
module Search
  class HomePage
    @url = “www.google.com”
    @search_field = “q”
    @search_button = “search”

      def input_search(value)
        @browser.text_field(:name => @search_field).set value
      end

      def run_search
        @browser.button(:class => @search_button).click
         return ResultPage.new
      end

      def visit
        @browser
      end
end
http://www.bugbang.com.br/?p=2108
module Search
  class HomePage        Elementos    da página como atributos
    @url = “www.google.com”
    @search_field = “q”
    @search_button = “search”

      def input_search(value)
        @browser.text_field(:name => @search_field).set value
      end

      def run_search
        @browser.button(:class => @search_button).click
         return ResultPage.new
      end

      def visit
        @browser
      end
end
http://www.bugbang.com.br/?p=2108
module Search
  class HomePage
    @url = “www.google.com”
    @search_field = “q”
    @search_button = “search”

      def input_search(value)
        @browser.text_field(:name => @search_field).set value
      end

      def run_search
        @browser.button(:class => @search_button).click
         return ResultPage.new
      end
                         Comportamentos como contrato
      def visit
        @browser
      end
end
http://www.bugbang.com.br/?p=2108
@page = Search.HomePage.new
 @page.visit
 @page.input_search(“xjunior.me”)
 @resultPage = @page.search
 @first = @resultPage.results.first
 @first.title.should eq(“Carlos Palhares”)




http://www.bugbang.com.br/?p=2108
Lendo e aprendendo 
Resumindo…


* Codigo de teste também é código;
     - (quase) todas as boas práticas se aplicam

* Don’t Repeat yourself!

* Código de teste deve ser uma represetação
automática da interação do usuário
     - Seu sistema pode não dar feedback suficiente
Dúvidas?
We are hiring!




         http://join.thoughtworks.com/
Muito Obrigado!!!




            Envie o seu Feedback e dúvidas para:
                cribeiro@thoughtworks.com
               cpalhares@thoughtworks.com


Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.

Mais conteúdo relacionado

Destaque

IBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesIBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesFelipe Freire
 
OS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOS
OS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOSOS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOS
OS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOSLuiz Ladeira
 
A Importância do Teste de Software
A Importância do Teste de SoftwareA Importância do Teste de Software
A Importância do Teste de SoftwareFabrício Campos
 
Automação de testes - 7 passos para o sucesso!
Automação de testes - 7 passos para o sucesso!Automação de testes - 7 passos para o sucesso!
Automação de testes - 7 passos para o sucesso!Daniel Amorim
 
Automação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e MobileAutomação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e MobileElias Nogueira
 
Criando pipelines de entrega contínua multilinguagem com Docker e Jenkins
Criando pipelines de entrega contínua multilinguagem com Docker e JenkinsCriando pipelines de entrega contínua multilinguagem com Docker e Jenkins
Criando pipelines de entrega contínua multilinguagem com Docker e JenkinsCamilo Ribeiro
 
Como NÃO testar o seu projeto de Software. DevDay 2014
Como NÃO testar o seu projeto de Software. DevDay 2014Como NÃO testar o seu projeto de Software. DevDay 2014
Como NÃO testar o seu projeto de Software. DevDay 2014alexandre freire
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesCamilo Ribeiro
 
Do push para a produção: Os desafios de automação em Continuous Delivery
Do push para a produção: Os desafios de automação em Continuous DeliveryDo push para a produção: Os desafios de automação em Continuous Delivery
Do push para a produção: Os desafios de automação em Continuous DeliveryCamilo Ribeiro
 
Quando tdd não é o suficiente
Quando tdd não é o suficienteQuando tdd não é o suficiente
Quando tdd não é o suficienteCamilo Ribeiro
 
Modelo de Prototipação
Modelo de PrototipaçãoModelo de Prototipação
Modelo de PrototipaçãoJuliano Pires
 
Introdução a Automação de Teste de Software
Introdução a Automação de Teste de SoftwareIntrodução a Automação de Teste de Software
Introdução a Automação de Teste de SoftwareCamilo Ribeiro
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizadosThiago Ghisi
 
Prototipagem
PrototipagemPrototipagem
Prototipagemjwainer
 
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e WebdriverJúlio de Lima
 
Prototipação de software
Prototipação de softwarePrototipação de software
Prototipação de softwareleopp
 
[TICNOVA2015] Palestra sobre Automação de Testes
[TICNOVA2015] Palestra sobre Automação de Testes[TICNOVA2015] Palestra sobre Automação de Testes
[TICNOVA2015] Palestra sobre Automação de TestesJúlio de Lima
 

Destaque (20)

IBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em TestesIBM Rational Piores Práticas em Testes
IBM Rational Piores Práticas em Testes
 
OS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOS
OS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOSOS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOS
OS FUNDAMENTOS DE TESTE DE SOFTWARE E SUA IMPORTÂNCIA NA QUALIDADE DE PROJETOS
 
A Importância do Teste de Software
A Importância do Teste de SoftwareA Importância do Teste de Software
A Importância do Teste de Software
 
Automação de testes - 7 passos para o sucesso!
Automação de testes - 7 passos para o sucesso!Automação de testes - 7 passos para o sucesso!
Automação de testes - 7 passos para o sucesso!
 
Automação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e MobileAutomação de Teste para REST, Web e Mobile
Automação de Teste para REST, Web e Mobile
 
Prototipagem
PrototipagemPrototipagem
Prototipagem
 
Criando pipelines de entrega contínua multilinguagem com Docker e Jenkins
Criando pipelines de entrega contínua multilinguagem com Docker e JenkinsCriando pipelines de entrega contínua multilinguagem com Docker e Jenkins
Criando pipelines de entrega contínua multilinguagem com Docker e Jenkins
 
Como NÃO testar o seu projeto de Software. DevDay 2014
Como NÃO testar o seu projeto de Software. DevDay 2014Como NÃO testar o seu projeto de Software. DevDay 2014
Como NÃO testar o seu projeto de Software. DevDay 2014
 
Técnicas de Teste
Técnicas de TesteTécnicas de Teste
Técnicas de Teste
 
Desenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por TestesDesenvolvimento Dirigido por Testes
Desenvolvimento Dirigido por Testes
 
Do push para a produção: Os desafios de automação em Continuous Delivery
Do push para a produção: Os desafios de automação em Continuous DeliveryDo push para a produção: Os desafios de automação em Continuous Delivery
Do push para a produção: Os desafios de automação em Continuous Delivery
 
Quando tdd não é o suficiente
Quando tdd não é o suficienteQuando tdd não é o suficiente
Quando tdd não é o suficiente
 
Modelo de Prototipação
Modelo de PrototipaçãoModelo de Prototipação
Modelo de Prototipação
 
Introdução a Automação de Teste de Software
Introdução a Automação de Teste de SoftwareIntrodução a Automação de Teste de Software
Introdução a Automação de Teste de Software
 
Introdução a testes automatizados
Introdução a testes automatizadosIntrodução a testes automatizados
Introdução a testes automatizados
 
Prototipagem
PrototipagemPrototipagem
Prototipagem
 
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
[38º GURU SP] Automação de Testes Web em Ruby com Cucumber e Webdriver
 
Prototipação de software
Prototipação de softwarePrototipação de software
Prototipação de software
 
[TICNOVA2015] Palestra sobre Automação de Testes
[TICNOVA2015] Palestra sobre Automação de Testes[TICNOVA2015] Palestra sobre Automação de Testes
[TICNOVA2015] Palestra sobre Automação de Testes
 
Selenium
SeleniumSelenium
Selenium
 

Semelhante a Boas Práticas de Automação de Testes

Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicosponto hacker
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app enginepugpe
 
Ferramentas de automação de teste
Ferramentas de automação de testeFerramentas de automação de teste
Ferramentas de automação de testeMarcos Pessoa
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best PracticesKaroline Leite
 
Cuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecCuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecMaurício Linhares
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introduçãoJosino Rodrigues
 
Testando frontend utilizando ferraments JS
Testando frontend utilizando ferraments JSTestando frontend utilizando ferraments JS
Testando frontend utilizando ferraments JSFernando Fabricio
 
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
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizadosRodrigo Maia
 
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...Ezequiel Bertti
 
jQuery - Visão Geral
jQuery - Visão GeraljQuery - Visão Geral
jQuery - Visão GeralKaio Valente
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureVitor Ciaramella
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
Simplificando o full stack - desenvolvimento web na prática
Simplificando o full stack - desenvolvimento web na práticaSimplificando o full stack - desenvolvimento web na prática
Simplificando o full stack - desenvolvimento web na práticaMarianna Cruz Teixeira
 

Semelhante a Boas Práticas de Automação de Testes (20)

Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Javascript truquesmagicos
Javascript truquesmagicosJavascript truquesmagicos
Javascript truquesmagicos
 
Desenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engineDesenvolvendo aplicativos web com o google app engine
Desenvolvendo aplicativos web com o google app engine
 
Ferramentas de automação de teste
Ferramentas de automação de testeFerramentas de automação de teste
Ferramentas de automação de teste
 
Cucumber Best Practices
Cucumber Best PracticesCucumber Best Practices
Cucumber Best Practices
 
Cuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecCuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpec
 
Grails parte 1 - introdução
Grails   parte 1 - introduçãoGrails   parte 1 - introdução
Grails parte 1 - introdução
 
Testando frontend utilizando ferraments JS
Testando frontend utilizando ferraments JSTestando frontend utilizando ferraments JS
Testando frontend utilizando ferraments JS
 
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
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
Python 06
Python 06Python 06
Python 06
 
Html dom, eventos, jquery
Html dom, eventos, jqueryHtml dom, eventos, jquery
Html dom, eventos, jquery
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizados
 
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
MIRA - Um framework Javascript para construção de interfaces adaptativas em a...
 
Workshop Django
Workshop DjangoWorkshop Django
Workshop Django
 
jQuery - Visão Geral
jQuery - Visão GeraljQuery - Visão Geral
jQuery - Visão Geral
 
Windows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows AzureWindows Azure 5/8 - Recursos adicionais do Windows Azure
Windows Azure 5/8 - Recursos adicionais do Windows Azure
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Selenium - WebDriver
Selenium - WebDriverSelenium - WebDriver
Selenium - WebDriver
 
Simplificando o full stack - desenvolvimento web na prática
Simplificando o full stack - desenvolvimento web na práticaSimplificando o full stack - desenvolvimento web na prática
Simplificando o full stack - desenvolvimento web na prática
 

Mais de Camilo Ribeiro

Jenkins2: How Jenkins 2 works and how to automate it
Jenkins2: How Jenkins 2 works and how to automate itJenkins2: How Jenkins 2 works and how to automate it
Jenkins2: How Jenkins 2 works and how to automate itCamilo Ribeiro
 
Continuous Delivery Pipeline with Docker and Jenkins
Continuous Delivery Pipeline with Docker and JenkinsContinuous Delivery Pipeline with Docker and Jenkins
Continuous Delivery Pipeline with Docker and JenkinsCamilo Ribeiro
 
Certificações em Teste e Qualidade de Software
Certificações em Teste e Qualidade de SoftwareCertificações em Teste e Qualidade de Software
Certificações em Teste e Qualidade de SoftwareCamilo Ribeiro
 
Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade Camilo Ribeiro
 
Extração de Features Usando Compilação Condicional
Extração de Features Usando Compilação CondicionalExtração de Features Usando Compilação Condicional
Extração de Features Usando Compilação CondicionalCamilo Ribeiro
 
Papéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de SoftwarePapéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de SoftwareCamilo Ribeiro
 

Mais de Camilo Ribeiro (6)

Jenkins2: How Jenkins 2 works and how to automate it
Jenkins2: How Jenkins 2 works and how to automate itJenkins2: How Jenkins 2 works and how to automate it
Jenkins2: How Jenkins 2 works and how to automate it
 
Continuous Delivery Pipeline with Docker and Jenkins
Continuous Delivery Pipeline with Docker and JenkinsContinuous Delivery Pipeline with Docker and Jenkins
Continuous Delivery Pipeline with Docker and Jenkins
 
Certificações em Teste e Qualidade de Software
Certificações em Teste e Qualidade de SoftwareCertificações em Teste e Qualidade de Software
Certificações em Teste e Qualidade de Software
 
Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade Teste de Software Introdução à Qualidade
Teste de Software Introdução à Qualidade
 
Extração de Features Usando Compilação Condicional
Extração de Features Usando Compilação CondicionalExtração de Features Usando Compilação Condicional
Extração de Features Usando Compilação Condicional
 
Papéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de SoftwarePapéis em Teste e Qualidade de Software
Papéis em Teste e Qualidade de Software
 

Boas Práticas de Automação de Testes

  • 1. Boas Práticas de Automação de Testes
  • 2. Camilo Ribeiro Sr. QA Consultant na ThoughtWorks Developer e Devops nos fins de semana Blogger www.bugbang.com.br about.me/camiloribeiro @camiloribeiro github.com/camiloribeiro http://join.thoughtworks.com/profiles/camilo-ribeiro Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
  • 3. Carlos Palhares Development Consultant na ThoughtWorks Developer nos finais de semana cpalhares@thoughtworks.com xjunior.me twitter.com/xjunior github.com/xjunior Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
  • 4. ~ 2.000Twers 25 escritórios 11 países 1 cultura http://social-impact.thoughtworks.com/ Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
  • 6.
  • 7.
  • 9.
  • 10. require 'watir-webdriver' browser = Watir::Browser.new :firefox browser.goto "http://google.com.br" browser.text_field(:name => 'q').set('Automação Rocks!') browser.button(:name => 'btnG').click sleep 1 if browser.text.include? 'The Bug Bang Theory 2.0' puts 'Sucess' else puts 'fail' end browser.close
  • 11.
  • 12.
  • 13. require 'watir-webdriver' browser = Watir::Browser.new :firefox browser.goto "http://google.com.br" browser.text_field(:name => 'q').set('Automação Rocks!') browser.button(:name => 'btnG').click sleep 1 if browser.text.include? 'The Bug Bang Theory 2.0' puts 'Sucess' else puts 'fail' end browser.close
  • 16.
  • 17.
  • 18.
  • 20.
  • 22.
  • 23.
  • 25.
  • 26.
  • 29. Keep Pooling / Implicit Wait Time
  • 30. //pseudo-code click_login_button(); TIMEOUT.times do break if user_field.present? sleep 1 end fill_user(“Mario”); http://martinfowler.com/articles/nonDeterminism.html
  • 31. require 'selenium-webdriver' driver = Selenium::WebDriver.for :firefox driver.manage.timeouts.implicit_wait = TIMEOUT click_login_button element = driver.find_element(:id => ”user") http://seleniumhq.org/docs/04_webdriver_advanced.html
  • 32.
  • 34. Teste 1 – Verifica Soma dos produtos cadastrados: Produto A = 100,00 Produto B = 50,00 Soma produtos = 150,00 Teste 2 – Cadastra um novo produto: Cadastra Produto C = 200,00 Verifica se existe um produto chamado “Produto C” http://martinfowler.com/articles/nonDeterminism.html
  • 35. Ordem dos testes: Verificando soma dos produtos Cadastrando novo produto
  • 36. Produtos Verificando soma dos produtos A soma dos produtos deve ser 150 Cadastrando novo produto Devo cadastrar o produto C
  • 37. Ordem dos testes: Cadastrando novo produto Verificando soma dos produtos
  • 38.
  • 39. Produtos Cadastrando novo produto Devo cadastrar o produto C Verificando soma dos produtos A soma dos produtos deve ser 150 ExpectationNotMetError: expected: 4 Experado = 150,00 Resultado = 350,00
  • 41. Cenário: Cadastrar produtos Dado que eu estou na página de cadastro de produtos Quando eu cadastro o produto “C” E salvo Então eu devo ver o produto cadastrado Cenário: Verificar soma dos produtos Dado que os produtos A e B estão cadastrados Quando eu solicito ver o valor total dos produtos Então eu devo ver o valor total como 150,00
  • 42. Ordem dos testes: Verificando soma dos produtos Cadastrando novo produto
  • 43. Cenário: Verificar soma dos produtos Dado que os produtos A e B estão cadastrados Quando eu solicito ver o valor total dos produtos Então eu devo ver o valor total como 150,00 Cenário: Cadastrar produtos Dado que eu estou na página de cadastro de produtos Quando eu cadastro o produto “C” E salvo Então eu devo ver o produto cadastrado
  • 44. Ordem dos testes: Cadastrando novo produto Verificando soma dos produtos
  • 45. Cenário: Cadastrar produtos Dado que eu estou na página de cadastro de produtos Quando eu cadastro o produto “C” E salvo Então eu devo ver o produto cadastrado Cenário: Verificar soma dos produtos Dado que os produtos A e B estão cadastrados Quando eu solicito ver o valor total dos produtos Então eu devo ver o valor total como 150,00
  • 47. Given I have an amazing chocolate (and I love it!)
  • 48. When I eat the chocolate (Uhmm *.*)
  • 49. Then there is no more chocolate :(
  • 51.
  • 52. DRY – Don’t Repeat Yourself (and don’t reinvent the wheel)
  • 55. var lado1 = 10 var lado2 = 10 var lado3 = 10 mathService.isTriangulo(lado1, lado2, lado3).should().beTruth() mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘equilatero’) var lado1 = 3 var lado2 = 4 var lado3 = 5 mathService.isTriangulo(lado1, lado2, lado3).should().beTruth() mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘isóceles’) var lado1 = 4 var lado2 = 4 var lado3 = 5 mathService.isTriangulo(lado1, lado2, lado3).should().beTruth() mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘escaleno’) …
  • 56. var arquivo = File.read(“dados.csv”) arquivo.each do var lado1 = arquivo[‘lado 1’] var lado2 = arquivo[‘lado 2’] var lado3 = arquivo[‘lado 3’] var tipoTriangulo = arquivo[‘tipo esperado’] mathService.isTriangulo(lado1, lado2, lado3).should().beTruth() var tipoRetornado = mathService.tipoTriangulo(lado1, lado2, lado3) tipoRetornado.should().be(tipoTriangulo) end
  • 59. FactoryGirl.define do factory :candidate do name 'Candidato Fulano de Tal' short_name 'Fulano Legal' role 'Vereador' end factory :candidate_without_role, :parent => :candidate do after(:build) do |candidate| candidate.role = nil end end https://github.com/thoughtworks/voto-como-vamos
  • 61.
  • 62. require 'watir-webdriver' browser = Watir::Browser.new :firefox browser.goto "http://google.com.br" browser.text_field(:name => 'q').set('Automação Rocks!') browser.button(:name => 'btnG').click sleep 1 if browser.text.include? 'The Bug Bang Theory 2.0' puts 'Sucess' else puts 'fail' end browser.close http://www.bugbang.com.br/?p=2108
  • 63. Mais vinte testes por favor 
  • 64. require 'watir-webdriver' browser = Watir::Browser.new :firefox browser.goto "http://google.com.br" browser.text_field(:name => 'q').set('Automação Rocks!') browser.button(:name => 'btnG').click if browser.text.include? 'The Bug Bang Theory 2.0' puts 'Sucess' else puts 'fail' end browser.close browser = Watir::Browser.new :firefox browser.goto "http://google.com.br" browser.text_field(:name => 'q').set('Selenium history') browser.button(:name => 'btnG').click if browser.text.include? 'ThoughtWorks' puts 'Sucess' else puts 'fail' end browser.close browser = Watir::Browser.new :firefox browser.goto "http://google.com.br" browser.text_field(:name => 'q').set('Desafio Selenium') browser.button(:name => 'btnG').click if browser.text.include? 'sembugs.blogspot.com.br' puts 'Sucess' else puts 'fail' end browser.close http://www.bugbang.com.br/?p=2108
  • 65.
  • 67. Test Flow Page 1 Page 2 ………… Page N
  • 68. module Search class HomePage @url = “www.google.com” @search_field = “q” @search_button = “search” def input_search(value) @browser.text_field(:name => @search_field).set value end def run_search @browser.button(:class => @search_button).click return ResultPage.new end def visit @browser end end http://www.bugbang.com.br/?p=2108
  • 69. module Search class HomePage Elementos da página como atributos @url = “www.google.com” @search_field = “q” @search_button = “search” def input_search(value) @browser.text_field(:name => @search_field).set value end def run_search @browser.button(:class => @search_button).click return ResultPage.new end def visit @browser end end http://www.bugbang.com.br/?p=2108
  • 70. module Search class HomePage @url = “www.google.com” @search_field = “q” @search_button = “search” def input_search(value) @browser.text_field(:name => @search_field).set value end def run_search @browser.button(:class => @search_button).click return ResultPage.new end Comportamentos como contrato def visit @browser end end http://www.bugbang.com.br/?p=2108
  • 71. @page = Search.HomePage.new @page.visit @page.input_search(“xjunior.me”) @resultPage = @page.search @first = @resultPage.results.first @first.title.should eq(“Carlos Palhares”) http://www.bugbang.com.br/?p=2108
  • 72.
  • 74. Resumindo… * Codigo de teste também é código; - (quase) todas as boas práticas se aplicam * Don’t Repeat yourself! * Código de teste deve ser uma represetação automática da interação do usuário - Seu sistema pode não dar feedback suficiente
  • 76. We are hiring! http://join.thoughtworks.com/
  • 77. Muito Obrigado!!! Envie o seu Feedback e dúvidas para: cribeiro@thoughtworks.com cpalhares@thoughtworks.com Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.

Notas do Editor

  1. Camilo: Explica ThoughtWorks e seus projetos Carlos: Por que um Dev nessa talk?
  2. Camilo: - Processos tradicionais => Final do processo - Processos ágeis => a cada build => teste manual tomaria demasiado tempo (muito custo) => custo de documentar os testes - Teste manual => muita falha humana - Teste auto => menos falha humana Carlos - MOTO: AUTOMATE EVERYTHING - perder menos tempo (nenhum?) com tarefas repetitivas – não queremos as máquinas rindo da gente a noite
  3. Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
  4. Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
  5. Camilo
  6. Camilo
  7. Camilo
  8. Carlos - Código gerado pelo Selenium, deve ser bom, certo?
  9. Carlos
  10. Carlos
  11. Camilo
  12. Carlos: – sleep burro - Segurar nosso super performático teste
  13. Carlos: Teste manual
  14. Carlos
  15. Carlos
  16. Carlos: Reproduzir no código Rodou -> Passou -> Commit
  17. Carlos: CI => FAIL
  18. Camilo: Falhou por que? O Que o selenium faz?
  19. Camilo: O Que o selenium faz?
  20. Camilo: O Teste está mais rápido que a página? Carlos: Já sei, diminuir a velocidade do teste
  21. Carlos
  22. Carlos e Camilo
  23. Camilo: Red/Green tests
  24. Carlos: Adiciona mais tempo e soluciona para “ sempre ” Mesmo se sempre passar, vai ser lento
  25. Camilo: Não use o bare steep
  26. Camilo: Solução
  27. Camilo: Ação assíncrona Feedback da página Mais ação Carlos: O teste é o usuário, ambos precisam de feedback
  28. Camilo: Uma outra solução
  29. Camilo: Agora você está protegido
  30. Carlos
  31. Carlos: Explica Martin Fowler
  32. Carlos:
  33. Carlos:
  34. Carlos:
  35. Carlos:
  36. Carlos: Órdem importa Execução isolada passa
  37. Camilo
  38. Camilo
  39. Camilo
  40. Camilo
  41. Camilo
  42. Camilo
  43. Camilo: Given when then são os passos Não estamos falando de BDD
  44. Carlos: Prepara os dados do teste Nenhuma ação
  45. Carlos: Executa as ações Muda o estado
  46. Carlos: Verifica os resultados
  47. Carlos: Limpe sua bagunça Garante o isolamento Pode ser feito antes de cada teste (garantindo uma base sadia) Final de cada teste (mesmo se falhar) limpando a bagunça
  48. Carlos: - Um pouco mais perto de Fail Proof
  49. Camilo
  50. Camilo
  51. Camilo
  52. Camilo
  53. Camilo
  54. Carlos: - O mesmo padrão pode ser usado nos testes
  55. Carlos: Pra quem não conhece, essa é uma fábrica ….
  56. Camilo: Esse é o Voto Como Vamos uando um factory
  57. Carlos: O código de teste tem que ser bem feito Separação em camadas
  58. Camilo
  59. Camilo
  60. Camilo
  61. Camilo
  62. Carlos: que grande merda
  63. Carlos: - Page Object abstraction
  64. Carlos
  65. Carlos
  66. Carlos
  67. Carlos
  68. Carlos
  69. Camilo: Mais perto de fail proof
  70. Camilo: Livros legais
  71. Conversa entre os dois