Uma coisa q gostaria de adicionar para qm ler, q TDD é um estilo de codificação e não testes de unidade em si.
Um software pode ter testes sem usar TDD. É a melhor forma? Não sei, depende de como a pessoa tem a capacitação de criar testes e não do estilo q ele cria o teste.
Vou explicar com base na minha opinião, pode discordar caso não ache válido, mas diga o pq.
Pelo TDD vc começa pelo teste. Então cria a casca do q quer, coloca os dados de entrada q quer q aconteça, falha, desenvolve o código, dá certo, passa pro próximo teste e assim vai.
Se não usar TDD, ou seja, vc inicia pelo código antes (o q todo mundo normalmente faz), depois cria os testes com base no q já está pronto.
Ai vem 2 pontos de cada um.
Nem sempre no TDD sabemos como deve ficar, muito menos sabemos 100% os dados de entrada. Isso querendo ou não pode mais atrapalhar do q ajudar.
No modo não TDD, a gente cria o código, mas sempre existe o problema de termos criados condições q nunca iremos saber se realmente acontece, pois nossa mente está preparada apenas para enxergar o caso ótimo, então pelo menos isso a gente testa, mas os casos de falhas é o q fica capenga e nem sempre conseguimos ter 100% de precisão nisso.
Mas até qndo usamos TDD pode acontecer problemas de falhas serem esquecidas.
Então eu cheguei numa conclusão q depende mto qndo usar um ou quando usar outro estilo de criação de testes.
O TDD eu crio para aqueles casos onde tenho mais certeza do q quero, como nos algoritmos incluso na caixa preta, por exemplo, validação do CPF, conversão de datas para uma string formatada, algumas regras de negócios bem estabelecidas como boletos, etc. São normalmente coisas mais básicas, q tem um resultado pré definidos q não pode mudar.
Agora lógicas q usamos nas páginas, regras de negócios mais dinamicos, e2e, etc eu faço da forma código antes, testes depois.
Ai vcs podem me dizer, o jeito q utilizo esses 2 estilos é a melhor forma de fazer? Não sei, pois cada um programa de um jeito. Estilo de programar tem mto mais haver com a maneira q a pessoa lida, então não tem como saber se é o melhor jeito, pois a qualidade do teste está mto mais relacionado a como o teste foi codificado e o q ele codificou, e não qual maneira ele fez o teste.
A única certeza q tenho é deixar seu código de produção sem testes só demonstra a incapacidade do dev de pensar a longo prazo, pois ele é algo chato de se criar, mas é uma proteção contra instabilidades e má manutenções futuras. Portanto coloque testes, seja do modo TDD ou seja do modo não TDD.