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.
C'est tout!
Il est intéressant d'entendre l'évaluation de la communauté sur l'utilité de ce service.