Comecei a fazer TDD no início de agosto de 2009 e convenci toda a minha empresa a mudar para ele em setembro / outubro de 2009. Atualmente, toda a equipe de desenvolvedores é totalmente convertida e o comprometimento de código não testado no repositório é considerado uma coisa ruim e usada. Tem funcionado muito bem para nós e não consigo imaginar voltar à codificação de cowboys.
No entanto, existem dois problemas que são bastante visíveis.
O conjunto de testes deve ser mantido
Quando você leva a sério o TDD, você acaba escrevendo muitos testes. Além disso, leva algum tempo e experiência para perceber qual é a granularidade certa de testes (exagerar é quase tão ruim quanto subexpor). Esses testes também são de código e são suscetíveis ao bitrot. Isso significa que você deve mantê-las como todo o resto: atualize-a quando atualizar as bibliotecas das quais elas dependem, refatorando de tempos em tempos ... Quando você faz grandes alterações no seu código, muitos testes ficam subitamente desatualizados ou mesmo errado. Se você tiver sorte, pode simplesmente excluí-los, mas muitas vezes acabará extraindo os bits úteis e adaptando-os à nova arquitetura.
Abstrações de teste vazam de tempos em tempos
Estamos usando o Django, que possui uma ótima estrutura de teste. No entanto, às vezes, faz suposições ligeiramente divergentes da realidade. Por exemplo, algum middleware pode interromper os testes. Ou, alguns testes fazem suposições sobre um back-end de cache. Além disso, se você estiver usando um banco de dados "real" (não o SQLite3), a preparação do banco de dados para os testes levará muito tempo. Claro, você pode (e deve) usar o SQLite3 e um banco de dados na memória para testes que você faz localmente, mas algum código se comportará de maneira diferente, dependendo do banco de dados usado. É necessário configurar um servidor de integração contínua executado em uma configuração realista.
(Algumas pessoas dirão que você deve zombar de todas as coisas, como o banco de dados, ou que seus testes não são "puros", mas isso é apenas ideologia. Se você cometer erros no seu código de zombaria (e acredite, você o fará), seu testinguite não terá valor.)
Isso dito, os problemas que descrevi começam a ser notados apenas quando você está bastante avançado com o TDD ... Quando você está apenas começando com o TDD (ou trabalhando em projetos menores), a refatoração de teste não será um problema.