A premissa principal quando a gente vai implementar o TDD, é escrever o teste antes do código. Isso mesmo, escrever o teste antes mesmo do código existir! Pode parecer estranho e alguns desenvolvedores podem considerar o TDD uma perda de tempo, porém o Test-driven Development traz diversas vantagens, a primeira delas é que você desenvolve facilmente um código limpo.
Segundo Robert Martin, mais conhecido como Uncle Bob, um dos 17 signatários originais do Manifesto Ágil em 2001 e autor do livro Clean Code, quando você desenvolve um teste antes de desenvolver um código, você desenvolve um código fácil de ser testado e consequentemente, desenvolve um código muito mais limpo. A razão disso é que: seguindo o TDD você reduz naturalmente os acoplamentos da sua aplicação.
ENTENDA DO PROCESSO DE TEST-DRIVEN DEVELOPMENT
- Na fase vermelha, você escreverá um teste unitário que ao ser executado irá falhar pois o código em si ainda não existe.
- Depois, na fase verde, você deve implementar um código que seja suficiente para passar no teste unitário recém escrito.
- Na terceira fase, você faz a refatoração do código, melhorando a leitura, eliminando redundâncias e adotando boas práticas.
Assim fica mais fácil entender como o ciclo do TDD nos ajuda a projetar um código mais limpo e nos motiva a sempre limpar nosso código. Afinal, estamos atrelados a este ciclo de testes e refatoração.
Segundo Uncle Bob, você estará sempre alternando entre escrever seus testes e escrever seus códigos, portanto estará constantemente testando de forma rápida e tudo sempre estará funcionando. No final, como seu código está sendo desenvolvido e orientado a testes, você reduz os bugs e o seu tempo gasto em debug. Além disso, o TDD é uma forma de documentar como cada parte do sistema funciona de uma forma clara para que outros programadores interpretem facilmente.
Uncle Bob ainda diz que, além de todas as outras vantagens, a real razão para se implementar o TDD, é que assim que seu código passa por esse ciclo de desenvolvimento e teste, ele estará pronto para implementação.