Seu colega de trabalho está certo de que tudo o que pode ser testado em unidade deve ser testado em unidade, e você está certo que os testes unitários levarão você apenas até agora e não mais, particularmente ao escrever invólucros simples em serviços externos complexos. / p>
Uma maneira comum de pensar sobre o teste é como uma pirâmide de testes . É um conceito freqüentemente conectado com o Agile, e muitos escreveram sobre ele, incluindo Martin Fowler (que atribui isso a Mike Cohn em Sucedendo com Agile ), Alistair Scott , e o Google Blog de testes .
/\ --------------
/ \ UI / End-to-End \ /
/----\ \--------/
/ \ Integration/System \ /
/--------\ \----/
/ \ Unit \ /
-------------- \/
Pyramid (good) Ice cream cone (bad)
A ideia é que os testes de unidade resilientes e de execução rápida são a base do processo de teste - deve haver testes unitários mais focados do que testes de sistema / integração e mais testes de integração / sistema do que testes de ponta a ponta. À medida que você se aproxima do topo, os testes tendem a levar mais tempo / recursos para serem executados, tendem a estar sujeitos a mais fragilidade e descamação e são menos específicos na identificação de qual sistema ou arquivo está quebrado ; naturalmente, é preferível evitar ser "top pesado".
Até esse ponto, os testes de integração não são ruins , mas a dependência deles pode indicar que você não projetou seus componentes individuais para serem fáceis de testar. Lembre-se, o objetivo aqui é testar se a sua unidade está funcionando de acordo com sua especificação, envolvendo um mínimo de outros sistemas quebráveis : Você pode tentar um banco de dados na memória (que eu conto como uma unidade Teste de teste amigável duplo ao lado de brincadeiras) para testes pesados de caso de borda, por exemplo, e depois escrever alguns testes de integração com o mecanismo de banco de dados real para estabelecer que os casos principais funcionam quando o sistema é montado.
Como uma nota secundária, você mencionou que as zombarias que você escreve simplesmente testam como algo é implementado, não se ele funciona . Isso é algo como um antipadrão: um teste que é um espelho perfeito de sua implementação não está realmente testando nada. Em vez disso, teste que cada classe ou método se comporta de acordo com sua própria especificação, em qualquer nível de abstração ou realismo que exija.