¿Qué es un "Stub"?

116

Entonces, continuando con mi resolución de año nuevo para entrar más en TDD, ahora estoy comenzando a trabajar más con Rhino Mocks .

Una cosa que estoy dispuesto a hacer es asegurarme de que realmente asimilo lo que estoy haciendo, así que quería comprobar mi comprensión de lo que he visto hasta ahora (y pensé que sería bueno publicarlo aquí como un recurso).

¿Qué es un "Stub"?

Rob Cooper
fuente
6
¿Primero haces una pregunta y luego das la respuesta?
empi
17
Como se indica en la pregunta, estoy buscando la verificación de que mi comprensión es correcta, quería que la respuesta estuviera aquí (ya sea mía o no) para proporcionar un recurso sobre esta pregunta muy solicitada pero rara vez bien respondida: )
Rob Cooper
42
También responder a la propia pregunta se indica en las Preguntas frecuentes como una forma válida de usar el sitio; de hecho, debe alentarse.
Erik Forbes
Está bien responder a sus propias preguntas, aunque la pregunta en sí tiene demasiado ruido (autobiografía) y no muestra ningún esfuerzo por encontrar una respuesta, ninguna inclinación por lo que la persona ha hecho para tratar de encontrar la respuesta.
Eric

Respuestas:

112

Martin Fowler escribió un excelente artículo sobre este tema. De ese artículo:

Meszaros usa el término Test Double como el término genérico para cualquier tipo de objeto ficticio usado en lugar de un objeto real para propósitos de prueba. El nombre proviene de la noción de Stunt Double en las películas. (Uno de sus objetivos era evitar el uso de cualquier nombre que ya se usaba ampliamente). Meszaros luego definió cuatro tipos particulares de dobles:

  • Los objetos ficticios se pasan de un lado a otro, pero nunca se utilizan. Por lo general, solo se utilizan para completar listas de parámetros.
  • Los objetos falsos en realidad tienen implementaciones funcionales, pero generalmente toman algún atajo que los hace no adecuados para la producción (una base de datos en memoria es un buen ejemplo).
  • Los stubs brindan respuestas almacenadas a las llamadas realizadas durante la prueba, por lo general, no responden en absoluto a nada fuera de lo programado para la prueba. Los talones también pueden registrar información sobre las llamadas, como un talón de la puerta de enlace de correo electrónico que recuerda los mensajes que 'envió', o tal vez solo la cantidad de mensajes que 'envió'.
  • Las simulaciones son de lo que estamos hablando aquí: objetos preprogramados con expectativas que forman una especificación de las llamadas que se espera que reciban.

Para decirlo con mis propias palabras: los objetos simulados "esperan" que se invoquen ciertos métodos y, por lo general, hacen que una prueba unitaria falle si no se cumplen sus expectativas. Los objetos stub proporcionan respuestas predefinidas (y las bibliotecas auxiliares pueden generarlas automáticamente), pero normalmente no provocan directamente que falle la prueba unitaria. Por lo general, solo se usan para que el objeto que está probando obtenga los datos que necesita para hacer su trabajo.

Ross
fuente
2
Entonces, ¿cuál es la diferencia entre los objetos falsos y los sutbs? Como dijiste, tienen el mismo rol que implementar, ¿no?
LKM
4
@LKM un objeto falso es un objeto real que implementa una funcionalidad real y hace cosas. Los stubs son solo "respuestas enlatadas", por ejemplo. Resultados JSON codificados que imitan lo que se devolvería desde el servidor web.
user3344977
31

Un "stub" es una implementación de una interfaz que existe para proporcionar datos / una respuesta de algún tipo. Por ejemplo:

  • un conjunto de datos
  • lista de usuarios
  • un archivo XML

Normalmente, esto lo proporcionaría otro servicio (ya sea un servicio web, otra aplicación, una base de datos), pero para mejorar la capacidad de prueba del código, los resultados son "falsos".

Un beneficio importante de esto es que permite hacer afirmaciones en pruebas unitarias basadas en los datos esperados. Si surgen errores debido a errores de datos, entonces se pueden agregar pruebas fácilmente, crear un nuevo stub (replicando el error de datos) y producir un código para corregir el error.

Los stubs se diferencian de los Mocks en que se utilizan para representar y probar el estado de un objeto, mientras que un Mock prueba su interacción .

