Pergunta

Acabei de ler o artigo da Wikipedia objetos simulados, mas ainda não estou totalmente claro sobre o objetivo deles. Parece que eles são objetos criados por uma estrutura de teste quando o objeto real seria muito complexo ou imprevisível (você sabe 100% de certeza de quais são os valores do objeto simulado porque você os controla totalmente).

No entanto, eu tinha a impressão de que todos os testes são feitos com objetos de valores conhecidos, então devo estar perdendo alguma coisa. Por exemplo, em um projeto de curso, fomos encarregados de um aplicativo de calendário. Nosso conjunto de testes consistia em objetos de evento que sabíamos exatamente o que eram para que pudéssemos testar as interações entre vários objetos de eventos, vários subsistemas e a interface do usuário. Acho que esses são objetos simulados, mas não sei por que você não faria isso porque, sem os objetos de valores conhecidos, você não pode testar um sistema.

Foi útil?

Solução

Um objeto simulado não é apenas um objeto com valores conhecidos. É um objeto que possui a mesma interface que um objeto complexo que você não pode usar no teste (como uma conexão de banco de dados e conjuntos de resultados), mas com uma implementação que você pode controlar em seu teste.

Existem estruturas zombeteiras que permitem criar esses objetos em tempo real e, em essência, permitem que você diga algo como: faça -me um objeto com um método que pega um INT e retorna um bool. Quando eu passar 0, ele deve retornar verdadeiro. Em seguida, você pode testar o código que usa Foo (), para garantir que ele reaja adequadamente.

Martin Fowler tem um ótimo artigo sobre zombaria:

Outras dicas

Pense no caso clássico de ter um software cliente e servidor. Para testar o cliente, você precisa do servidor; Para testar o servidor, você precisa do cliente. Isso torna o teste de unidade praticamente impossível - sem usar zombarias. Se você zombar do servidor, poderá testar o cliente isoladamente e vice -versa.

O objetivo da simulação não é duplicar o comportamento das coisas que estão zombando. É mais para atuar como uma máquina de estado simples cujas alterações de estado podem ser analisadas pela estrutura de teste. Portanto, uma simulação do cliente pode gerar dados de teste, enviá -los para o servidor e analisar a resposta. Você espera uma certa resposta a uma solicitação específica e, portanto, pode testar se obtê -lo.

Eu concordo com tudo @Lou franco Diz e você definitivamente deve ler o excelente artigo de Martin Fowler sobre duplas de teste que o @lou Franco aponta para você.

O principal objetivo de qualquer teste duplo (falso, stub ou simulado) é isolar o objeto em teste, para que seu teste de unidade esteja testando apenas esse objeto (não suas dependências e os outros tipos que ele colabora ou interage).

Um objeto que fornece a interface do qual seu objeto depende pode ser usado no lugar da dependência real, para que as expectativas possam ser colocadas de que certas interações ocorram. Isso pode ser útil, mas há alguma controvérsia em relação aos testes baseados no estado vs. baseada em interação. O uso excessivo da expectativa simulada levará a testes quebradiços.

Outro motivo para duplas de teste é remover dependências de bancos de dados ou sistemas de arquivos ou outros tipos que são caros para configurar ou executar operações demoradas. Isso significa que você pode manter o tempo necessário para testar o objeto em que se interessa no mínimo.

Aqui está um exemplo: se você está escrevendo código que preenche um banco de dados, você pode verificar se um método específico adicionou dados ao banco de dados.

A configuração de uma cópia do banco de dados para teste tem o problema de que, se você assumir que não há registros antes da chamada para o método testado e um registro depois, precisará reverter o banco de dados para um estado anterior, aumentando assim a sobrecarga para executar o teste.

Se você assumir que há apenas mais um registro do que antes, ele poderá entrar em conflito com um segundo testador (ou mesmo um segundo teste no mesmo código) conectando -se ao mesmo banco de dados, causando dependências e tornando os testes frágeis.

A simulação permite que você mantenha os testes independentes um do outro e fácil de configurar.

Este é apenas um exemplo - tenho certeza de que os outros podem fornecer mais.

Concordo 100% com os outros colaboradores deste tópico, especialmente com a recomendação do artigo de Martin Fowler.

Você pode estar interessado em nosso livro, veja http://www.growing-object-orieted-oftware.com/. Está em Java, mas as idéias ainda se aplicam.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top