TDD para "meros mortais"

  • Published on
    11-Jun-2015

  • View
    389

  • Download
    2

Embed Size (px)

DESCRIPTION

Nessa palestra relato minha experincia no como um desenvolvedor de software altamente sinistro com duzentos anos de experincia e mil livros publicados - mas sim como um "mero mortal", um desenvolvedor "de verdade", do "mundo real" aplicando a teoria que aprendeu do TDD.

Transcript

  • 1. TDD para meros mortais Porque a vida real mais que Fibonacci!

2. Quem sou eu? Thiago Baptista Desenvolvedor h uns 3 anos (principalmente Java) Entusiasta do Software Livre e do Movimento gil Tarado por Computao e estudar novas tecnologias... 3. Quem sou eu? ...UM MERO MORTAL!!! No sei nem 40% do que ACHO que sei No sei nem 30% do que eu DEVERIA saber Vivo no mundo real 4. Como assim, mundo real? Agilidade (ainda) desconhecida Empresas so fbricas de software Relao cliente-empresa conituosa Prazos estouram, retrabalho, cdigo macarrnico etc. Maioria dos projetos manuteno de cdigo legado 5. Desenvolvedores do mundo real No tm larga experincia Se concentram em uma tecnologia Foram educados em uma metodologia de trabalho Na faculdade vivem um mundo totalmente distante do mercado de trabalho (Swing?? Dicionrio de dados??? UML novidade?!?) 6. O trabalho do desenvolvedor na vida real Empresas que h muitos anos trabalham da mesma forma Gerentes e chefes que desconhecem o ofcio Ou, quando conhecem, esto MUITO desatualizados Num constante clima de correria e prazos estourados Sem tempo ou recursos para se atualizar Sem incentivo para se atualizar 7. Dialtica do desenvolvimento de software Tese: de um lado, essa vida real Anttese: do outro, novas e muito melhores tcnicas, metodologias e tecnologias Sntese: ??? 8. Desenvolvedor gil hoje: meu caso Li e estudei bastante sobre isso Vi na prtica acontecer e dar certo Defendo e procuro aplicar isso Porm... 9. Desenvolvedor gil hoje: meu caso ...SOU UM MERO MORTAL!!! Conheo bem a teoria, mas tenho pouca experincia prtica Portanto, sei muito menos do que eu ACHO que sei Tive pouqussimas oportunidades de colocar em prtica 10. TDD para meros mortais Estudo de caso: um mero mortal aplicando a teoria do TDD na prtica! 11. Revisando a teoria... 12. Desenvolvimento (ou design) guiado por testes Escreve-se um teste primeiro, e s depois o cdigo real Cdigo real sempre fruto de se fazer um teste escrito previamente passar Test-Driven Development/Design 13. TDD em essncia Segundo Kent Beck, autor da tcinca: Escreva um teste automatizado que falhe antes de escrever qualquer outro cdigo Escreva um cdigo para fazer esse teste passar Remova a duplicao 14. TDD em essncia Segundo Kent Beck, autor da tcinca: Escreva um teste automatizado que falhe antes de escrever qualquer outro cdigo [VERMELHO] Escreva um cdigo para fazer esse teste passar [VERDE] Remova a duplicao [REFATORAR] ...repetir o processo... 15. Conceitos importantes S pode haver cdigo real se houver antes um teste que falhe Deve-se avanar com passinhos de beb (baby steps) S se adiciona um novo teste que falhe aps todos os outros testes estarem verdes 16. Baby steps Faz-se o mnimo necessrio para o teste car verde Aps o verde, refatora-se para eliminar a redundncia Cria-se um novo teste para quebrar novamente Faz-se o mnimo necessrio para ambos os testes passarem Refatora-se de novo Repete-se o processo at ter cdigo real funcionando de verdade 17. Clssico exemplo: multiplicar por 2 Funcionalidade: um mtodo que receba um inteiro como argumento e retorne o produto deste por 2 Exemplos: multiplicar(5) == 10 multiplicar(13) == 26 multiplicar(0) == 0 18. Clssico exemplo: multiplicar por 2 Primeiro passo: um teste que falha 19. Clssico exemplo: multiplicar por 2 Segundo passo: implementar o mnimo absoluto pro teste passar 20. Clssico exemplo: multiplicar por 2 Terceiro passo: novo teste que falha e quebra o cdigo 21. Clssico exemplo: multiplicar por 2 Quarto passo: implementar, novamente, o mnimo para os dois testes passarem 22. Clssico exemplo: multiplicar por 2 Quinto passo: refatorar para eliminar a redundncia 23. Clssico exemplo: multiplicar por 2 Ensimo passo: repetir at ter a segurana para implementar o cdigo de verdade, de produo 24. Concluses e benefcios TDD como a rede de proteo dos malabaristas no circo De quebra, ainda te d uma cobertura de testes Garante que o cdigo faa o mnimo necessrio Manter esse cdigo: mel na chupeta! s continuar com o processo do TDD de onde parou Garante a aprendizagem do cdigo 25. Aprendizagem do cdigo?? 26. Desenvolvimento de software NO MANUFATURA!!! 27. Na manufatura... Voc sabe de antemo o resultado que quer (voc tem o molde) O processo de construo determinstico Para cada resultado esperado, um processo determinado f(x) = y O processo de construo conhecido previamente O processo de construo pode ser replicado 28. ...agora, digamos, na arte... 29. Desenvolver software traduzir CONHECIMENTOS DE NEGCIO para ALGORTMOS COMPUTACIONAIS 30. Como?? 31. VOC NO SABE!!!! 32. Voc no sabe: Sobre o negcio, to bem quanto o cliente Sobre a real necessidade de um requisito na hora H Se o cliente sabe o que quer ou se voc o entendeu direito Se no futuro os requisitos mudaro Se voc est traduzindo o conhecimento direito Se voc sabe desenvolver software 33. Lio nmero 1 TDD sobre o aprendizado do cdigo 34. Aprendizado?? Mas eu sei multiplicar um nmero por 2... 35. TDD na vida real Multiplicar por 2, Fibonacci, Fatorial etc. so exemplos conceituais A vida real muito mais complexa CRUDs que lidam com persistncia Aplicaes web que lidam com a camada HTTP Threads, computao assncrona etc. 36. Estudo de caso: cliente para o WebPagetest 37. Estudo de caso: cliente para o WebPagetest http://www.webpagetest.org Aplicao web para testar desempenho de sites Fornece uma API REST, mediante inscrio (gratuita) https://sites.google.com/a/webpagetest.org/docs/advanced- features/webpagetest-restful-apis Gera relatrios na web, via XML ou JSON 38. O desao: Cliente de linha de comando (shell) para o WebPagetest Para rodar de tempos em tempos (cron) Deve iniciar um teste para um site especco Deve aguardar o teste terminar e saber quando isso acontecer Deve obter o relatrio do teste e exibir os dados conforme requerido 39. Os obstculos: API com nmero reduzido de chamadas permitidas S 200 testes num perodo de 24hs Ter que usar a camada HTTP Trabalhar com XMLs (API JSON muito limitada na poca) Trabalhar com a linha de comando Para chamar a aplicao e iniciar o teste Para exibir os resultados do teste Salvar resultados no sistema de arquivos (em logs) 40. As ferramentas: Plataforma Java Groovy API HTTP nativa API de XML nativa API de testes nativa API nativa para trabalhar com a linha de comando (Groovy CLI) TDD 41. Como fazer isso?? 42. TDD me ensinou! 43. T, mas... por onde comear?? 44. Aplicando o TDD Minha principal dvida: por onde comear um projeto da vida real Qual classe? Qual caso de uso ou histria do usurio? Qual mtodo? Qual funcionalidade? Se uso um framework, devo comear o testando tambm? Maior defeito do ensino do TDD - onde se comea 45. E por falar em comeos... 46. Testes tradicionais e TDD Teste, tradicionalmente, faz parte da linguagem do controle de qualidade (Quality Assurance - QA) Testa-se para saber se algo que j existe se conforma a padres esperados de comportamento e qualidade Todo um mundo de metodologias, tcnicas, certicaes etc. Todo um linguajar prprio: Teste de unidade, de integrao, de regresso, de aceitao Teste caixa-preta, caixa-branca, caixa-cinza etc. 47. Testes tradicionais e TDD O prossional de QA planeja a execuo dos testes conforme os requisitos, testa e, ento, gera seus artefatos 48. TDD no sobre QA! 49. QA muito importante, mas no disso que estamos falando... 50. TDD e tipos de teste O linguajar sobre testes, em TDD, quer dizer coisas diferentes do que quer dizer em QA Teste de unidade geralmente se refere testar classes Teste de integrao/aceitao geralmente se refere a testar funcionalidades 51. Ento, por que o T? Na verdade, o teste representa uma expectativa, um propsito que o cdigo deve atender O propsito desse mtodo multiplicar a entarda por 2 O propsito dessa classe se conectar a um SGBD O propsito desse mdulo ser um adaptador de uma API externa para nossa Etc. 52. Sendo assim, realmente um T? Um propsito o reexo de uma necessidade que o cdigo deve atender Fazemos escolhas de projeto (design) do cdigo para atender essa necessidade um teste na medida em que garante que o projeto do nosso cdigo atenda a essa necessidade 53. Portanto, no sobre teste... 54. ... sobre projeto! 55. Lio nmero 2 TDD sobre o projeto, sobre o design do cdigo 56. Estamos destacando a palavra errada... 57. TEST Driven Design 58. Test Driven DESIGN 59. Sobre por onde comear Segundo a teoria: de cima para baixo Do ponto de vista do usurio Com um teste de aceitao que representa uma funcionalidade Teste que s passaria com a integrao de todo o sistema Ou seja: do HTML JPA, passando pelo modelo 60. Mas e se no der pra ser assim? 61. Comee de onde der pra comear!!! 62. Lio nmero 3 Quando em dvida, comee o TDD de onde voc se sentir mais confortvel 63. Comeando pelo mais confortvel Pelo elemento mais bsico do cdigo que resolva o problema em questo A classe mais bvia O mtodo mais fcil de se fazer O mdulo com menos dependncias 64. Exemplo prtico: cliente WebPagetest O comeo mais bvio de qualquer cdigo... ele existir! Deve haver um objeto que represente o sistema que queremos construir - o WPTClient 65. Exemplo prtico: cliente WebPagetest Prximo passo: deve fazer o bvio! Nosso objeto deve ser capaz de executar sua funcionalidade mais bsica. 66. Opa! Redundncia no cdigo do teste!! 67. O segundo teste claramente cobre o propsito do primeiro - garantir que exista um objeto WPTClient. Portanto... 68. ...elimina-se a redundncia! 69. Opa! O cdigo do teste tambm evoluiu! 70. Lio nmero 4 O cdigo do teste tambm cdigo e, portanto, tambm evolui 71. Teste tambm cdigo! O cdigo do teste tambm progride conforme o aprendizado do cdigo progride cdigo, portanto: ateno s boas prticas! Cdigo limpo Eliminar bad smells OO de verdade 72. WPTC