Rob Cooper
fuente
gracias por tu respuesta, pero sigo sin entender: "una implementación de una interfaz" ??
BKSpurgeon
6

Creo que "stub" proviene de STartUpBlock. se utiliza para referirse a partes del código que se generan automáticamente para ayudarlo a usted, el desarrollador, a comenzar.

Kris
fuente
1
No creo que esto sea correcto. Probablemente proviene de esta práctica en la construcción de viviendas: hunker.com/12000314/what-is-a-stub-out
mattdm
3

Un "stub" o "método stub" está diseñado para ser un código de inicio o un sustituto temporal de un código aún por desarrollar. Es un código integrado generado por un IDE. Los métodos stub son en realidad métodos utilizados para probar métodos de una clase en particular. Se usa ingresando algunos valores para las variables locales en sus métodos de desarrollo reales y verificando si la salida es correcta. Es importante para encontrar errores en su código.

Nasserr
fuente
Esta respuesta sería mejor si se explicara con más detalle: ¿cuál es el propósito de un método stub? ¿Cómo se usa? ¿Por qué es importante?
Evan Weissburg
¡Gracias! Soy nuevo en programación y recién comencé a aprender sobre desarrollo de software. Hasta ahora, esto es lo que entiendo sobre los métodos stub. Así que no estoy realmente seguro de cuál es su propósito, importancia y cómo se usa. Pero creo que los métodos stub son en realidad métodos utilizados para probar métodos de una clase en particular. Se usa ingresando algunos valores para las variables locales en sus métodos de desarrollo reales y verificando si la salida es correcta. Es importante encontrar errores en sus códigos. Si tiene algo más que agregar o corregir, por favor comente. Actualmente estoy aprendiendo sobre pruebas.
Nasserr
1
¡Es genial que estés aprendiendo! Debes editar tu respuesta original para que los futuros lectores puedan aprender fácilmente de ella en lugar de publicar en los comentarios. Además, si no está seguro de algo, ¿por qué está publicando una respuesta autorizada al respecto?
Evan Weissburg
1
Eso está bien si eres un autodidacta: en StackOverflow, no necesitas publicar respuestas a menos que estés seguro de ellas. Este no es un foro estándar. Ver: stackoverflow.com/tour
Evan Weissburg
1
Muchas gracias por las guías y sugerencias. ¡Realmente lo aprecio!
Nasserr
3

Me enfrenté a la pregunta recientemente y reconocí que esta comparación entre Stub y Driver es realmente clara y útil:

Básicamente, los stubs y los controladores son rutinas que en realidad no hacen nada más que declararse a sí mismos y los parámetros que aceptan. El resto del código puede tomar estos parámetros y usarlos como entradas.

+ --------- + ------------------------------- + ------- ------------------------ +
| | Stub | Conductor |
+ --------- + ------------------------------- + ------- ------------------------ +
| Tipo | Códigos ficticios | Códigos ficticios |
+ --------- + ------------------------------- + ------- ------------------------ +
| Usado en | Integración de arriba hacia abajo | Integración de abajo hacia arriba |
+ --------- + ------------------------------- + ------- ------------------------ +
| Propósito | Para permitir la prueba de la parte superior | Para permitir la prueba de la parte inferior |
| | niveles del código, cuando el | niveles del código, cuando el |
| | los niveles inferiores del código son | los niveles superiores del código son |
| | aún no desarrollado. | aún no desarrollado. |
+ --------- + ------------------------------- + ------- ------------------------ +
| Ejemplo | A y B son componentes. | A y B son componentes. |
| | A ---> B | A ---> B |
| | | |
| | Se ha desarrollado A. | Aún queda por desarrollar.
| | B aún debe desarrollarse. B ha sido desarrollado. |
| | Por lo tanto, se utiliza stub | Por lo tanto, se utiliza el controlador |
| | en lugar de B para imitarlo. | en lugar de A para imitarlo |
| | | |
| | A ---> Stub | Conductor ---> B |
+ --------- + ------------------------------- + ------- ------------------------ +

De la diferencia entre Stub y Driver

Vahid Hallaji
fuente
0

Después de investigar un poco y basándome en los archivos de código auxiliar que enfrenté durante mi vida como codificador, diría que un archivo de código auxiliar es solo un archivo que contiene una parte o una parte de la implementación de un archivo. Ayuda a los desarrolladores a comenzar a codificar.

Deric Lima
fuente