Eu li vários artigos sobre zombaria ou stubbing em testes, incluindo Mocks Arn't Stubs , de Martin Fowler , mas ainda não entendo a diferença.
963
Eu li vários artigos sobre zombaria ou stubbing em testes, incluindo Mocks Arn't Stubs , de Martin Fowler , mas ainda não entendo a diferença.
Respostas:
Stub
Acredito que a maior distinção é que um esboço que você já escreveu com comportamento predeterminado. Portanto, você teria uma classe que implementa a dependência (classe abstrata ou interface mais provável) que você está falsificando para fins de teste e os métodos seriam eliminados com respostas definidas. Eles não fariam nada sofisticado e você já teria escrito o código stubbed fora do teste.
Zombar
Um mock é algo que, como parte de seu teste, você precisa configurar com suas expectativas. Uma simulação não é configurada de maneira predeterminada, portanto você tem um código que faz isso em seu teste. De certa forma, as zombarias são determinadas em tempo de execução, pois o código que define as expectativas precisa ser executado antes que elas façam alguma coisa.
Diferença entre zombarias e stubs
Testes escritos com zombarias geralmente seguem um
initialize -> set expectations -> exercise -> verify
padrão para testes. Enquanto o esboço pré-escrito seguiria uminitialize -> exercise -> verify
.Semelhança entre zombarias e stubs
O objetivo de ambos é eliminar o teste de todas as dependências de uma classe ou função, para que seus testes sejam mais focados e mais simples no que eles estão tentando provar.
fonte
Prefácio
Existem várias definições de objetos que não são reais. O termo geral é teste duplo . Este termo abrange: manequim , falso , esboço , simulação .
Referência
De acordo com o artigo de Martin Fowler :
Estilo
Mocks vs Stubs = teste comportamental x teste estadual
Princípio
De acordo com o princípio do teste, apenas uma coisa por teste , pode haver vários stubs em um teste, mas geralmente há apenas uma simulação.
Ciclo da vida
Teste o ciclo de vida com stubs:
Teste o ciclo de vida com zombarias:
Sumário
Os testes de zombaria e stubs respondem à pergunta: Qual é o resultado?
Testes com zombarias também estão interessados em: Como o resultado foi alcançado?
fonte
Um esboço é um objeto falso simples. Apenas garante que o teste seja executado sem problemas.
Um mock é um esboço mais inteligente. Você verifica se o seu teste passa por ele.
fonte
Aqui está uma descrição de cada um seguido por uma amostra do mundo real.
Manequim - apenas valores falsos para satisfazer o
API
.Falso - crie uma implementação de teste de uma classe que possa depender de alguma infraestrutura externa. (É uma boa prática que seu teste de unidade NÃO realmente interaja com a infraestrutura externa.)
Stub - substitui métodos para retornar valores codificados, também chamados de
state-based
.Mock - muito parecido,
Stub
masinteraction-based
não baseado no estado. Isso significa que você não esperaMock
que retorne algum valor, mas suponha que uma ordem específica de chamadas de método seja feita.Stubs
eMocks
são, na verdade, subtipos deMock
, ambos trocam implementação real com implementação de teste, mas por diferentes motivos específicos.fonte
No curso codeschool.com , Rails Testing for Zombies , eles fornecem esta definição dos termos:
Stub
Zombar
Então, como Sean Copenhaver descreveu em sua resposta, a diferença é que a zombaria estabelece expectativas (ou seja, faz afirmações sobre se ou como elas são chamadas).
fonte
Os stubs não são reprovados em seus testes, podem sim.
fonte
Acho que a resposta mais simples e clara sobre essa questão é dada por Roy Osherove em seu livro A arte do teste de unidade (página 85)
Isso significa que, se você está fazendo afirmações contra o falso, significa que você está usando o falso como uma farsa; se você está usando o falso apenas para executar o teste sem afirmação, está usando o falso como um esboço.
fonte
Lendo todas as explicações acima, deixe-me tentar condensar:
fonte
Um mock está apenas testando o comportamento, certificando-se de que certos métodos sejam chamados. Um Stub é uma versão testável (por si só) de um objeto específico.
O que você quer dizer com Apple?
fonte
Se você compará-lo à depuração:
fonte
O uso de um modelo mental realmente me ajudou a entender isso, e não todas as explicações e artigos, que não "afundaram".
Imagine que seu filho tem um prato de vidro na mesa e ele começa a brincar com ele. Agora, você tem medo que isso se quebre. Então, você dá a ele um prato de plástico. Isso seria uma simulação (mesmo comportamento, mesma interface, implementação "mais suave").
Agora, diga que você não tem o substituto de plástico e explique "Se continuar jogando, ele quebrará!". Esse é um esboço , você forneceu um estado predefinido com antecedência.
Um manequim seria o garfo que ele nem usava ... e um Spy poderia ser algo como fornecer a mesma explicação que você já usou e que funcionou.
fonte
Eu acho que a diferença mais importante entre eles são suas intenções.
Deixe-me tentar explicá-lo no porquê stub vs. WHY mock
Suponha que eu esteja escrevendo um código de teste para o controlador de linha do tempo público do meu cliente do twitter do mac
Aqui está o código de amostra de teste
Ao escrever simulação, você descobre o relacionamento de colaboração dos objetos, verificando se as expectativas são atendidas, enquanto o stub simula apenas o comportamento do objeto.
Sugiro ler este artigo se você estiver tentando saber mais sobre zombarias: http://jmock.org/oopsla2004.pdf
fonte
Para ser muito claro e prático:
Stub: Uma classe ou objeto que implementa os métodos da classe / objeto a ser falsificado e retorna sempre o que você deseja.
Exemplo em JavaScript:
Mock: O mesmo do stub, mas adiciona alguma lógica que "verifica" quando um método é chamado, assim você pode ter certeza de que alguma implementação está chamando esse método.
Como o @mLevan diz, imagine como exemplo que você está testando uma classe de registro de usuário. Depois de chamar Salvar, ele deve chamar SendConfirmationEmail.
Um código muito estúpido Exemplo:
fonte
Este slide explica as principais diferenças muito boas.
* Da palestra CSE 403, 16, Universidade de Washington (slide criado por "Marty Stepp")
fonte
Gosto da explicação de Roy Osherove [link do vídeo] .
fonte
fonte
vamos ver Duplas de teste:
Stub : Stub é um objeto que contém dados predefinidos e os utiliza para atender chamadas durante os testes. Como : um objeto que precisa capturar alguns dados do banco de dados para responder a uma chamada de método.
Zombarias : zombarias são objetos que registram as chamadas que recebem. Na asserção de teste, podemos verificar no Mocks que todas as ações esperadas foram executadas. Como : uma funcionalidade que chama o serviço de envio de email. para mais, basta verificar isso .
fonte
Uma farsa é um termo genérico que pode ser usado para descrever um esboço ou um objeto simulado (manuscrito ou não), porque ambos se parecem com o objeto real.
Se uma farsa é um esboço ou uma farsa depende de como é usada no teste atual. Se for usado para verificar uma interação (afirmada), é um objeto simulado. Caso contrário, é um esboço.
O Fakes garante que o teste seja executado sem problemas. Isso significa que o leitor do seu teste futuro entenderá qual será o comportamento do objeto falso, sem precisar ler seu código-fonte (sem precisar depender de recursos externos).
O que significa o teste executado sem problemas?
Exemplo no código abaixo:
Você deseja testar o método mailService.SendEMail () , para fazer isso, você precisa simular uma exceção no método de teste, portanto, basta criar uma classe errorService do Fake Stub para simular esse resultado, para que seu código de teste seja capaz de testar método mailService.SendEMail (). Como você vê, você precisa simular um resultado que é de outra classe External Dependency ErrorService.
fonte
Desde o artigo Mock Roles, e não Objects , pelos desenvolvedores do jMock:
Portanto, as principais diferenças são:
Em resumo, ao mesmo tempo em que tenta dispersar a confusão do título do artigo de Fowler : zombarias são stubs, mas não são apenas stubs .
fonte
Eu estava lendo A arte do teste de unidade e me deparei com a seguinte definição:
fonte
Me deparei com este artigo interessante do UncleBob The Little Mocker . Ele explica toda a terminologia de uma maneira muito fácil de entender, por isso é útil para iniciantes. O artigo de Martin Fowlers é uma leitura difícil, especialmente para iniciantes como eu.
fonte
O Stub nos ajuda a executar o teste. Quão? Fornece valores que ajudam a executar o teste. Esses valores não são reais e criamos esses valores apenas para executar o teste. Por exemplo, criamos um HashMap para fornecer valores semelhantes aos valores na tabela do banco de dados. Então, em vez de interagir diretamente com o banco de dados, interagimos com o Hashmap.
Mock é um objeto falso que executa o teste. onde colocamos afirmar.
fonte
Veja abaixo o exemplo de zombarias versus stubs usando a estrutura C # e Moq. Moq não tem uma palavra-chave especial para Stub, mas você pode usar o objeto Mock para criar stubs também.
fonte
Ponto de vista de teste de Stub e Mock:
O Stub é uma implementação fictícia feita pelo usuário de maneira estática , ou seja, no Stub escrevendo o código de implementação. Portanto, ele não pode lidar com a definição de serviço e a condição dinâmica. Normalmente, isso é feito na estrutura JUnit sem usar a estrutura de simulação.
Mock também é uma implementação fictícia, mas sua implementação foi feita de maneira dinâmica usando estruturas de Mocking como o Mockito. Assim, podemos lidar com a definição de condição e serviço de maneira dinâmica, ou seja, simulações podem ser criadas dinamicamente a partir do código em tempo de execução. Portanto, usando o mock, podemos implementar Stubs dinamicamente.
fonte
Além de respostas úteis, um dos pontos mais poderosos do uso de Mocks do que Subs
Se o colaborador [do qual o código principal depende] não estiver sob nosso controle (por exemplo, de uma biblioteca de terceiros),
nesse caso, o stub é mais difícil de escrever do que simulado .
fonte
Eu usei exemplos de python na minha resposta para ilustrar as diferenças.
Stub - Stubbing é uma técnica de desenvolvimento de software usada para implementar métodos de classes no início do ciclo de vida do desenvolvimento. Eles são usados normalmente como espaços reservados para a implementação de uma interface conhecida, onde a interface é finalizada ou conhecida, mas a implementação ainda não é conhecida ou finalizada. Você começa com stubs, o que significa simplesmente que você apenas escreve a definição de uma função e deixa o código real para mais tarde. A vantagem é que você não esquecerá os métodos e poderá continuar pensando no seu design enquanto o vê no código. Você também pode fazer com que seu stub retorne uma resposta estática para que a resposta possa ser usada por outras partes do seu código imediatamente. Os objetos Stub fornecem uma resposta válida, mas é estática, não importa qual entrada você passe, você sempre terá a mesma resposta:
Objetos simulados são usados em casos de teste simulados e validam que certos métodos são chamados nesses objetos. Objetos simulados são objetos simulados que imitam o comportamento de objetos reais de maneira controlada. Você normalmente cria um objeto simulado para testar o comportamento de outro objeto. As zombarias permitem simular recursos indisponíveis ou muito pesados para testes de unidade.
mymodule.py:
test.py:
Este é um exemplo muito básico que apenas executa rm e afirma o parâmetro com o qual foi chamado. Você pode usar simulação com objetos, não apenas funções, como mostrado aqui, e também pode retornar um valor para que um objeto falso possa ser usado para substituir um stub para teste.
Mais sobre o unittest.mock , observe que o python 2.x mock não está incluído no unittest, mas é um módulo para download que pode ser baixado via pip (pip install mock).
Também li "The Art of Unit Testing", de Roy Osherove, e acho que seria ótimo se um livro semelhante fosse escrito usando exemplos de Python e Python. Se alguém souber desse livro, compartilhe. Felicidades :)
fonte
Um stub é um objeto falso criado para fins de teste. Um mock é um esboço que registra se as chamadas esperadas ocorreram efetivamente.
fonte
Um stub é uma função vazia que é usada para evitar exceções não tratadas durante os testes:
Uma simulação é uma função artificial usada para evitar dependências de SO, ambiente ou hardware durante os testes:
Em termos de afirmações e estado:
Referências
fonte
muitas respostas válidas por lá, mas acho que vale a pena mencionar este formulário tio bob: https://8thlight.com/blog/uncle-bob/2014/05/14/TheLittleMocker.html
a melhor explicação de todos os tempos!
fonte
Um mock é um objeto técnico e funcional .
A zombaria é técnica . É de fato criado por uma biblioteca de simulação (EasyMock, JMockit e mais recentemente Mockito são conhecidos por isso) graças à geração de código de bytes .
A implementação simulada é gerada de uma maneira em que poderíamos instrumentá- la para retornar um valor específico quando um método é chamado, mas também algumas outras coisas, como verificar se um método simulado foi chamado com alguns parâmetros específicos (verificação estrita) ou quaisquer que sejam os parâmetros ( nenhuma verificação rigorosa).
Instanciando uma simulação:
Gravando um comportamento:
Verificando uma chamada:
Claramente, essa não é a maneira natural de instanciar / substituir a classe / comportamento Foo. Por isso me refiro a um aspecto técnico.
Mas o mock também é funcional porque é uma instância da classe que precisamos isolar do SUT. E com comportamentos registrados, poderíamos usá-lo no SUT da mesma maneira que faria com um esboço.
O stub é apenas um objeto funcional : é uma instância da classe que precisamos isolar do SUT e isso é tudo. Isso significa que a classe de stub e todos os acessórios de comportamento necessários durante nossos testes de unidade devem ser definidos explicitamente.
Por exemplo, o stub
hello()
precisaria subclassificar aFoo
classe (ou implementar sua interface) e substituirhello()
:Se outro cenário de teste exigir outro retorno de valor, provavelmente precisaremos definir uma maneira genérica de definir o retorno:
Outro cenário: se eu tivesse um método de efeito colateral (sem retorno) e verificasse se esse método foi chamado, provavelmente deveria ter adicionado um booleano ou um contador na classe de stub para contar quantas vezes o método foi chamado.
Conclusão
Geralmente, o stub exige muita sobrecarga / código para escrever no seu teste de unidade. Que simulação evita graças ao fornecimento de recursos de gravação / verificação prontos para uso.
É por isso que hoje em dia, a abordagem de stub raramente é usada na prática com o advento de excelentes bibliotecas simuladas.
Sobre o artigo de Martin Fowler: Não acho que seja um programador "zombeteiro" enquanto uso zombarias e evito stubs.
Mas eu uso o mock quando é realmente necessário (dependências irritantes) e sou a favor dos testes de fatia e miniintegração quando testo uma classe com dependências cujo mock seria uma sobrecarga.
fonte