Como se menciona en la respuesta más votada, Martin Fowler analiza estas distinciones en Mocks An't Stubs , y en particular el subtítulo La diferencia entre simulacros y stubs , así que asegúrese de leer ese artículo.
En lugar de centrarnos en cómo estas cosas son diferentes, creo que es más esclarecedor centrarse en por qué estos son conceptos distintos. Cada uno existe para un propósito diferente.
Falsificaciones
Un falso es una implementación que se comporta "naturalmente", pero no es "real". Estos son conceptos confusos, por lo que diferentes personas tienen diferentes interpretaciones de lo que hace que las cosas sean falsas.
Un ejemplo de una falsificación es una base de datos en memoria (por ejemplo, usando sqlite con la :memory:
tienda). Nunca usaría esto para la producción (ya que los datos no son persistentes), pero es perfectamente adecuado como base de datos para usar en un entorno de prueba. También es mucho más ligero que una base de datos "real".
Como otro ejemplo, quizás use algún tipo de almacén de objetos (por ejemplo, Amazon S3) en producción, pero en una prueba simplemente puede guardar objetos en archivos en el disco; entonces su implementación de "guardar en disco" sería falsa. (O incluso podría simular la operación "guardar en disco" utilizando un sistema de archivos en memoria).
Como tercer ejemplo, imagine un objeto que proporciona una API de caché; un objeto que implementa la interfaz correcta pero que simplemente no realiza almacenamiento en caché pero siempre devuelve un error de caché sería una especie de falso.
El propósito de una falsificación no es afectar el comportamiento del sistema bajo prueba , sino más bien simplificar la implementación de la prueba (eliminando las dependencias innecesarias o pesadas).
Trozos
Un trozo es una implementación que se comporta "de forma no natural". Está preconfigurado (generalmente por la configuración de prueba) para responder a entradas específicas con salidas específicas.
El propósito de un código auxiliar es poner su sistema a prueba en un estado específico. Por ejemplo, si está escribiendo una prueba para algún código que interactúa con una API REST, puede desactivar la API REST con una API que siempre devuelve una respuesta fija, o que responde a una solicitud de API con un error específico. De esta manera, podría escribir pruebas que hagan afirmaciones sobre cómo reacciona el sistema a estos estados; por ejemplo, probando la respuesta que obtienen sus usuarios si la API devuelve un error 404.
Un trozo generalmente se implementa para responder solo a las interacciones exactas a las que le has dicho que responda. Pero la característica clave que hace que algo sea un trozo es su propósito : un trozo se trata de configurar su caso de prueba.
Simulacros
Un simulacro es similar a un código auxiliar, pero con la verificación agregada. El propósito de un simulacro es hacer afirmaciones sobre cómo su sistema bajo prueba interactúa con la dependencia .
Por ejemplo, si está escribiendo una prueba para un sistema que carga archivos en un sitio web, puede crear un simulacro que acepte un archivo y que pueda usar para afirmar que el archivo cargado es correcto. O, en una escala más pequeña, es común usar una simulación de un objeto para verificar que el sistema bajo prueba llama a métodos específicos del objeto simulado.
Los simulacros están vinculados a las pruebas de interacción , que es una metodología de prueba específica. Las personas que prefieren probar el estado del sistema en lugar de las interacciones del sistema usarán simulacros con moderación si es que lo hacen.
Prueba doble
Falsificaciones, talones y simulacros pertenecen a la categoría de dobles de prueba . Una prueba doble es cualquier objeto o sistema que usa en una prueba en lugar de otra cosa. La mayoría de las pruebas de software automatizadas implican el uso de dobles de prueba de algún tipo u otro. Algunos otros tipos de dobles prueba incluyen valores ficticios , espías , y de E / S de los agujeros negros .