O que é um “Stub”?

116

Então, continuando com a minha resolução de ano novo de entrar mais no TDD, agora estou começando a trabalhar mais com Rhino Mocks .

Uma coisa que estou ansioso para fazer é ter certeza de que realmente groco no que estou entrando, então eu queria verificar meu entendimento do que vi até agora (e pensei que seria bom trazer isso aqui como um recurso).

O que é um "Stub"?

Rob Cooper
fonte
6
primeiro você faz uma pergunta e depois dá a resposta?
empi de
17
Conforme declarado na pergunta - estou procurando a verificação de que meu entendimento está correto, eu queria que a resposta estivesse aqui (seja minha ou não) para fornecer um recurso sobre esta pergunta muito perguntada, mas raramente bem respondida: )
Rob Cooper de
42
Também responder às próprias perguntas é indicado no FAQ como uma forma válida de usar o site - deve ser encorajado, na verdade.
Erik Forbes de
Não há problema em responder às suas próprias perguntas, embora a pergunta em si tenha um pouco de barulho (autobiografia) e não mostre nenhum esforço para encontrar uma resposta, nenhuma inclinação para o que a pessoa fez para tentar encontrar a resposta.
Eric,

Respostas:

112

Martin Fowler escreveu um excelente artigo sobre esse assunto. Desse artigo:

Meszaros usa o termo Teste Duplo como o termo genérico para qualquer tipo de objeto falso usado no lugar de um objeto real para fins de teste. O nome vem da noção de um dublê nos filmes. (Um de seus objetivos era evitar o uso de qualquer nome que já fosse amplamente utilizado.) Meszaros então definiu quatro tipos específicos de duplo:

  • Objetos fictícios são passados, mas nunca realmente usados. Normalmente, eles são usados ​​apenas para preencher listas de parâmetros.
  • Objetos falsos, na verdade, têm implementações funcionais, mas geralmente usam algum atalho que os torna inadequados para produção (um banco de dados na memória é um bom exemplo).
  • Os stubs fornecem respostas automáticas para chamadas feitas durante o teste, geralmente sem responder a nada fora do que está programado para o teste. Os stubs também podem registrar informações sobre chamadas, como um stub de gateway de e-mail que lembra as mensagens que "enviou" ou talvez apenas quantas mensagens "enviou".
  • Mocks é o que estamos falando aqui: objetos pré-programados com expectativas que formam uma especificação das chamadas que eles devem receber.

Para colocar em minhas próprias palavras: os objetos simulados "esperam" que certos métodos sejam chamados neles e normalmente fazem com que um teste de unidade falhe se suas expectativas não forem atendidas. Objetos stub fornecem respostas prontas (e podem ser gerados automaticamente por bibliotecas auxiliares), mas normalmente não causam diretamente a falha do teste de unidade. Eles são normalmente usados ​​apenas para que o objeto que você está testando obtenha os dados de que precisa para fazer seu trabalho.

Ross
fonte
2
Então qual é a diferença entre objetos falsos e sutbs? Como você afirmou, eles têm a mesma função de serem implementados, não é?
LKM
4
@LKM um objeto falso é um objeto real que implementa funcionalidades reais e faz coisas. Stubs são apenas "respostas prontas", por exemplo. Resultados JSON embutidos em código que imitam o que seria retornado do servidor da web.
user3344977
31

Um "esboço" é uma implementação de uma interface que existe para fornecer dados / uma resposta de algum tipo. Por exemplo:

  • um DataSet
  • lista de usuários
  • um arquivo xml

Normalmente, isso seria fornecido por outro serviço (seja um serviço da Web, outro aplicativo, um banco de dados), mas para melhorar a testabilidade do código, os resultados são "falsos".

Um grande benefício disso é que permite que as afirmações sejam feitas em testes de unidade com base nos dados esperados. Se ocorrerem erros devido a erros de dados, os testes podem ser facilmente adicionados, um novo stub criado (replicando o erro de dados) e o código produzido para corrigir o erro.

Stubs diferem de Mocks porque são usados ​​para representar e testar o estado de um objeto, enquanto um Mock testa sua interação .

Rob Cooper
fonte
obrigado pela sua resposta, mas ainda não entendi: "uma implementação de uma interface" ??
BKSpurgeon
6

Eu acredito que "stub" vem de STartUpBlock. é usado para se referir a partes do código que são geradas automaticamente para ajudar você, o desenvolvedor, a começar.

Kris
fonte
1
Não acho que isso seja correto. Provavelmente vem desta prática na construção de casas: hunker.com/12000314/what-is-a-stub-out
mattdm
3

Um "stub" ou "método stub" é projetado para ser um código inicial ou um substituto temporário para o código ainda a ser desenvolvido. É um código integrado gerado por um IDE. Os métodos stub são, na verdade, métodos usados ​​para testar métodos de uma classe específica. Ele é usado inserindo alguns valores para as variáveis ​​locais em seus métodos de desenvolvimento reais e verifique se a saída está correta. É importante para encontrar bugs em seu código.

Nasserr
fonte
Essa resposta seria melhor se explicada com mais detalhes: qual é o propósito de um método stub? como isso é usado? por que isso é importante?
Evan Weissburg
Obrigado! Sou novo em programação e comecei a aprender sobre desenvolvimento de software. Até agora, isso é o que entendi sobre métodos de stub. Portanto, não tenho certeza de qual é o seu propósito, importância e como é usado. Mas acho que os métodos de stub são, na verdade, métodos usados ​​para testar métodos de uma classe específica. Ele é usado inserindo alguns valores para as variáveis ​​locais em seus métodos de desenvolvimento reais e verifique se a saída está correta. É importante encontrar bugs em seus códigos. Se você tem algo a acrescentar ou corrigir, por favor, comente. No momento, estou aprendendo sobre testes.
Nasserr
1
É ótimo que você esteja aprendendo! Você deve editar sua resposta original para que futuros leitores possam aprender facilmente com ela, em vez de postar nos comentários. Além disso - se você não tem certeza sobre algo, por que está postando uma resposta confiável a respeito?
Evan Weissburg
1
Isso é bom se você é um autodidata - no StackOverflow, você não precisa postar respostas a menos que tenha certeza sobre elas. Este não é um fórum padrão. Consulte: stackoverflow.com/tour
Evan Weissburg
1
Muito obrigado pelos guias e sugestões. Realmente aprecio isso!
Nasserr
3

Enfrentei a questão recentemente e reconheci que esta comparação entre Stub e Driver é realmente clara e útil:

Basicamente, stubs e drivers são rotinas que não fazem nada, exceto se declarar e os parâmetros que aceitam. O restante do código pode então pegar esses parâmetros e usá-los como entradas.

+ --------- + ------------------------------- + ------- ------------------------ +
| | Stub | Driver |
+ --------- + ------------------------------- + ------- ------------------------ +
| Tipo | Códigos fictícios | Códigos fictícios |
+ --------- + ------------------------------- + ------- ------------------------ +
| Usado em | Integração de cima para baixo | Integração Bottom Up |
+ --------- + ------------------------------- + ------- ------------------------ +
| Objetivo | Para permitir o teste da parte superior | Para permitir o teste do inferior |
| | níveis do código, quando o | níveis do código, quando o |
| | níveis mais baixos do código são | os níveis superiores do código são |
| | ainda não desenvolvido. | ainda não desenvolvido. |
+ --------- + ------------------------------- + ------- ------------------------ +
| Exemplo | A e B são componentes. | A e B são componentes. |
| | A ---> B | A ---> B |
| | | |
| | A foi desenvolvido. | Um ainda precisa ser desenvolvido.
| | B ainda precisa ser desenvolvido. B foi desenvolvido. |
| | Portanto, o stub é usado | Portanto, o driver é usado |
| | no lugar de B para imitá-lo. | no lugar de A para imitá-lo |
| | | |
| | A ---> Stub | Driver ---> B |
+ --------- + ------------------------------- + ------- ------------------------ +

Da diferença entre stub e driver

Vahid Hallaji
fonte
0

Depois de alguma pesquisa e com base em arquivos stub que enfrentei durante minha vida de codificador, eu diria que um arquivo stub é apenas um arquivo que contém uma parte ou parte da implementação de um arquivo. Ajuda os desenvolvedores a começar a programar.

Deric Lima
fonte