O teste unitário é importante? Sim definitivamente. No entanto, eles são diferentes dos cheiros de código porque os testes de unidade servem a um propósito diferente e têm um conjunto diferente de tensões que informam seu design. Muitos cheiros no código não se aplicam aos testes. Dada a minha mentalidade de TDD, eu diria que os cheiros de teste de unidade são mais importantes que os cheiros de código porque o código está lá apenas para satisfazer os testes.
Aqui estão alguns cheiros comuns para testes unitários:
- Fragilidade : seus testes falham com frequência e inesperadamente, mesmo para alterações de código aparentemente triviais ou não relacionadas?
- State Leak : seus testes falham diferentemente dependendo, por exemplo, de quais ordens eles são executados?
- Setup / Teardown Bloat : Seus blocos de configuração / desmontagem são longos e estão crescendo mais? Eles realizam algum tipo de lógica de negócios?
- Tempo de execução lento : Seus testes demoram muito para serem executados? Algum dos seus testes individuais de unidade demora mais de um décimo de segundo para ser executado? (Sim, estou falando sério, um décimo de segundo).
- Atrito : Os testes existentes dificultam a criação de novos testes? Você se encontra lutando com falhas de teste frequentemente durante a refatoração?
A importância dos cheiros é que eles são indicadores úteis de design ou outras questões mais fundamentais, ou seja, "onde há fumaça, há fogo". Não procure apenas cheiros de teste, procure também a causa subjacente.
Aqui, por outro lado, existem algumas boas práticas para testes de unidade:
- Feedback rápido e focado : Seus testes devem isolar a falha rapidamente e fornecer informações úteis sobre sua causa.
- Minimize a distância do código de teste : deve haver um caminho claro e curto entre o teste e o código que o implementa. Longas distâncias criam loops de feedback desnecessariamente longos.
- Teste uma coisa de cada vez : Testes de unidade só devem testar uma coisa. Se você precisar testar outra coisa, escreva outro teste.
- Um erro é um teste que você esqueceu de escrever : O que você pode aprender com essa falha ao escrever testes melhores e mais completos no futuro?