Diferencia entre simulacro y parche en Python

  1. Usos y diferencias entre las bibliotecas de objetos Mock y Patch en Python
  2. Conclusión
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:

  1. 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/decorador parche.
  2. El mock.patch crea objetos mock o derivados, que podemos producir manualmente. Las compilaciones manuales solo se usan para reparar funciones locales u otros simulacros que no requieren reinicio.
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

Artículo relacionado - Python Unittest