Definitivamente. Algumas pessoas dizem que "qualquer teste é melhor do que nenhum teste". Eu discordo totalmente - testes mal escritos reduzem o tempo de desenvolvimento e você acaba perdendo dias corrigindo testes "quebrados" porque, em primeiro lugar, eles não eram bons testes de unidade. Para mim, no momento, as duas coisas em que estou focado para tornar meus testes valiosos, e não um fardo, são:
Manutenção
Você deve testar o resultado (o que acontece), não o método ( como acontece). Sua configuração para o teste deve ser o mais dissociada possível da implementação: configure apenas resultados para chamadas de serviço etc. que sejam absolutamente necessários.
- Use uma estrutura de simulação para garantir que seus testes não dependam de nada externo
- Favorecer stubs sobre zombarias (se sua estrutura distinguir entre eles) sempre que possível
- Não há lógica nos testes! Ifs, switches, for-eaches, cases, try-catchs etc. são todos ruins, pois podem introduzir bugs no próprio código de teste
Legibilidade
Não há problema em permitir um pouco mais de repetição em seus testes, o que você normalmente não permitiria em seu código de produção, se os tornar mais legíveis. Basta equilibrar isso com o material de manutenção acima. Seja explícito no que o teste está fazendo!
- Tente manter um estilo de "organizar, agir, afirmar" para seus testes. Isso separa sua configuração e expectativas do cenário, da ação que está sendo executada e do resultado que está sendo afirmado.
- Mantenha uma asserção lógica por teste (se o nome do seu teste tiver "e" nele, pode ser necessário dividi-lo em vários testes)
Em conclusão, você deve se preocupar muito com os testes "fedorentos" - eles podem acabar perdendo seu tempo, sem fornecer valor.
Você disse:
O teste de unidade geralmente requer vários "hacks fedorentos", como funções de stubbing.
Parece que você definitivamente poderia ler algumas técnicas de teste de unidade, como usar uma estrutura de zombaria, para tornar sua vida muito mais fácil. Eu recomendaria muito fortemente The Art of Unit Testing , que cobre o exposto e muito mais. Achei isso esclarecedor depois de lutar por muito tempo com testes mal escritos, inatingíveis e "fedorentos". É um dos melhores investimentos de tempo que fiz este ano!