Comparando Dublês de Testes

Posted by Ismael Soares on November 17, 2014

No quinto artigo desta série, dei exemplos de como utilizar o dublê Mock Object. Neste artigo, vou comparar os 5 tipos de dublês

Como pode ser observado, as funcionalidades em torno de alguns tipos de dublês de teste são muito parecidas umas com as outras, tornando o propósito de utilização de cada um deles não muito claro. Para auxiliar na identificação de qual tipo de dublê de teste é mais adequado, podemos utilizar a tabela abaixo que mostra um resumo das principais funções de cada dublê.

Tipo Dublê
Propósito
Interage com o teste
Recebe Entradas Indiretas
Gera Saídas Indiretas
Dummy Object Possibilitar a criação de um objeto sem que seja necessário informar muitas dependências Não Não Não
Test Stub Verificar entradas indiretas Sim Sim Não
Test Spy Verificar saídas indiretas Sim Opcional Captura informações para posterior verificação
Fake Object Executar testes mais rapidamente Sim Não O próprio Fake pode ser utilizado como saída
Mock Object Verificar saídas indiretas Sim Opcional Verifica as chamdas de retornos pré-estabelecidos

Quando se estuda os dublês de teste, a primeira dúvida que vem à mente do desenvolvedor é qual deles utilizar ou em que situação um dublê é melhor que o outro. Infelizmente não existe uma resposta exata para esta questão. Portanto, deve-se levar em conta as vantagens e desvantagens de cada um. Para facilitar esta decisão, a Tabela a seguir ilustra um comparativo.

Tipo Dublê

Vantagens

Desvantagens

Dummy Object Muito fácil para criar Não é muito útil
Test Stub Fácil de criar Flexibilidade limitada. Não é capaz de verificar se os membros foram chamados corretamente
Test Spy Pode verificar o comportamento realizado Flexibilidade limitada
Fake Object Oferece uma implementação simplificada do objeto real que pode ser usada em diferentes cenários Mais difícil de criar. Pode ser tão complexo que requer testes de unidade para si mesmo
Mock Object Eficiente para criar dublês de teste. Pode verificar se membros são chamados corretamente. Flexível, pois os retornos podem ser definidos pelo desenvolvedor como ele bem quiser Aprendizagem não muito simples. Pode gerar repetição de código, já que os retornos devem ser definidos em cada teste

Conclusão

Como se pode notar, os Dublês de Teste permitem testar até mesmo classes que ainda não estão prontas ou sob nosso controle, acelerando a execução dos testes. Isso torna a escrita dos testes de unidade um processo natural, independente da implementação, possibilitando baixo acoplamento e maior coesão entre as classes. Além disto, possibilita a criação de um design evolutivo no sistema em desenvolvimento. Com as variações disponíveis dos dublês é possível criar testes de forma muito mais produtiva, e assim, o desenvolvedor pode aproveitar melhor o seu tempo para realizar refatorações, melhorias contínuas e a implementação de novas funcionalidades.

Apesar de tratar-se de um assunto pouco comentado na comunidade de desenvolvimento de software, é quase impossível escrever bons testes de unidade sem utilizar Dublês de Testes. No entanto, nesta série de artigos tivemos a oportunidade de mostrar de forma prática, como utilizar cada um deles. Contudo, a muito mais assunto sobre a aplicação de cada um dos Dublês de Teste que podem ser encontradas nos links e livros aqui comentados.

Se você gostou, compartilhe!

Até breve e bom código!


comments powered by Disqus