API para generar respuestas del servidor con cualquier código de estado

¡Hola, Habr! Mientras trabajaba en una biblioteca contenedora de API REST, encontré un problema. Para probar el procesamiento de códigos de respuesta de servidor erróneos (400, 500, 403, etc.), es necesario crear condiciones en el servidor de forma artificial para recibir los códigos correspondientes. Con un servidor configurado correctamente, por ejemplo, no es fácil obtener un error 500. Y de alguna manera es necesario probar las funciones del controlador de errores. Escribí una pequeña API que genera respuestas de servidor erróneas: httpme.tk



¿Cómo aplicar en las pruebas?



Por ejemplo, hay un código como este ( python3 ):



from requests import session as requests_session

session = requests_session()
session.hooks = {
    'response': lambda r, *args, **kwargs: raise AccessError(' , ..     ') if r.status_code == 403  else pass
}

class AccessError(Exception):
    """ ''  """
    pass

def getter(url):
    return session.get(url)


En resumen, hay una función en el código que devuelve la respuesta del servidor a una solicitud GET para una URL determinada, si se produce un error 403 como resultado de la solicitud, se genera una excepción de módulo interno AccessError.



Este código debe probarse y depurarse. No es fácil crear manualmente las condiciones para el error 403, y más aún, por ejemplo, 500 (el servidor funciona demasiado bien). Al probador no le importa en qué condiciones el servidor emitirá un error 403: no está probando la API en sí (por ejemplo), sino la función que la llama. Entonces, para probar el lanzamiento de una excepción con un código de estado 403, puede hacer lo siguiente ( python3 + pytest ):



import pytest
from mymodule import 

def test_forbidden():
    with pytest.raises(AccessError):
        getter('http://httpme.tk/403')


¿Cómo utilizar?



Muy simple. Envíe una solicitud GET al servidor en formato http://httpme.tk/<status_code>. Por ejemplo así ( cURL ):



curl -G http://httpme.tk/500


O así ( python3 ):



from requests import get

get('http://httpme.tk/408')  # <Response [408]>


¿Qué hay adentro?



Y dentro hay una pequeña aplicación Flask que llama a una función abort(status_code)en cada solicitud.



Enlace a GitHub



¡Eso es todo!



Es interesante escuchar la valoración de la comunidad sobre la utilidad de este servicio.




All Articles