A menos que você escreva código sem testá-lo, você sempre incorrerá no custo do teste.
A diferença entre ter testes de unidade e não tê-los é a diferença entre o custo de escrever o teste e o custo de executá-lo em comparação com o custo do teste manual.
Se o custo de escrever um teste de unidade for de 2 minutos e o custo de execução do teste de unidade for praticamente 0, mas o custo de testar manualmente o código for 1 minuto, você quebrará mesmo depois de executar o teste duas vezes.
Por muitos anos, fiquei sem entender que não tinha tempo suficiente para escrever testes de unidade para o meu código. Quando eu escrevia testes, eles estavam inchados, coisas pesadas que só me encorajavam a pensar que eu só deveria escrever testes de unidade quando eu soubesse que eles eram necessários.
Recentemente, fui encorajado a usar o Test Driven Development e descobri que era uma revelação completa. Agora estou firmemente convencido de que não tenho o tempo não para escrever testes unitários.
Na minha experiência, desenvolvendo com testes em mente você acaba com interfaces mais limpas, classes mais focadas & módulos e geralmente mais SOLID , código testável.
Toda vez que eu trabalho com código legado que não tem testes de unidade e eu tenho que testar manualmente algo, eu continuo pensando "isso seria muito mais rápido se esse código já tivesse testes de unidade". Toda vez que eu tenho que tentar adicionar funcionalidade de teste de unidade ao código com alto acoplamento, eu continuo pensando "isso seria muito mais fácil se tivesse sido escrito de uma forma desacoplada".
Comparando e contrastando as duas estações experimentais que eu suporto. Um já existe há algum tempo e tem muito código legado, enquanto o outro é relativamente novo.
Ao adicionar funcionalidade ao antigo laboratório, muitas vezes é preciso ir ao laboratório e passar muitas horas trabalhando com as implicações das funcionalidades de que precisam e como posso adicionar essa funcionalidade sem afetar nenhuma das outras funcionalidades. O código simplesmente não está configurado para permitir testes off-line, então praticamente tudo tem que ser desenvolvido on-line. Se eu tentasse desenvolver off-line, acabaria com mais objetos simulados do que seria razoável.
No laboratório mais novo, geralmente posso adicionar funcionalidade, desenvolvendo-a off-line na minha mesa, zombando apenas das coisas que são imediatamente necessárias e, em seguida, gastando pouco tempo no laboratório, resolvendo todos os problemas restantes. pegou off-line.
TL; DR versão:
Escreva um teste quando o custo de escrever o teste, mais o custo de executá-lo tantas vezes quantas forem necessárias, provavelmente será menor do que o custo de testá-lo manualmente quantas vezes precisar.
Lembre-se que se você usar o TDD, o custo de escrever testes provavelmente diminuirá à medida que você melhorar, e a menos que o código seja absolutamente trivial, você provavelmente acabará executando seus testes mais frequentemente do que o esperado.