Привет, Хабр! Работая над библиотекой-обёрткой REST API, я столкнулся с проблемой. Для тестирования обработки ошибочных кодов ответа сервера (400, 500, 403 и т.д.) необходимо искусственно создавать условия на сервере для получения соответствующих кодов. При правильно настроенном сервере, например, непросто получить ошибку 500. А тестировать функции-обработчики ошибок как-то надо. Я написал небольшое API, которое генерирует ошибочные ответы сервера httpme.tk
Как применять в тестировании?
Например, есть такой код (python3):
from requests import session as requests_sessionsession = requests_session()session.hooks = { 'response': lambda r, *args, **kwargs: raise AccessError('Доступ закрыт, т.к. сервер подключен к другой БД') if r.status_code == 403 else pass}class AccessError(Exception): """ 'своя' ошибка """ passdef getter(url): return session.get(url)
Если кратко в коде есть функция, которая возвращает ответ
сервера на GET-запрос на заданный URL, если в результате выполнения
запроса возникает ошибка 403 вызывается внутреннее исключение
модуля AccessError
.
Этот код надо протестировать и отладить. Cоздать вручную условия для ошибки 403, а уж тем более, например, 500 (сервер слишком хорошо работает) довольно непросто. Тестировщику не важно, при каких условиях сервер выдаст ошибку 403: он тестирует не само API (например), а функцию, которая к нему обращается. Поэтому для тестирования вызова исключения при коде статуса 403 он может сделать вот так (python3 + pytest):
import pytestfrom mymodule import def test_forbidden(): with pytest.raises(AccessError): getter('http://httpme.tk/403')
Как пользоваться?
Очень просто. Отправьте на сервер GET-запрос в формате
http://httpme.tk/<status_code>
. Например так
(cURL):
curl -G http://httpme.tk/500
Или так (python3):
from requests import getget('http://httpme.tk/408') # <Response [408]>
А что внутри?
А внутри маленькое Flask-приложение, вызывающее
функцию abort(status_code)
на каждый запрос.
На этом всё!
Интересно услышать оценку полезности данного сервиса сообществом.