Diferencia entre simulacro y parche en Python
El desarrollo de código es lo primero en Test Parallel Development (TPD). Aún así, escribimos pruebas desarrolladas y las ejecutamos para verificar la precisión del código (en lugar de ejecutar el código directamente o usar la consola).
En Python, tenemos un proceso llamado prueba unitaria y dentro de eso están las funciones simulacro
y parche
. Este artículo discutirá los usos y las diferencias entre los dos roles.
Usos y diferencias entre las bibliotecas de objetos Mock
y Patch
en Python
En este artículo, no abordaremos las pruebas unitarias en su conjunto, sino que nos centraremos más en las funciones de simulacro
y parche
.
Usamos el paquete Python simulado
para reemplazar componentes específicos de su sistema bajo prueba con objetos simulados
y hacer afirmaciones sobre su uso. Es un componente de la biblioteca estándar de Python y es accesible a partir de Python 3.3 como unittest.mock
.
La clase unittest.mock
elimina la necesidad de varios stubs a lo largo de su conjunto de pruebas. Después de realizar una acción en particular, podemos establecer afirmaciones sobre los métodos/atributos que usamos y los argumentos que llamamos.
Nos permite especificar valores de retorno y seleccionar las características necesarias.
MagicDock puede manejar los objetos Magic
, una subclase de Mock
. Los objetos Mock
y MagicMock
generan espontáneamente características y métodos cuando los usamos y registramos información de uso.
Los simulacros se basan en el patrón acción -> afirmación
(es decir, primero deje que se use el simulacro
y luego haga afirmaciones sobre las llamadas que recibió) en lugar del patrón grabar -> reproducir
utilizado por muchos simulacros marcos Además, el módulo mock
ofrece un decorador llamado patch()
que se encarga de parchear las características de nivel de clase y módulo dentro del contexto de una prueba y un centinela para producir instancias únicas.
Código de ejemplo:
from unittest.mock import patch
@patch("sample_module.sample_object")
def test_function(mock_object):
print(mock_object)
Producción :
<MagicMock name='sample_object' id='1870192341512'>
El fragmento de código anterior es equivalente al siguiente fragmento:
def test_function():
with patch("sample_module.sample_module") as mock_object:
print(mock_object)
La función nos permite reemplazar cualquier objeto con un objeto mock
para evitar llamar al código de producción y comprobar cómo se llama al objeto original (si el objeto es una función). Se prefiere usar parche
(o métodos similares) porque esto asegura que el parche se revierta después de la prueba (o después del alcance del administrador de contexto en el segundo caso) para que otras pruebas o programas no se vean afectados.
Conclusión
Podemos tomar nota de lo siguiente para ayudarnos en nuestra toma de decisiones:
- Para sustituir convenientemente los objetos con objetos
simulados
(u otros objetos) y restaurar el estado anterior después de la finalización o, en caso de una excepción, utilizar la función de administrador de contexto/decoradorparche
. - El
mock.patch
crea objetosmock
o derivados, que podemos producir manualmente. Las compilaciones manuales solo se usan para reparar funciones locales u otros simulacros que no requieren reinicio.
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn