• Save
Boas práticas de Automação de Testes
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Boas práticas de Automação de Testes

  • 4,290 views
Uploaded on

Apresentação realizada no Agile Brazil 2012 por Camilo Ribeiro e Carlos Palhares

Apresentação realizada no Agile Brazil 2012 por Camilo Ribeiro e Carlos Palhares

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
4,290
On Slideshare
2,500
From Embeds
1,790
Number of Embeds
6

Actions

Shares
Downloads
1
Comments
0
Likes
6

Embeds 1,790

http://www.bugbang.com.br 1,772
http://testingflavors.com 7
http://coderwall.com 4
http://translate.googleusercontent.com 4
http://webcache.googleusercontent.com 2
http://bugbang.com.br 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • Camilo: Explica ThoughtWorks e seus projetos Carlos: Por que um Dev nessa talk?
  • 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
  • Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
  • Carlos: Boas práticas existem. Não são a solução para todos os problemas, não é pecado não usá-las.
  • Camilo
  • Camilo
  • Camilo
  • Carlos - Código gerado pelo Selenium, deve ser bom, certo?
  • Carlos
  • Carlos
  • Camilo
  • Carlos: – sleep burro - Segurar nosso super performático teste
  • Carlos: Teste manual
  • Carlos
  • Carlos
  • Carlos: Reproduzir no código Rodou -> Passou -> Commit
  • Carlos: CI => FAIL
  • Camilo: Falhou por que? O Que o selenium faz?
  • Camilo: O Que o selenium faz?
  • Camilo: O Teste está mais rápido que a página? Carlos: Já sei, diminuir a velocidade do teste
  • Carlos
  • Carlos e Camilo
  • Camilo: Red/Green tests
  • Carlos: Adiciona mais tempo e soluciona para “ sempre ” Mesmo se sempre passar, vai ser lento
  • Camilo: Não use o bare steep
  • Camilo: Solução
  • Camilo: Ação assíncrona Feedback da página Mais ação Carlos: O teste é o usuário, ambos precisam de feedback
  • Camilo: Uma outra solução
  • Camilo: Agora você está protegido
  • Carlos
  • Carlos: Explica Martin Fowler
  • Carlos:
  • Carlos:
  • Carlos:
  • Carlos:
  • Carlos: Órdem importa Execução isolada passa
  • Camilo
  • Camilo
  • Camilo
  • Camilo
  • Camilo
  • Camilo
  • Camilo: Given when then são os passos Não estamos falando de BDD
  • Carlos: Prepara os dados do teste Nenhuma ação
  • Carlos: Executa as ações Muda o estado
  • Carlos: Verifica os resultados
  • 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
  • Carlos: - Um pouco mais perto de Fail Proof
  • Camilo
  • Camilo
  • Camilo
  • Camilo
  • Camilo
  • Carlos: - O mesmo padrão pode ser usado nos testes
  • Carlos: Pra quem não conhece, essa é uma fábrica ….
  • Camilo: Esse é o Voto Como Vamos uando um factory
  • Carlos: O código de teste tem que ser bem feito Separação em camadas
  • Camilo
  • Camilo
  • Camilo
  • Camilo
  • Carlos: que grande merda
  • Carlos: - Page Object abstraction
  • Carlos
  • Carlos
  • Carlos
  • Carlos
  • Carlos
  • Camilo: Mais perto de fail proof
  • Camilo: Livros legais
  • Conversa entre os dois

