Os testes de unidade não apenas facilitam o design, mas esse é um dos principais benefícios.
A escrita do primeiro teste elimina a modularidade e a estrutura de código limpa.
Quando você escreve seu código primeiro, você descobrirá que quaisquer "condições" de uma determinada unidade de código são naturalmente enviadas para dependências (geralmente através de zombarias ou stubs) quando você as assume em seu código.
"Com a condição x, esperar o comportamento y", muitas vezes se tornará um esboço de fornecimento x
(que é um cenário no qual o teste precisa verificar o comportamento do componente atual) e y
se tornará uma farsa, uma chamada à qual será verificada em o final do teste (a menos que seja um "deve retornar y
", nesse caso, o teste apenas verificará o valor de retorno explicitamente).
Então, depois que esta unidade se comportar conforme especificado, você passa a escrever as dependências (para x
e y
) que você descobriu.
Isso torna a escrita de código modular e limpo um processo muito fácil e natural, onde, caso contrário, é fácil desfocar responsabilidades e unir comportamentos sem perceber.
Escrever testes posteriormente informará quando seu código está mal estruturado.
Quando escrever testes para um pedaço de código se torna difícil porque há muitas coisas para stub ou zombar, ou porque as coisas estão muito juntas, você sabe que tem melhorias a fazer no seu código.
Quando "alterar testes" se torna um fardo, porque há muitos comportamentos em uma única unidade, você sabe que possui melhorias a serem feitas no seu código (ou simplesmente na sua abordagem para escrever testes - mas esse não é geralmente o caso na minha experiência) .
Quando seus cenários se tornam muito complicados ("se x
e y
e z
depois ...") porque você precisa abstrair mais, você sabe que possui melhorias a serem feitas no seu código.
Quando você termina os mesmos testes em dois equipamentos diferentes devido à duplicação e redundância, sabe que possui melhorias a serem feitas no seu código.
Aqui está uma excelente palestra de Michael Feathers demonstrando a estreita relação entre testabilidade e design no código (originalmente publicado por displayName nos comentários). A palestra também aborda algumas queixas e conceitos errôneos sobre bom design e testabilidade em geral.