Esta é uma distinção importante, mas infelizmente você nunca encontrará acordo. O problema é que a maioria dos desenvolvedores os define do seu próprio ponto de vista. É muito semelhante ao debate sobre Plutão. (Se estivesse mais perto do Sol, seria um planeta?)
O teste de unidade é fácil de definir. Ele testa o CUT ( código em teste ) e nada mais. (Bem, o mínimo possível.) Isso significa zombaria, falsificação e acessórios.
No outro extremo do espectro, há o que muitas pessoas chamam de teste de integração de sistemas . Isso está testando o máximo possível, mas ainda está procurando bugs em seu próprio CUT.
Mas e a vasta extensão entre eles?
- Por exemplo, e se você testar um pouco mais do que o CUT? E se você incluir uma função Fibonacci, em vez de usar um acessório que você injetou? Eu chamaria isso de teste funcional , mas o mundo discorda de mim.
- E se você incluir
time()
ou rand()
? Ou se você ligar http://google.com
? Eu chamaria isso de teste do sistema , mas, novamente, estou sozinho.
Por que isso importa? Porque os testes do sistema não são confiáveis. Eles são necessários, mas às vezes falham por razões fora do seu controle. Por outro lado, os testes funcionais devem sempre passar, não falhar aleatoriamente; se eles são rápidos, também podem ser usados desde o início para usar o Desenvolvimento Orientado a Testes sem escrever muitos testes para sua implementação interna. Em outras palavras, acho que os testes unitários podem ser mais problemáticos do que valem, e eu tenho uma boa companhia .
Coloquei testes em 3 eixos, com todos os seus zeros no teste de unidade :
- Teste funcional: usando o código real cada vez mais fundo na sua pilha de chamadas.
- Teste de integração: cada vez mais alto sua pilha de chamadas; em outras palavras, testando seu CUT executando o código que o utilizaria.
- Teste do sistema: operações cada vez mais irrepetíveis (agendador de O / S, relógio, rede, etc. )
Um teste pode ser facilmente todos os 3, em vários graus.