Testes automatizados

573 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
573
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Testes automatizados

    1. 1. Testes AutomatizadosUsando Ruby on Rails, RSpec e Cucumber
    2. 2. “Inspecionar para previnir defeitos ébom; Inspecionar para encontrardefeitos é desperdício” Shigeo Shingo
    3. 3. De onde veio?A ascensão das metodologias ágeisDocumentação DesatualizadaA “queima de documentação”
    4. 4. Pra que serve?Auxiliar nas Mudanças ou RefactoringRastreabilidadeDesign
    5. 5. O que é?Caixa-Branca*Normalmente feito pelo próprioDesenvolvedorComparação de resultados
    6. 6. Exemplodescribe Calculadora do it "soma entre 1 e 1 deve ser 2" do (1+1).should eq(2) endend
    7. 7. ModalidadesUnitáriosIntegraçãoAceitaçãooutros
    8. 8. Quando deve ser feito?Antes, durante e depois
    9. 9. TecnologiasRuby on RailsRSpecCapybaraCucumber
    10. 10. RSpecExamplesExpectationsVoltemos ao exemplo
    11. 11. Projeto
    12. 12. Testes UnitáriosUnidade é a menor parte testável deum software.Consigo encontrar o erro com maiseficiência.Como “escapar” da dependência entreas camadas?
    13. 13. Stub MethodsSimula o comportamento de um códigoexistente.Reduz o tempo de execução.Isola o teste.
    14. 14. O Métododef create @sorteio = Sorteio.new(params[:sorteio]) if @sorteio.save redirect_to @sorteio, notice: Sorteio criado. else render action: "new" endend
    15. 15. O Testecontext "se sorteio for salvo com sucesso" do before do Sorteio.any_instance.stub(:save).and_return(true) end it "deve enviar pra tela de sorteios" do post :create, :id => 1 response.should redirect_to sorteios_path endend
    16. 16. Mock ObjectsObjetos “de mentira” ou objetossubstitutos.Permitem isolar as classes de umsistema de forma bastante simples.
    17. 17. O Métododef sortear @sorteio = Sorteio.find(params[:id]) @sorteio.sortear redirect_to sorteio_path(@sorteio_id), notice: Sorteio realizado.end
    18. 18. O Testebefore do @sorteio = mock(Sorteio) @sorteio.stub(:sortear) Sorteio.stub(:find).and_return(@sorteio)endit "deve mostrar mensagem de sorteio realizado" do get :sortear, :id => 1 flash[:notice].should == "Sorteio realizado."end
    19. 19. Message Expectations Cria um Stub Method Cria Expectativas
    20. 20. O Métododef edit @sorteio = Sorteio.find(params[:id])end
    21. 21. O Testeit "popula sorteio com o sorteio enviado" do sorteio = mock(Sorteio) Sorteio.should_receive(:find).with(1) .and_return(sorteio) get :edit, :id => 1 assigns[:sorteio].should == sorteioend
    22. 22. Testando Controllers Redirecionamentos e Parâmetros de Tela. Não deve invocar o model “de verdade”.
    23. 23. context "se concorrente não for salvo" do before do @concorrente_mock.stub(:save).and_return(false) end it "deve enviar pra tela de apresentação do sorteiodeste concorrente" do post :create, :sorteio_id => 1 response.should redirect_to sorteio_path(1) end it "deve enviar uma notificação de Houve um erro nacriação do Concorrente." do post :create, :sorteio_id => 1 flash[:notice].should == "Houve um erro na criaçãodo Concorrente." endend
    24. 24. RotasSorteando::Application.routes.draw do resources :sorteios do member do get :sortear end resources :concorrentes, :only => [:new, :create, :destroy] end root :to => sorteios#indexend
    25. 25. Testando Rotas it "routes to #create" do post("/sorteios/1/concorrentes").shouldroute_to("concorrentes#create", :sorteio_id => "1") end it "routes to #destroy" do delete("/sorteios/1/concorrentes/2").shouldroute_to("concorrentes#destroy", :sorteio_id => "1", :id => "2") end it "routes to #index" do get("/sorteios/1/concorrentes").should_not be_routable end
    26. 26. Testes de ModelsObjetos Reais.Usar somente as propriedadesnecessárias.Validação de Campo Obrigatório.
    27. 27. FactoryTeste mais limpo.Código desnecessário “escondido”.
    28. 28. #sorteio.rbFactoryGirl.define do factory :sorteio do sequence(:nome) { |n| "sorteio_#{n}" } qtd_premios 1 endend#concorrente.rbFactoryGirl.define do factory :concorrente do sequence(:nome) { |n| "nome_#{n}" } sequence(:email) { |n| "nome_#{n}@email.com" } association :sorteio endend
    29. 29. Usando Factory Girlbefore do @sorteio = FactoryGirl.create(:sorteio, :qtd_premios => 2) conc1 = FactoryGirl.create(:concorrente, :sorteio => @sorteio) conc2 = FactoryGirl.create(:concorrente, :sorteio => @sorteio) conc3 = FactoryGirl.create(:concorrente, :sorteio => @sorteio)end
    30. 30. describe "Validations" do it { should validate_presence_of(:nome).with_message(/é umcampo obrigatório/) } it { should validate_presence_of(:qtd_premios).with_message(/éum campo obrigatório/) }endit "sortear com quantidade menor que a quantidade de prêmios" do sorteio = FactoryGirl.create(:sorteio, :qtd_premios => 3) conc1 = FactoryGirl.create(:concorrente, :sorteio => sorteio) conc2 = FactoryGirl.create(:concorrente, :sorteio => sorteio) sorteio.sortear sorteio.vencedores.should have(2).vencedoresend
    31. 31. Testes de ViewsRenderização.Propriedades necessárias.
    32. 32. describe "sorteios/index" do it "mostrar titulo Sorteios" do assign :sorteios, [] render rendered.should have_content("Sorteios") end it "mostrar listagem de sorteios" do assign :sorteios, [ FactoryGirl.build(:sorteio, :id => 1, :nome => mega sena da virada) ] render rendered.should have_selector("tr > td") do |td| td.should have_content(mega sena da virada) end endend
    33. 33. Code CoverageVerificar se cada linha do softwareesta “coberta” por, pelo menos, 1teste.
    34. 34. Usando o Simplecov
    35. 35. Linhas de Código X Linhas de Teste
    36. 36. TDDDesign.Testes são brindes de Luxo.
    37. 37. Teste Falhodescribe "#eh_vencedor?" do sorteio = FactoryGirl.create(:sorteio) concorrente = FactoryGirl.create(:concorrente,:sorteio => sorteio) concorrente.eh_vencedor?.should == trueend
    38. 38. Teste “Passando”def eh_vencedor trueend
    39. 39. Refactoring e teste volta a Falhardef eh_vencedor? VencedorSorteio.where(:concorrente_id => self).exists?end
    40. 40. Teste “Passando” Novamenteit "#eh_vencedor?" do sorteio = FactoryGirl.create(:sorteio) concorrente = FactoryGirl.create(:concorrente, :sorteio => sorteio) concorrente.eh_vencedor?.should == falseend
    41. 41. Refactoringdescribe "#eh_vencedor?" do it "Se não venceu o sorteio, retorna falso" do sorteio = FactoryGirl.create(:sorteio) concorrente = FactoryGirl.create(:concorrente, :sorteio => sorteio) concorrente.eh_vencedor?.should == false end it "Se venceu o sorteio, retorna verdadeiro" do sorteio = FactoryGirl.create(:sorteio) concorrente = FactoryGirl.create(:concorrente, :sorteio => sorteio) sorteio.vencedores << concorrente sorteio.save concorrente.eh_vencedor?.should == true endend
    42. 42. TDD feito... mas caberiam mais iterações
    43. 43. Testes de Integração Camadas interagem. Encontra erros que o teste unitário não encontra. Ineficiente para “apontar” o erro.
    44. 44. Caso: Cadastro de Sorteio
    45. 45. Usando o Capybarait "fluxo completo de cadastro" do visit "/sorteios" click_link(+) fill_in(Nome, :with => Livro de Testes Automatizados) fill_in(Qtd de Premios, :with => 1) click_button(Novo) page.should have_content("Sorteio criado.") page.should have_content("Livro de Testes Automatizados") page.should have_content("Concorrentes: +") end
    46. 46. Testes de AceitaçãoCaixa-PretaPode ser criado por um Não-Programador
    47. 47. Criando StepsDado /^que estou na página "(.*?)"$/ do |pagina| visit paginaendEntão /^devo ver o texto "(.*?)"$/ do |texto| page.should have_content(texto)endQuando /^clicar no link "(.*?)"$/ do |link| click_link(link)endQuando /^clicar no botao "(.*?)"$/ do |botao| click_button(botao)end
    48. 48. Usando o CucumberCenário: Cadastrando um sorteio Dado que estou na página "/sorteios" Quando clicar no link "+" Então devo mudar a pagina Quando preencher o campo "Nome" com "Livro deTestes Automatizados" E preencher o campo "Qtd de Premios" com "1" E clicar no botao "Novo" Então devo mudar a pagina Então devo ver o texto "Sorteio criado." E devo ver o texto "Livro de Testes Automatizados" E devo ver o texto "Concorrentes: +"
    49. 49. Integração ContinuaMembros de um time integram seutrabalho frequentemente.Podem haver multiplas integrações pordia.Cada integração é verificada por umbuild automatizado.
    50. 50. Servidores de CIJenkins(Hudson)Cruise ControlTravis
    51. 51. Usando o Travis
    52. 52. Considerações Finais
    53. 53. Perguntas???

    ×