Transcript

  • 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-ribeiroPrivate 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/xjuniorPrivate and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
  • 4. ~ 2.000Twers 25 escritórios 11 países 1 culturahttp://social-impact.thoughtworks.com/Private and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.
  • 5. Por que automatizar?
  • 6. Record and Replay
  • 7. require watir-webdriverbrowser = Watir::Browser.new :firefoxbrowser.goto "http://google.com.br"browser.text_field(:name => q).set(Automação Rocks!)browser.button(:name => btnG).clicksleep 1if browser.text.include? The Bug Bang Theory 2.0puts Sucesselse puts failendbrowser.close
  • 8. require watir-webdriverbrowser = Watir::Browser.new :firefoxbrowser.goto "http://google.com.br"browser.text_field(:name => q).set(Automação Rocks!)browser.button(:name => btnG).clicksleep 1if browser.text.include? The Bug Bang Theory 2.0puts Sucesselse puts failendbrowser.close
  • 9. Record and Replay
  • 10. Bare Sleep
  • 11. //pseudo-codeclick_login_button();fill_user(“Mario”);
  • 12. //pseudo-codeclick_login_button();fill_user(“Mario”);Erro: Campo “user” não encontrado
  • 13. //pseudo-codeclick_login_button();sleep(3000)fill_user(“Mario”);
  • 14. Testes LentosTestes Irreais
  • 15. Bare Sleep
  • 16. Keep Pooling / Implicit Wait Time
  • 17. //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
  • 18. require selenium-webdriverdriver = Selenium::WebDriver.for :firefoxdriver.manage.timeouts.implicit_wait = TIMEOUTclick_login_buttonelement = driver.find_element(:id => ”user")http://seleniumhq.org/docs/04_webdriver_advanced.html
  • 19. Lack of Isolation
  • 20. 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
  • 21. Ordem dos testes: Verificando soma dos produtos Cadastrando novo produto
  • 22. Produtos Verificando soma dos produtos A soma dos produtos deve ser 150 Cadastrando novo produto Devo cadastrar o produto C
  • 23. Ordem dos testes: Cadastrando novo produto Verificando soma dos produtos
  • 24. Produtos Cadastrando novo produto Devo cadastrar o produto C Verificando soma dos produtos A soma dos produtos deve ser 150ExpectationNotMetError: expected: 4Experado = 150,00Resultado = 350,00
  • 25. Testes isolados
  • 26. 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 cadastradoCená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
  • 27. Ordem dos testes: Verificando soma dos produtos Cadastrando novo produto
  • 28. 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,00Cená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
  • 29. Ordem dos testes: Cadastrando novo produto Verificando soma dos produtos
  • 30. 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 cadastradoCená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
  • 31. Given When Then
  • 32. Given I have an amazing chocolate (and I love it!)
  • 33. When I eat the chocolate (Uhmm *.*)
  • 34. Then there is no more chocolate :(
  • 35. Clean up your mess
  • 36. DRY – Don’t Repeat Yourself(and don’t reinvent the wheel)
  • 37. Data-Driven Testing
  • 38. http://xunitpatterns.com/Data-Driven%20Test.html
  • 39. var lado1 = 10var lado2 = 10var lado3 = 10mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘equilatero’)var lado1 = 3var lado2 = 4var lado3 = 5mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘isóceles’)var lado1 = 4var lado2 = 4var lado3 = 5mathService.isTriangulo(lado1, lado2, lado3).should().beTruth()mathService.tipoTriangulo(lado1, lado2, lado3).should().be(‘escaleno’)…
  • 40. 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
  • 41. Factory Pattern
  • 42. http://blog.fossmo.net/post/What-is-the-factory-method-pattern.aspx
  • 43. FactoryGirl.define do factory :candidate do name Candidato Fulano de Tal short_name Fulano Legal role Vereadorend factory :candidate_without_role, :parent => :candidate do after(:build) do |candidate| candidate.role = nil end endhttps://github.com/thoughtworks/voto-como-vamos
  • 44. Separation Of Concerns
  • 45. 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.closehttp://www.bugbang.com.br/?p=2108
  • 46. Mais vinte testes por favor 
  • 47. 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.closehttp://www.bugbang.com.br/?p=2108
  • 48. Page-Object Model
  • 49. Test FlowPage 1 Page 2 ………… Page N
  • 50. 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 endendhttp://www.bugbang.com.br/?p=2108
  • 51. 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 endendhttp://www.bugbang.com.br/?p=2108
  • 52. 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 endendhttp://www.bugbang.com.br/?p=2108
  • 53. @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
  • 54. Lendo e aprendendo 
  • 55. 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çãoautomática da interação do usuário - Seu sistema pode não dar feedback suficiente
  • 56. Dúvidas?
  • 57. We are hiring! http://join.thoughtworks.com/
  • 58. Muito Obrigado!!! Envie o seu Feedback e dúvidas para: cribeiro@thoughtworks.com cpalhares@thoughtworks.comPrivate and Confidential. © 2011 ThoughtWorks, Ltd. All rights reserved.