Cada vez mais os gurus do TDD nos dizem que o TDD não é sobre testes, é sobre design . Então, eu conheço alguns desenvolvedores que criam um design realmente bom sem TDD. Eles deveriam praticar TDD então?
Cada vez mais os gurus do TDD nos dizem que o TDD não é sobre testes, é sobre design . Então, eu conheço alguns desenvolvedores que criam um design realmente bom sem TDD. Eles deveriam praticar TDD então?
Respostas:
O TDD não apenas me ajuda a obter o melhor design final, mas também a chegar lá em menos tentativas.
Eu costumava ter duas ou três facadas em um problema antes de decidir qual design eu achava melhor. Agora, esse mesmo tempo é gasto escrevendo testes e concentrando minha mente no design correto. E, como um bônus, isso me deixa com um conjunto de testes repetíveis. Ganhar!
Dito isto, inevitavelmente haverá pessoas para quem o TDD não oferece nada. Contanto que eles ainda tenham testes automatizados e repetíveis no final, tudo bem.
forced
. Não sei por que as pessoas não são mais incomodadas com a frequência da palavra "forçado", como ocorre nas discussões sobre TDD. Não é preciso ser forçado a projetar algo corretamente; eles devem aprender como projetar as coisas corretamente, e depois continuar a fazê-lo sem ser forçado a isso, especialmente quando esse ato de forçar é tão incrivelmente demorado.
O que esse guru de TDD em particular está realmente tentando dizer não é que o TDD é um processo de design (embora muitas pessoas infelizmente o tenham interpretado dessa maneira). A mensagem aqui é que o uso de um processo como o TDD, se você fizer certo , tenderá a melhorar seu design geral.
O conceito fundamental é muito mais antigo que o TDD; projetando para testabilidade . Se você seguir rigorosamente os princípios do SOLID , especialmente o Princípio de responsabilidade única , encontrará um código muito fácil de testar. Por outro lado, se você tende a ser um pouco mais desleixado em seu design, provavelmente encontrará o processo de escrever testes de unidade para forçá-lo a fazer isso com mais frequência, para evitar a frustração de (a) descobrir o que precisa ser feito. ser testado e (b) gastar mais tempo configurando dependências do que escrevendo os testes reais.
Você não tem que seguir TDD para obter os benefícios deste, mas não ajuda a escrever os testes cedo - de preferência logo após você implementar uma classe, se não antes ou durante. Se você esperar demais, corre o risco dos testes "sujos híbridos" de que o autor está falando, que não têm muito valor porque são frágeis e tendem a quebrar durante a refatoração inofensiva - sem mencionar o aumento a escala reprojeta um processo dolorosamente difícil.
Você não pode saber se está realmente projetando para testabilidade se não escrever testes, e "testes de recursos" aleatórios com apenas 15% de cobertura de código não contam.
É claro que você pode criar bons designs sem precisar escrever um único teste - mas você tem certeza de que são ótimos designs? Como você sabe, se você não está claramente especificado por testes? O teste descobre muitos problemas e, embora um processo de controle de qualidade possa encontrar erros visíveis, eles não descobrirão más decisões de design.
Resposta simplista vinda de alguém que se esforça para aprender TDD: Você não precisa , mas o principal benefício que isso oferece é, simplesmente, confiança : Confiança de que seu aplicativo funciona. Confiança de que os casos de uso são satisfeitos. Confiança de que sua lógica é correta para o módulo "Foobar". Confiança de que seu código está estruturado adequadamente para ser sustentável e extensível seis meses depois, quando o CEO quiser adicionar um novo recurso maluco sobre o qual ele leu. Confiança de que, quando seu aplicativo crescer, foram lançadas as bases para que a arquitetura não se desfaça ou exija montes de hacks confusos para julgar novos recursos.
Sei que o que foi dito acima soou um pouco evangélico, mas é assim que vejo os benefícios do TDD. Mesmo que você possa criar projetos bons, sólidos e bem arquitetados usando o TDD, força sua mão a fazer as coisas certas e, em seguida, prova que as coisas estão sendo feitas corretamente, e mais importante, fornece uma linha de base para manter as coisas certas. Pelo pouco que aprendi no TDD, usá-lo me forçou a limpar o código e a seguir os conceitos adequados de engenharia de software, onde, de outro modo, faria a "coisa mais rápida possível", que muitas vezes resultava em códigos "hackeados".
Só posso falar da minha experiência. Para mim, o TDD trouxe várias coisas que eu não tinha antes na minha caixa de ferramentas de hábitos de estilo de desenvolvimento. Embora, vale dizer novamente que TDD não é solução para tudo. Eu sempre tento separar a implementação pronta de exploração e produção. O TDD em fase de exploração não é absolutamente necessário e ainda está desacelerando. Por outro lado, para o código pronto para produção, ele traz vários benefícios que, a curto e longo prazo, são muito valiosos para a saúde mental dos desenvolvedores e o karma do projeto.
Há uma coisa que o TDD não corrige. Se você não sabe como construir o que está construindo, o TDD não produzirá solução para você. Você precisa ter um "design" aproximado ou uma visão geral do problema e da solução. O TDD fará com que você apenas o implemente de maneira mais elegante e sustentável com o código de maior qualidade.
Por fim, prefiro pensar em termos de BDD que se apóiam nas práticas de TDD. O BDD me faz implementar soluções usando o vocabulário do domínio e fazer com que o software se encaixe melhor no problema.
Pode haver muitas maneiras de obter um ótimo design, e há inquestionavelmente muitas interpretações diferentes do que constitui "ótimo" - ou mesmo "bom". Eu suspeito que a maioria dos TDDers não concordaria com você sobre a definição - que, se analisássemos o código que você considera ótimo, consideraríamos menos do que ótimo. O TDD nos leva a algumas qualidades muito específicas, e essas qualidades raramente são encontradas no código não TDD.
A testabilidade, obviamente, é uma dessas qualidades e a principal. Métodos e classes extremamente pequenos são talvez uma sub-característica, e isso leva a uma excelente nomeação. Talvez você conheça programadores que alcançam essas qualidades sem fazer TDD, mas eu não.