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!
Tweet