© 2012,CasadoCódigo TodososdireitosreservadoseprotegidospelaLeinº9.610,de10/02/1998. Nenhuma parte deste livro poderá ser reproduzida, nem transmitida, sem auto- rização prévia por escrito da editora, sejam quais forem os meios: fotográficos, eletrônicos,mecânicos,gravaçãoouquaisqueroutros. CasadoCódigo Livrosparaoprogramador RuaVergueiro,3185-8ºandar 04101-300–VilaMariana–SãoPaulo–SP–Brasil Agradecimentos Essatalvezsejaaseçãomaisdifícildeseescrever,poisaquantidadedepessoasque participaramdiretaouindiretamentedolivroémuitogrande. Vou começar agradecimento meu pai, mãe e irmão, que a todo momento me apoiaram na decisão de fazer um mestrado, entender como ciência deve ser feita, e que sofreram junto comigo nos momentos de grande stress (que todo mestrado proporciona!). Agradeçotambémaomeuorientadordemestradoedoutorado,prof.Dr.Marco Aurelio Gerosa, que me ensinou como as coisas funcionam “do lado de lá”. Sem ele,achoqueesselivroseriamuitodiferente;seriamaisapaixonado,porémmenos verdadeiro.SemeutextoolhaTDDdemaneirafriaeimparcial,aculpaédele. Os srs. Paulo Silveira e Adriano Almeida também merecem uma lembrança. MesmonaépocaemqueaCasadoCódigonãoexistiadefato,elesjáhaviamaceitado aideiadolivrodeTDD.Obrigadopelaconfiança. Todasaspessoasdasúltimasempresasemqueatueitambémmeajudarammuito comasincontáveisconversasdecorredorsobreoassunto.Issocomcertezaenrique- ceumuitootexto. AgradeçotambémaosamigosJoséDonizetti,GuilhermeMoreiraeRafaelFer- reira,quegastaramtempolendoolivroemedandosugestõesdecomomelhorar. Porfim,obrigadoavocêqueestálendoesselivro.Esperoqueeleajude. Quem sou eu? MeunomeéMauricioAniche,etrabalhocomdesenvolvimentodesoftwarehápor voltade10anos. Emboapartedesses10anos,atueicomoconsultorparadiferentes empresas do mercado brasileiro e internacional. Com certeza, as linguagens mais utilizadaspormimaolongodaminhacarreiraforamJava,C#eC. Como sempre pulei de projeto em projeto (e, por consequência, de tecnologia emtecnologia),nuncafuiafundoemnenhumdelas. Pelocontrário,semprefoquei ementenderprincípiosquepudessemser levadosdeumaparaoutra, paraqueno fim,ocódigosaíssecomqualidade,independentedatecnologia. Em meu último ano da graduação, 2007, comecei a ler mais sobre a ideia de testes automatizados e TDD. Achei muito interessante e útil a ideia de se escrever um programa para testar seu programa, e decidi praticar TDD, por conta própria, paraentendermelhorcomoelafuncionava. Gosteimuitodoquevi.De2007emdiante,resolvipraticar,pesquisaredivulgar melhor minhas ideias sobre o assunto. Comecei devagar, apenas blogando o que estavanaminhacabeçaequegostariadefeedbackdeoutrosdesenvolvedores. Mas parafazerissodemaneiramaisdecente,resolviingressarnoprogramadeMestrado daUniversidadedeSãoPaulo. Lá,pesquiseisobreosefeitosdapráticadeTDDno designdeclasses. Ao longo desse tempo participei da grande maioria dos eventos relacionados ao assunto. Palestrei nos principais eventos de métodos ágeis do país (como Agile Brazil,EncontroÁgil),dedesenvolvimentodesoftware(QCONSPeDNAD),entre outrosmenores.Chegueiaparticipardeeventosinternacionaistambém;fuioúnico palestrantebrasileironoPrimeiroWorkshopInternacionalsobreTDD,em2010,na cidadedeParis.Issomostratambémquetenhoparticipadodoseventosacadêmicos. Em2011,apresenteiumestudosobreTDDnoWBMA(WorkshopBrasileirodeMé- todosÁgeis),eem2012,nomaiorsimpósiobrasileirosobreengenhariadesoftware, oSBES. Atualmente trabalho pela Caelum, como consultor e instrutor. Também sou alunodedoutoradopelaUniversidadedeSãoPaulo,ondecontinuoapesquisarsobre arelaçãodostestesdeunidadeequalidadedocódigo. CasadoCódigo Portanto,esseémeurelacionamentocomTDD.Nosúltimosanostenhoolhado eledetodosospontosdevistapossíveis:depraticante,deacadêmico,depesquisador, deapaixonado,defrio.Esselivroéorelatodetudoqueaprendinessesúltimosanos. iv Prefácio TDDéumadaspráticasdedesenvolvimentodesoftwaresugeridaspordiversasme- todologias ágeis, como XP. A ideia é fazer com que o desenvolvedor escreva testes automatizados de maneira constante ao longo do desenvolvimento. Mas, diferen- tementedoqueestamosacostumados, TDDsugerequeodesenvolvedorescrevao testeantesmesmodaimplementação. Essasimplesinversãonociclotrazdiversosbenefíciosparaoprojeto.Bateriasde testestendemasermaiores,cobrindomaiscasos,egarantindoumamaiorqualidade externa. Alémdisso, escrevertestesdeunidadeforcaráodesenvolvedoraescrever umcódigodemaiorqualidadepois,comoveremosaolongodolivro,paraescrever bonstestesdeunidade,odesenvolvedoréobrigadoafazerbomusodeorientaçãoa objetos. Apráticanosajudaaescreverumsoftwaremelhor, commaisqualidade, eum códigomelhor, maisfácildesermantidoeevoluído. Essesdoispontossãoimpor- tantíssimosemqualquersoftware,eTDDnosajudaaalcançá-los. Todapráticaque ajudaaaumentaraqualidadedosoftwareproduzidodeveserestudada. Neste livro, tentei colocar toda a experiência e tudo que aprendi ao longo des- sesúltimosanospraticandoepesquisandosobreoassunto.Mostreitambémooutro ladodaprática,seusefeitosnodesigndeclasses,queémuitofaladamaspoucodiscu- tidaeexplicada.ApráticadeTDD,quandobemusada,podeserbastanteprodutiva. Mas,comoveráaolongodolivro,ospraticantesdevemestarsemprealertasasdicas queotestedarásobrenossocódigo. Aqui,passaremosporeleseoleitoraofinaldo livroteráemmãosumanovaeexcelenteferramentadedesenvolvimento. Aquemsedestinaesselivro? Esselivroédestinadoadesenvolvedoresquequeremaprenderaescrevertestes demaneiraeficiente,equedesejamaprenderacomomelhoraraindamaisocódigo que produzem. Neste livro, utilizamos Java para demonstrar os conceitos discuti- dos,masvocêpodefacilmentelevarasdiscussõesfeitasaquiparaasualinguagem deprogramaçãofavorita.MesmoquevocêjápratiqueTDD,tenhocertezaqueaqui CasadoCódigo encontrarádiscussõesinteressantessobrecomoapráticadáfeedbacksobreproble- mas de acoplamento e coesão, bem como técnicas para escrever testes melhores e maisfáceisdeseremmantidos. Testadorestambémpodemsebeneficiardestelivro,entendendocomoescrever códigosdetestedequalidade,quandoounãousarTDD,ecomoreportarproblemas decódigoparaosdesenvolvedores. Comodevoestudar? Aolongodolivro,trabalhamosemdiversosexemplos,muitosimilaresaomundo real. Todocapítulopossuisuapartepráticaeparteteórica. Naparteprática,muito códigodetesteéescrito.Naparteteórica,refletimossobreocódigoqueproduzimos atéaquelemomento,oquefoifeitodebom,oquefoifeitoderuim,emelhoramos deacordo. Oleitorpoderefazertodososcódigosproduzidosnoscapítulos. PraticarTDD éessencialparaqueasideiasfiquemnaturais. Boaleitura! vi Sumário 1 Introdução 1 1.1 Eraumavezumprojetosemtestes... . . . . . . . . . . . . . . . . . . . 1 1.2 Porquedevemostestar? . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.3 Porquenãotestamos?. . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.4 TestesautomatizadoseTDD . . . . . . . . . . . . . . . . . . . . . . . . 3 1.5 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 TestesdeUnidade 5 2.1 Oqueéumtestedeunidade? . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Precisomesmoescrevê-los? . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 OPrimeiroTestedeUnidade. . . . . . . . . . . . . . . . . . . . . . . . 8 2.4 Continuandoatestar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.5 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3 IntroduçãoaoTest-DrivenDevelopment 17 3.1 Oproblemadosnúmerosromanos . . . . . . . . . . . . . . . . . . . . 18 3.2 Oprimeiroteste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 3.3 Refletindosobreoassunto . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.4 Quaisasvantagens? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.5 UmpoucodahistóriadeTDD . . . . . . . . . . . . . . . . . . . . . . . 28 3.6 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4 SimplicidadeeBabySteps 31 4.1 OProblemadoCálculodeSalário . . . . . . . . . . . . . . . . . . . . . 31 4.2 Implementandodamaneiramaissimplespossível . . . . . . . . . . . 33 4.3 PassosdeBebê(ouBabySteps) . . . . . . . . . . . . . . . . . . . . . . 35 4.4 Usandobabystepsdemaneiraconsciente . . . . . . . . . . . . . . . . 41 4.5 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Sumário CasadoCódigo 5 TDDeDesigndeClasses 45 5.1 OProblemadoCarrinhodeCompras . . . . . . . . . . . . . . . . . . 45 5.2 Testesqueinfluenciamnodesigndeclasses . . . . . . . . . . . . . . . 50 5.3 DiferençasentreTDDetestesdamaneiratradicional . . . . . . . . . 51 5.4 Testescomorascunho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 5.5 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 6 QualidadenoCódigodoTeste 55 6.1 Repetiçãodecódigoentretestes . . . . . . . . . . . . . . . . . . . . . . 56 6.2 Nomenclaturadostestes . . . . . . . . . . . . . . . . . . . . . . . . . . 59 6.3 TestDataBuilders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 6.4 TestesRepetidos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 6.5 Escrevendoboasasserções . . . . . . . . . . . . . . . . . . . . . . . . . 65 6.6 Testandolistas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 6.7 SeparandoasClassesdeTeste . . . . . . . . . . . . . . . . . . . . . . . 68 6.8 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 7 TDDeaCoesão 71 7.1 NovamenteoProblemadoCálculodeSalário . . . . . . . . . . . . . . 71 7.2 Ouvindoofeedbackdostestes . . . . . . . . . . . . . . . . . . . . . . . 75 7.3 Testesemmétodosprivados?. . . . . . . . . . . . . . . . . . . . . . . . 77 7.4 ResolvendooProblemadaCalculadoradeSalário . . . . . . . . . . . 78 7.5 Oqueolharnotesteemrelaçãoacoesão? . . . . . . . . . . . . . . . . 82 7.6 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 8 TDDeoAcoplamento 85 8.1 OProblemadaNotaFiscal . . . . . . . . . . . . . . . . . . . . . . . . . 85 8.2 MockObjects. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 8.3 Dependênciasexplícitas. . . . . . . . . . . . . . . . . . . . . . . . . . . 92 8.4 Ouvindoofeedbackdostestes . . . . . . . . . . . . . . . . . . . . . . . 93 8.5 Classesestáveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 8.6 ResolvendooProblemadaNotaFiscal . . . . . . . . . . . . . . . . . . 97 8.7 Testandométodosestáticos. . . . . . . . . . . . . . . . . . . . . . . . . 100 8.8 TDDeaconstantecriaçãodeinterfaces . . . . . . . . . . . . . . . . . 101 8.9 Oqueolharnotesteemrelaçãoaoacoplamento? . . . . . . . . . . . . 104 8.10 Conclusão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 viii
Description: