API pour générer des réponses de serveur avec tous les codes d'état

Bonjour, Habr! En travaillant sur une bibliothèque de wrapper d'API REST, j'ai rencontré un problème. Pour tester le traitement des codes de réponse de serveur erronés (400, 500, 403, etc.), il est nécessaire de créer artificiellement des conditions sur le serveur pour recevoir les codes correspondants. Avec un serveur correctement configuré, par exemple, il n'est pas facile d'obtenir une erreur 500. Et il est en quelque sorte nécessaire de tester les fonctions du gestionnaire d'erreurs. J'ai écrit une petite API qui génère des réponses de serveur erronées - httpme.tk



Comment postuler aux tests?



Par exemple, il existe un code comme celui-ci ( 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 bref, le code contient une fonction qui renvoie la réponse du serveur à une requête GET pour une URL donnée; si une erreur 403 se produit à la suite de la requête, une exception de module interne est déclenchée AccessError.



Ce code doit être testé et débogué. Il n'est pas facile de créer manuellement les conditions de l'erreur 403, et plus encore, par exemple 500 (le serveur fonctionne trop bien). Le testeur ne se soucie pas des conditions dans lesquelles le serveur émettra une erreur 403: il ne teste pas l'API elle-même (par exemple), mais la fonction qui l'appelle. Par conséquent, pour tester la levée d'une exception avec un code d'état 403, il peut faire comme ceci ( python3 + pytest ):



import pytest
from mymodule import 

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


Comment utiliser?



Très simple. Envoyez une requête GET au serveur dans http://httpme.tk/<status_code>. Par exemple comme ceci ( cURL ):



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


Ou comme ça ( python3 ):



from requests import get

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


Qu'est-ce qu'il y a à l'intérieur?



Et à l'intérieur se trouve une petite application Flask qui appelle une fonction abort(status_code)à chaque demande.



Lien vers GitHub



C'est tout!



Il est intéressant d'entendre l'évaluation de la communauté sur l'utilité de ce service.




All Articles