quarta-feira, 11 de setembro de 2013

O que é Test Double?

Você sabe o que são Test Doubles?

Vejo muita gente programar testes sem conhecer um conceito tão importante quando este. Consequentemente não sabem diferenciar: dummy, fake, stub, mock e spy.

Vou seguir a apresentação destes conceitos como fez o Martin Fowler em seu blog, citando Gerard Meszaros, que fez um ótimo trabalho em seu livro xUnit Patterns.


Para diferenciar o que está no post de Martin Fowler dos meus comentários, o que eu disse sobre cada tipo está em itálico.

O que é Test Double?

Test Double é um termo genérico para qualquer caso que se deseja substituir um objeto real por outro objeto com objetivos de teste. Existem os seguintes tipos:

Dummy

Este tipo de objeto é passado mas nunca faz nada. Normalmente são usados para preencher parâmetros apenas.

Muitas vezes esses nem são objetos reais, o que pode ser implementado com proxy, por exemplo.

Fake

Usualmente estes objetos possuem implementações funcionais, mas são criados outros a partir de atalhos que não permitiriam seu uso em produção. Um banco de dados em memória para teste é um bom exemplo.

Outro exemplo são objetos padrão, pré definidos e usados diversas vezes nos testes. Em um sistema acadêmico um aluno inscrito ou com matricula cancelada, pode ser criado dessa forma. É comum que um objeto Fake tenha apenas os atributos importantes para representar o estado necessário ao teste. Assim, um aluno inscrito provavelmente terá apenas o valor "inscrito" para o atributo "situação".

Stub

Estes objetos são programados para fornecerem respostas previstas em teste, normalmente não respondem a nada além do programado para o teste.

Estes objetos são ótimos para simular apenas os comportamentos desejados em testes unitários. Eles são sempre usados quando deseja-se obter um objeto da base de dados ou retornar o resultado de um processamento que poderia ser demorado. 

Spy

Estes objetos são stubs que também gravam informações baseadas em como foram chamados. Uma forma disso pode ser um serviço de email que armazene quantos emails foram enviados.

Normalmente esses objetos são utilizados para verificar chamadas internas de objetos reais, parâmetros passados e quantidade de execuções. Mas eles também podem ser stubs apenas, dos quais se deseja verificar chamadas.

Mocks

Estes objetos são pré-programados com expectativas que formam uma especificação das chamadas que é esperado que eles recebam. Eles podem lançar exceções se receberem chamadas não esperadas e são verficados se todas as chamadas esperadas foram realizadas.

Quando usar?

Test Doubles são  interessantes quando se deseja isolar uma parte do sistema sendo testado (SUT) para verificar se ela está se comportando como deveria. A parte que se deseja testar pode ser um método, uma classe, um componente, ou até toda a aplicação contra um banco de dados falso.

Test Doubles são usados principalmente em Testes Unitários, entretanto, seu uso vai muito além disso. Eles também podem ser aplicados a testes de integração, nos quais deseja-se saber se dois  componentes do sistema estão funcionando corretamente juntos. 


Nenhum comentário:

Postar um comentário

Obrigado por deixar seu comentário. Em breve ele estará publicado.