Hallo Habr! Bei der Arbeit an einer REST-API-Wrapper-Bibliothek ist ein Problem aufgetreten. Um die Verarbeitung fehlerhafter Serverantwortcodes (400, 500, 403 usw.) zu testen, müssen auf dem Server künstlich Bedingungen erstellt werden, um die entsprechenden Codes zu empfangen. Bei einem ordnungsgemäß konfigurierten Server ist es beispielsweise nicht einfach, einen 500-Fehler zu erhalten. Es ist jedoch irgendwie erforderlich, die Fehlerbehandlungsfunktionen zu testen. Ich habe eine kleine API geschrieben, die fehlerhafte Serverantworten generiert - httpme.tk.
Wie bewerbe ich mich beim Testen?
Zum Beispiel gibt es Code wie diesen ( 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)
Kurz gesagt, der Code enthält eine Funktion, die eine Serverantwort auf eine GET-Anforderung für eine bestimmte URL zurückgibt. Wenn aufgrund der Anforderung ein 403-Fehler auftritt, wird eine interne Modulausnahme ausgelöst AccessError
.
Dieser Code muss getestet und debuggt werden. Es ist nicht einfach, die Bedingungen für Fehler 403 manuell zu erstellen, und noch mehr, zum Beispiel 500 (der Server funktioniert zu gut). Dem Tester ist es egal, unter welchen Bedingungen der Server einen 403-Fehler ausgibt: Er testet nicht die API selbst (zum Beispiel), sondern die Funktion, die ihn aufruft. Um zu testen, ob eine Ausnahme mit einem 403-Statuscode ausgelöst wird , können Sie Folgendes tun ( python3 + pytest ):
import pytest
from mymodule import
def test_forbidden():
with pytest.raises(AccessError):
getter('http://httpme.tk/403')
Wie benutzt man?
Sehr einfach. Senden Sie eine GET-Anfrage an den Server in http://httpme.tk/<status_code>
. Zum Beispiel so ( cURL ):
curl -G http://httpme.tk/500
Oder so ( python3 ):
from requests import get
get('http://httpme.tk/408') # <Response [408]>
Was ist drin?
Und im Inneren befindet sich eine kleine Flask- Anwendung, die abort(status_code)
bei jeder Anfrage eine Funktion aufruft .
Das ist alles!
Es ist interessant zu hören, wie die Community den Nutzen dieses Dienstes bewertet.