O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

Programação Orientada a Testes

3.907 visualizações

Publicada em

Programação Orientada a Testes na prática, apresentando experiência de TDD em ambiente corporativo de empresa pública

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Programação Orientada a Testes

  1. 1. Programação Orientada a Testes Experiências num ambiente corporativo Gregório Enrico Linhares de Melo @gregoriomelo
  2. 2. O que é POT (TDD)?
  3. 3. O que é POT (TDD)? Seria mais uma PO*?
  4. 4. O que é POT (TDD)? Seria mais uma PO*? Seria mais uma teoria com pouca prática?
  5. 5. O que é POT (TDD)? Seria mais uma PO*? Seria mais uma teoria com pouca prática? Alguém usa?
  6. 6. O que é POT (TDD)? Seria mais uma PO*? Seria mais uma teoria com pouca prática? Alguém usa? Minha vida vai melhorar?
  7. 7. Situação atual
  8. 8. Situação atual
  9. 9. Situação atual
  10. 10. Situação atual
  11. 11. Situação atual
  12. 12. Situação atual Quem nunca virou a noite programando?
  13. 13. Situação atual Quem nunca virou a noite programando? Quem nunca mudou o código antes de apresentar?
  14. 14. Situação atual Quem nunca virou a noite programando? Quem nunca mudou o código antes de apresentar? Quem nunca ficou com medo nessa hora?
  15. 15. Situação atual Quem nunca virou a noite programando? Quem nunca mudou o código antes de apresentar? Quem nunca ficou com medo nessa hora?
  16. 16. Caos
  17. 17. Caos Programação por coincidência
  18. 18. Caos Programação por coincidência Frameworks antes de funcionalidades
  19. 19. Caos Programação por coincidência Frameworks antes de funcionalidades Analysis Paralysis
  20. 20. Caos Programação por coincidência Frameworks antes de funcionalidades Analysis Paralysis Manutenção difícil
  21. 21. Sonho
  22. 22. Sonho Fim das coincidências
  23. 23. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente
  24. 24. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente Fim do medo
  25. 25. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente Fim do medo Não usar o debug :)
  26. 26. Sonho Fim das coincidências Apresentar funcionalidades mais rapidamente Fim do medo Não usar o debug :) Dormir em paz antes da apresentação :))))))))))
  27. 27. De onde vem o TDD?
  28. 28. De onde vem o TDD? @KentBeck
  29. 29. De onde vem o TDD? @KentBeck
  30. 30. TDD significa:
  31. 31. TDD significa: Código autoexplicativo
  32. 32. // if the guess is correct if ([guess isEqualToString:[correctAnswer convertToDisplayName]]) { // make the text color a medium green answerLabel.textColor = [UIColor colorWithRed:0.0 green:0.7 blue:0.0 alpha:1.0]; TDD significa: answerLabel.text = @"Correct!"; // set the text in the label // get the correct answer from the correct file name NSString *correct = [correctAnswer convertToDisplayName]; Código autoexplicativo // loop through each bar for (UISegmentedControl *bar in bars) { bar.enabled = NO; // don't let the user choose another answer // loop through the bar segments for (int i = 0; i < 3; i++) { // get the segment's title NSString *title = [bar titleForSegmentAtIndex:i]; // if this segment does not have the correct choice // disable segment if (![title isEqualToString:correct]) [bar setEnabled:NO forSegmentAtIndex:i]; } // end for } // end for ++numCorrect; . . .
  33. 33. TDD significa: Código autoexplicativo Código reutilizável
  34. 34. TDD significa: Código autoexplicativo Código reutilizável Saber o que se faz e quando está pronto
  35. 35. TDD significa: Código autoexplicativo Código reutilizável Saber o que se faz e quando está pronto Facilidade na integração (colaboração)
  36. 36. TDD significa: Segurança no desenvolvimento
  37. 37. TDD significa: Segurança no desenvolvimento Mitigação de bugs
  38. 38. if (countAttr != null && countAttr.length() > 0) { TDD significa: Object countObj = findValue(countAttr); if (countObj instanceof Integer) { Segurança no desenvolvimento count = ((Integer)countObj).intValue(); } else if (countObj instanceof Float) { Mitigação de bugs count = ((Float)countObj).intValue(); } else if (countObj instanceof Long) { count = ((Long)countObj).intValue(); } else if (countObj instanceof Double) { count = ((Long)countObj).intValue(); } }
  39. 39. if (countAttr != null && countAttr.length() > 0) { TDD significa: Object countObj = findValue(countAttr); if (countObj instanceof Integer) { Segurança no desenvolvimento count = ((Integer)countObj).intValue(); } else if (countObj instanceof Float) { Mitigação de bugs count = ((Float)countObj).intValue(); } else if (countObj instanceof Long) { count = ((Long)countObj).intValue(); } else if (countObj instanceof Double) { count = ((Long)countObj).intValue(); } }
  40. 40. TDD significa: Segurança no desenvolvimento Mitigação de bugs Arquitetura flexível
  41. 41. TDD significa: Segurança no desenvolvimento Mitigação de bugs Arquitetura flexível
  42. 42. Mitos
  43. 43. Mitos Só funciona para equipes pequenas
  44. 44. Mitos Só funciona para equipes pequenas Só funciona para projetos pequenos
  45. 45. Mitos Só funciona para equipes pequenas Só funciona para projetos pequenos “Não temos tempo para criar testes”
  46. 46. Caso de sucesso
  47. 47. Caso de sucesso
  48. 48. Caso de sucesso - WebCNIS
  49. 49. Caso de sucesso - WebCNIS 13 pessoas
  50. 50. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função
  51. 51. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função 2 anos
  52. 52. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função 2 anos Integração com diversos sistemas legados
  53. 53. Caso de sucesso - WebCNIS 13 pessoas 2300 pontos de função 2 anos Integração com diversos sistemas legados Módulo para outros projetos do CNIS
  54. 54. Caso de sucesso - WebCNIS
  55. 55. Caso de sucesso - WebCNIS Documentação compilável
  56. 56. Caso de sucesso - WebCNIS Documentação compilável Código autoexplicativo
  57. 57. Caso de sucesso - WebCNIS Documentação compilável Código autoexplicativo Integração contínua
  58. 58. Caso de sucesso - WebCNIS Documentação compilável Código autoexplicativo Integração contínua Sistema compreensível para novos integrantes
  59. 59. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos
  60. 60. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços
  61. 61. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços PD baseado nas experiências do WebCNIS
  62. 62. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços PD baseado nas experiências do WebCNIS Adoção de TDD por outros projetos
  63. 63. Caso de sucesso - WebCNIS Fácil adaptação às mudanças de requisitos Fácil adaptação às mudanças de serviços PD baseado nas experiências do WebCNIS Adoção de TDD por outros projetos Tempo de manutenção reduzido
  64. 64. Bugs em produção ?
  65. 65. Bugs em produção 2
  66. 66. Mitos?
  67. 67. #ComoFaz?
  68. 68. #ComoFaz?
  69. 69. #ComoFaz?
  70. 70. #ComoFaz? - Metodologia, + Filosofia
  71. 71. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração
  72. 72. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração Ferramentas (xUnit, RSpec...)
  73. 73. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração Ferramentas (xUnit, RSpec...) não bastam
  74. 74. #ComoFaz? - Metodologia, + Filosofia Testes Unitários + Testes de Integração Ferramentas (xUnit, RSpec...) não bastam Nada é tão simples que não mereça ser testado
  75. 75. #ComoFaz? Testes devem ser: Decisivos,Válidos, Completos, Repetíveis, Isolados, Automáticos
  76. 76. describe "failure" do #ComoFaz? before(:each) do @attr = { :name => "", :email => "", :password => "", :password_confirmation => "" } end it "should not create a user" do lambda do post :create, :user => @attr end.should_not change(User, :count) end it "should have the right title" do post :create, :user => @attr response.should have_selector("title", :content => "Sign up") end it "should have the 'new' page" do post :create, :user => @attr response.should render_template('new') end end
  77. 77. describe "success" do before(:each) do @attr = { :name => "New User", :email => "user@example.com", :password => "foobar", :password_confirmation => "foobar" } end #ComoFaz? it "should create a user" do lambda do post :create, :user => @attr end.should change(User, :count).by(1) end it "should redirect to the user show page" do post :create, :user => @attr response.should redirect_to(user_path(assigns(:user))) end it "should have a welcome message" do post :create, :user => @attr flash[:success].should =~ /welcome/i end it "should sign the user in" do post :create, :user => @attr controller.should be_signed_in end end end
  78. 78. #ComoFaz? def create @user = User.new(params[:user]) if @user.save sign_in @user flash[:success] = "Welcome!" redirect_to @user else @title = 'Sign up' @user.password = nil @user.password_confirmation = nil render 'new' end end
  79. 79. #ComoFaz?
  80. 80. #ComoFaz?
  81. 81. #ComoFaz? Pratique!
  82. 82. ?
  83. 83. Obrigado!
  84. 84. Programação Orientada a Testes Experiências num ambiente corporativo Gregório Enrico Linhares de Melo @gregoriomelo

×