24Jun

Cómo evitar llamadas HTTP en las pruebas unitarias

Muchas veces en nuestras pruebas unitarias (o tests unitarios) tenemos que realizar llamadas a otras API, es posible que estas API sean nuestras o de terceros, pero lo que queremos comprobar no es si la API se comporta correctamente si no cómo se reacciona nuestro sistema a sus respuestas.

No es necesario realizar siempre la misma llamada, o al menos no, si no cambia esa API de un tercero, para poder comprobar nuestro sistema.

La librería VCRpy

La librería VCRpy está creada con el objetivo de evitar realizar llamadas que no necesitamos en nuestras pruebas unitarias

Instalando la librería

Para instalar la librería usando PIP, solo tenemos que ejecutar:

sudo pip install vcrpy

Nuestra prueba con la llamada a una API externa

En el siguiente código tenemos nuestra prueba unitaria con una llamada a una API externa para registrar un cliente nuevo con el correo electrónico:

import os
import requests
import unittest

class TestCustomerAPI(unittest.TestCase):
    def test_update_customer_remote(self):
        rv = requests.post(os.getenv("API") + "/update",
                           {"email":"sample@g.com", "id":123})
        self.assertEquals(200, rv.status_code)

Cada vez que ejecutemos el test, realizará una llamada real a la API externa y actualizará el correo electrónico del usuario 123

Para que solo hagamos una llamada a la API y VCRpy guarda esa interacción con la API y la pueda reproducir en un futuro, solo añadimos el decorador en la prueba unitaria.

import os
import requests
import unittest

class TestCustomerAPI(unittest.TestCase):
    @vcr.use_cassette('fixtures/cassettes/customer_update.yml')
    def test_update_customer_remote(self):
        rv = requests.post(os.getenv("API") + "/update",
                           {"email":"sample@g.com", "id":123})
        self.assertEquals(200, rv.status_code)

Cuando ejecutemos el test una primera vez, generará el archivo YML en la ruta especificada en el decorador. En posteriores ejecuciones, usará ese archivo para simular la llamada a la API y devolviendo exactamente la misma respuesta que en el registro del resultado.

Conclusión

Simulando y guardando las interacciones HTTP con VCRpy nos permite ejecutar las pruebas unitarias mucho más rápidamente y no depender de que la API este o no disponible en un momento especifico en el tiempo o incluso trabajar offline con la API de la que ya conocemos las respuestas a nuestras peticiones HTTP

Leave a comment