Unit tests y Mock en Python: Introducción

En Solid GEAR, no entendemos desarrollar sin crear unit tests. Son esenciales para satisfacer que la nueva funcionalidad funcionará como se espera y no hemos modificado la ya implementada.

TDD (Test-Driven Development) es parte de nuestra filosofía a la hora de desarrollar. En pocas palabras, consiste en pensar una tormenta de tests, implementarlos y escribir el código necesario para satisfacer que todos los tests funcionan. Llevando a cabo esta metodología, obtenemos un código simple, con la mínima cantidad de líneas de código posible, yevitando muchos posbiles bugs. Como podéis ver, grandes ventajas.

PROBLEMAS CREANDO TESTS

A veces, cuando empezamos a crear los tests, nos damos cuenta de que no tenemos suficiente datos en la base de datos, o es muy díficil introducir las condiciones necesarias para seguir con el test, o incluso, sólo necesitamos saber que un método ha llegado a ser llamado. Por lo que empezamos a desear tener la posibilidad de simular datos o simplemente asumir que un método ha sido llamado.

¿Es posible que estos deseos de simular partes de código en Python se vean cumplidos? Sí, es posible con mock, una librería de Python diseñada para testing.

Hay muchas formas de usar esta librería, pero sólo explicaré una en este artículo: cómo usar el método patch como decorator; en concreto, la alternativa de patch.object.

¿CÓMO PODEMOS USAR ESTA LIBRERÍA?

Obviamente, el primer paso es instalarla.

pip install mock

En segundo lugar, importar el método patch de la librería mock al fichero fuente.

from mock import patch

Y finalmente, incluir el método importado encima de la definición del método como decorador. Dicho decorador lo que hace es reemplazar el objeto con otro de simulación al principio de la ejecución del test, y restaurarlo cuando el test haya acabado.

@patch.object(SomeClass, “some_class_method”)
def test_a (mock_class_method):

En este ejemplo, el método some_class_method de SomeClass será reemplazado por el objecto de simulación dado como parámetro: mock_class_method.

Puedes parchear múltiple métodos u objetos, sólo necesitas anidar tantos decoradores patch como quieras y pasar los objetos mock (de simulación) en el mismo orden en el que están aplicados en la función decorada. Es decir, los métodos decorados más cercanos a la definición del método a decorar, van primeros. Un ejemplo de simular 2 métodos de diferentes clases puede ser:

@patch.object(SomeClassA, “some_class_a_method”)
@patch.object(SomeClassB, “some_class_b_method”)
def test_b (mock_class_b_method, mock_class_a_method):

¿QUÉ SE PUEDE HACER CON ESTA LIBRERÍA?

Básicamente reemplazar algunas partes de código para:

  • Devolver siempre los mismos valores.
  • No ejecutar métodos pero asegurar que han sido llamados.
  • Llevar a cabo side effects, incluyendo el lanzamiento de excepciones.

Explicaré estos casos en posteriores artículos, pero si eres impaciente y necesitas aprender más, echa un vistazo a la documentación de la librería mock.

1 comentario en «Unit tests y Mock en Python: Introducción»

Deja un comentario

¿Necesitas una estimación?

Calcula ahora