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