Тестирование WSGI-приложений
Клиент для тестирования
Werkzeug предоставляет Client для имитации запросов к WSGI-приложению без запуска сервера. Клиент имеет методы для отправки различных типов запросов, а также управления куками между запросами.
>>> from werkzeug.test import Client
>>> from werkzeug.testapp import test_app
>>> c = Client(test_app)
>>> response = c.get("/")
>>> response.status_code
200
>>> response.headers
Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '5211')])
>>> response.get_data(as_text=True)
'<!doctype html>...'
Методы запроса клиента возвращают экземпляры TestResponse. Это предоставляет дополнительные атрибуты и методы по сравнению с Response, полезные для тестирования.
Тело запроса
Передавая словарь в data, клиент создаст тело запроса с данными файлов и форм. Он установит тип содержимого в application/x-www-form-urlencoded если нет файлов, или в multipart/form-data если они есть.
import io
response = client.post(data={
"name": "test",
"file": (BytesIO("file contents".encode("utf8")), "test.txt")
})
Передайте строку, байты или объект, подобный файлу, в data для использования в качестве тела запроса. В этом случае вы должны соответствующим образом установить тип содержимого. Например, для отправки YAML:
response = client.post(
data="a: value\nb: 1\n", content_type="application/yaml"
)
Для тестирования JSON-API существует сокращение: передайте словарь в json вместо использования data. Это автоматически вызовет json.dumps() и установит тип содержимого в application/json. Кроме того, если приложение возвращает JSON, response.json автоматически вызовет json.loads().
response = client.post("/api", json={"a": "value", "b": 1})
obj = response.json()
Построитель окружения
EnvironBuilder используется для создания словаря WSGI-окружения. Клиент для тестирования использует его в своих запросах внутренне. Аргументы, передаваемые методам запроса клиента, аналогичны аргументам создателя.
Иногда бывает полезно вручную создать WSGI-окружение. Создатель среды или словарь могут быть переданы методам запроса клиента вместо других аргументов для использования пользовательского окружения.
from werkzeug.test import EnvironBuilder builder = EnvironBuilder(...) # build an environ dict environ = builder.get_environ() # build an environ dict wrapped in a request request = builder.get_request()
Ответы клиента для тестирования предоставляют доступ к этому через TestResponse.request и response.request.environ.
API
-
class werkzeug.test.Client(application, response_wrapper=None, use_cookies=True, allow_subdomain_redirects=False)
-
Эмулировать отправку запросов к приложению WSGI без запуска сервера WSGI или HTTP.
- Параметры:
-
- application (WSGIApplication) – Приложение WSGI, к которому будут отправляться запросы.
-
response_wrapper (тип[Response] | None) – Класс
Responseдля обертывания данных ответа. По умолчаниюTestResponse. Если это не подклассTestResponse, будет создан подкласс. -
use_cookies (bool) – Сохранять куки из заголовков ответа
Set-Cookieв заголовокCookieпоследующих запросов. Поддерживается соответствие по домену и пути, но другие параметры куки игнорируются. - allow_subdomain_redirects (bool) – Разрешить запросам следовать перенаправлениям на поддомены. Включите, если приложение обрабатывает поддомены и перенаправления между ними.
Журнал изменений
Изменено в версии 2.3: Упрощение реализации куки, поддержка соответствия по домену и пути.
Изменено в версии 2.1: Все данные доступны в качестве свойств объекта возвращенного ответа. Ответ не может быть возвращен в виде кортежа.
Изменено в версии 2.0:
response_wrapperвсегда является подклассом :class:TestResponse.Изменено в версии 0.5: Добавлен параметр
use_cookies.-
get_cookie(key, domain='localhost', path='/') -
Возвращает
Cookie, если он существует. Куки уникально идентифицируются по(domain, path, key).- Параметры:
- Тип возвращаемого значения:
-
Cookie | None
Журнал изменений
Новое в версии 2.3.
-
set_cookie(key, value='', *, domain='localhost', origin_only=True, path='/', **kwargs) -
Устанавливает куки для отправки в последующих запросах.
Это удобство для пропуска тестирования маршрута, который устанавливает куки. Чтобы протестировать куки, сделайте запрос к маршруту, использующему значение куки.
Клиент использует
domain,origin_only, иpathдля определения куки, которые нужно отправить с запросом. Он не использует другие параметры куки, используемые браузерами, так как они не применимы в тестах.- Параметры:
-
- key (str) – Ключевая часть куки.
- value (str) – Значение части куки.
-
domain (str) – Отправить куки с запросами, соответствующими этому домену. Если
origin_onlyистинно, то должно быть точное соответствие, в противном случае это может быть соответствие по суффиксу. - origin_only (bool) – Требуется ли точное соответствие домена запросу.
- path (str) – Отправить куки с запросами, соответствующими этому пути (точно или как префикс).
-
kwargs (Any) – Передается в
dump_cookie().
- Тип возвращаемого значения:
-
None
Изменено в версии 3.0: Параметр
server_nameудален. Первый параметр —key. Используйте параметрыdomainиorigin_onlyвместо этого.Журнал изменений
Изменено в версии 2.3: Добавлен параметр
origin_only.Изменено в версии 2.3: Параметр
domainимеет значение по умолчаниюlocalhost.
-
delete_cookie(key, *, domain='localhost', path='/') -
Удаляет куки, если она существует. Куки уникально идентифицируются по
(domain, path, key).- Параметры:
- Тип возвращаемого значения:
-
None
Изменено в версии 3.0: Параметр
server_nameудален. Первый параметр —key. Используйте параметрdomainвместо этого.Изменено в версии 3.0: Параметры
secure,httponlyиsamesiteудалены.Журнал изменений
Изменено в версии 2.3: Параметр
domainимеет значение по умолчаниюlocalhost.
-
open(*args, buffered=False, follow_redirects=False, **kwargs) -
Генерирует словарь environ из заданных аргументов, отправляет запрос к приложению и возвращает ответ.
- Параметры:
-
-
args (Any) – Передается в
EnvironBuilderдля создания environ для запроса. Если передан один аргумент, это может быть существующийEnvironBuilderили словарь environ. -
buffered (bool) – Преобразовать итератор, возвращенный приложением, в список. Если у итератора есть метод
close(), он вызывается автоматически. -
follow_redirects (bool) – Сделать дополнительные запросы для следования HTTP-перенаправлениям, пока не будет возвращен статус, не являющийся перенаправлением.
TestResponse.historyсодержит промежуточные ответы. - kwargs (Any) –
-
args (Any) – Передается в
- Тип возвращаемого значения:
Журнал изменений
Изменено в версии 2.1: Удален параметр
as_tuple.Изменено в версии 2.0: Поток ввода запроса закрывается при вызове
response.close(). Потоки ввода для перенаправлений автоматически закрываются.Изменено в версии 0.5: Если в словаре для параметра
dataпередан словарь в качестве файла, тип контента должен быть вызванcontent_typeвместоmimetype. Это изменение сделано для согласованности сwerkzeug.FileWrapper.Изменено в версии 0.5: Добавлен параметр
follow_redirects.
-
get(*args, **kw) -
Вызов
open()сmethodустановленным в значениеGET.- Параметры:
- Тип возвращаемого значения:
-
post(*args, **kw) -
Вызов
open()сmethodустановленным в значениеPOST.- Параметры:
- Тип возвращаемого значения:
-
put(*args, **kw) -
Вызов
open()сmethodустановленным в значениеPUT.- Параметры:
- Тип возвращаемого значения:
-
delete(*args, **kw) -
Вызов
open()сmethodустановленным в значениеDELETE.- Параметры:
- Тип возвращаемого значения:
-
patch(*args, **kw) -
Вызов
open()сmethodустановленным в значениеPATCH.- Параметры:
- Тип возвращаемого значения:
-
options(*args, **kw) -
Вызов
open()сmethodустановленным в значениеOPTIONS.- Параметры:
- Тип возвращаемого значения:
-
head(*args, **kw) -
Вызов
open()сmethodустановленным в значениеHEAD.- Параметры:
- Тип возвращаемого значения:
-
trace(*args, **kw) -
Вызов
open()сmethodустановленным в значениеTRACE.- Параметры:
- Тип возвращаемого значения:
-
-
class werkzeug.test.TestResponse(response, status, headers, request, history=(), **kwargs) -
Responseподкласс, предоставляющий дополнительную информацию о запросах, выполненных с помощью тестовогоClient.Запросы тестового клиента всегда возвращают экземпляр этого класса. Если для клиента задан пользовательский класс ответа, он также наследуется вместе с этим классом для поддержки тестовой информации.
Если тестовый запрос включал большие файлы или приложение обслуживает файл, вызовите
close()для закрытия всех открытых файлов и предотвращения отображения Python сообщения об ошибкеResourceWarning.Изменения
Изменено в версии 2.2: Установлено значение
default_mimetypeв None для предотвращения предположения mimetype при его отсутствии.Изменено в версии 2.1: Экземпляры Response нельзя рассматривать как кортежи.
Добавлена в версии 2.0: Методы тестового клиента всегда возвращают экземпляры этого класса.
- Параметры:
-
default_mimetype: str | None = None -
тип mime по умолчанию, если не указан.
-
request: Request -
Объект запроса с environ, использованным для создания запроса, который привел к этому ответу.
-
history: tuple[werkzeug.test.TestResponse, ...] -
Список промежуточных ответов. Заполняется, когда тестовый запрос создан с
follow_redirectsвключенным.
-
property text: str -
Данные ответа в текстовом формате. Краткая запись для
response.get_data(as_text=True).Изменения
Новое в версии 2.1.
-
class werkzeug.test.Cookie(key, value, decoded_key, decoded_value, expires, max_age, domain, origin_only, path, secure, http_only, same_site) -
Ключ, значение и параметры cookie.
Сам класс не является публичным API. Его атрибуты документированы для проверки с помощью
Client.get_cookie()только.Изменения
Новое в версии 2.3.
- Параметры:
-
key: str -
Ключ cookie, закодированный так, как его видит клиент.
-
value: str -
Значение cookie, закодированное так, как его видит клиент.
-
decoded_key: str -
Ключ cookie, декодированный так, как его видит приложение.
-
decoded_value: str -
Значение cookie, декодированное так, как его видит приложение.
-
expires: datetime | None -
Время, когда cookie больше недействительна.
-
max_age: int | None -
Количество секунд с момента установки cookie, по истечении которых она больше недействительна.
-
domain: str -
Домен, для которого установлена cookie, или домен запроса, если не задан.
-
origin_only: bool -
Указывает, будет ли cookie отправляться только для точных совпадений домена. Это
Trueесли параметрDomainне был указан.
-
path: str -
Путь, для которого установлена cookie.
-
secure: bool | None -
Параметр
Secure.
-
http_only: bool | None -
Параметр
HttpOnly.
-
same_site: str | None -
Параметр
SameSite.
-
class werkzeug.test.EnvironBuilder(path='/', base_url=None, query_string=None, method='GET', input_stream=None, content_type=None, content_length=None, errors_stream=None, multithread=False, multiprocess=False, run_once=False, headers=None, data=None, environ_base=None, environ_overrides=None, mimetype=None, json=None, auth=None) -
Этот класс можно использовать для удобного создания среды WSGI в целях тестирования. Он позволяет быстро создавать среды WSGI или объекты запросов из произвольных данных.
Подпись этого класса также используется в некоторых других местах с версии Werkzeug 0.5 (
create_environ(),Response.from_values(),Client.open()). По этой причине большая часть функциональности доступна только через конструктор.Файлы и данные в формате обычной формы можно обрабатывать независимо друг от друга с помощью атрибутов
formиfiles, но они передаются с тем же аргументом в конструктор:data.dataможет принимать следующие значения:- объект
strилиbytes: объект преобразуется вinput_stream, атрибутcontent_lengthустанавливается, и вам необходимо указатьcontent_type. -
объект
dictилиMultiDict: ключи должны быть строками. Значения должны быть любыми из следующих объектов или списком таких объектов:- объект, подобный
file: эти объекты автоматически преобразуются в объектыFileStorage. - объект
tuple: методadd_file()вызывается с ключом и распакованными элементамиtupleв качестве позиционных аргументов. - строка
str: строка устанавливается как данные формы для соответствующего ключа.
- объект, подобный
- объект, подобный файлу: содержимое объекта загружается в память и обрабатывается как обычный объект
strилиbytes.
- Параметры:
-
-
path (str) – путь к запросу. В среде WSGI он будет отображаться как
PATH_INFO. Еслиquery_stringне определен и вpathесть вопросительный знак, всё после него используется как строка запроса. -
base_url (str | None) – базовый URL – это URL, используемый для извлечения схемы WSGI URL, хоста (имя сервера + порт сервера) и корня скрипта (
SCRIPT_NAME). - query_string (t.Mapping[str, str] | str | None) – необязательная строка или словарь с параметрами URL.
-
method (str) – используемый HTTP-метод, по умолчанию
GET. -
input_stream (t.IO[bytes] | None) – необязательный поток ввода. Не указывайте его и
data. Как только поток ввода задан, вы не можете изменятьargsиfiles, если вы не установитеinput_streamнаNoneснова. -
content_type (str | None) – тип содержимого для запроса. С версии 0.5 вам не нужно указывать его, если вы задаёте файлы и данные формы через
data. -
content_length (int | None) – длина содержимого для запроса. Вам не нужно указывать это при предоставлении данных через
data. -
errors_stream (t.IO[str] | None) – необязательный поток ошибок, используемый для
wsgi.errors. По умолчаниюstderr. -
multithread (bool) – управляет
wsgi.multithread. По умолчаниюFalse. -
multiprocess (bool) – управляет
wsgi.multiprocess. По умолчаниюFalse. -
run_once (bool) – управляет
wsgi.run_once. По умолчаниюFalse. -
headers (Headers | t.Iterable[tuple[str, str]] | None) – необязательный список или объект
Headersзаголовков. - data (None | (t.IO[bytes] | str | bytes | t.Mapping[str, t.Any])) – строка, словарь данных формы или файл-объект. См. объяснение выше.
-
json (t.Mapping[str, t.Any] | None) – объект, который необходимо сериализовать и назначить
data. По умолчанию тип содержимого устанавливается в"application/json". Сериализуется с помощью функции, назначеннойjson_dumps. - environ_base (t.Mapping[str, t.Any] | None) – необязательный словарь с настройками по умолчанию среды.
- environ_overrides (t.Mapping[str, t.Any] | None) – необязательный словарь с настройка переопределения среды.
-
auth (Authorization | tuple[str, str] | None) – объект авторизации, используемый для значения заголовка
Authorization. Кортеж(username, password)– это сокращение дляBasicавторизации. - mimetype (str | None) –
-
path (str) – путь к запросу. В среде WSGI он будет отображаться как
Изменено в версии 3.0: Параметр
charsetбыл удален. - объект
Журнал изменений
Изменено в версии 2.1:
CONTENT_TYPEиCONTENT_LENGTHне дублируются в качестве ключей заголовка в среде.Изменено в версии 2.0:
REQUEST_URIиRAW_URIпредставляет собой полный исходный URI, включая строку запроса, а не только путь.Изменено в версии 2.0: По умолчанию
request_class—RequestвместоBaseRequest.Добавлен в версии 2.0: Добавлен параметр
auth.Добавлен в версии 0.15: Параметр
jsonи методjson_dumps().Добавлен в версии 0.15: Среда содержит ключи
REQUEST_URIиRAW_URI, содержащие путь до кодирования процентов. Это не часть WSGI PEP, но многие серверы WSGI его включают.Изменено в версии 0.6:
pathиbase_urlтеперь могут быть строками Unicode, закодированными с помощьюiri_to_uri().-
server_protocol = 'HTTP/1.1' -
Протокол сервера для использования. По умолчанию HTTP/1.1
-
wsgi_version = (1, 0) -
Версия WSGI для использования. По умолчанию (1, 0)
-
request_class -
Класс запроса по умолчанию, используемый в
get_request().Псевдоним
Request
-
static json_dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) -
Функция сериализации, используемая, когда передается
json.
-
classmethod from_environ(environ, **kwargs) -
Преобразование словаря environ обратно в конструктор. Любые дополнительные ключевые параметры переопределяют параметры, извлеченные из environ.
Журнал изменений
Изменено в версии 2.0: Значения пути и запроса передаются через WSGI-декодирование, чтобы избежать двойного кодирования.
Добавлен в версии 0.15.
- Parameters:
-
- environ (WSGIEnvironment) –
- kwargs (t.Any) –
- Return type:
-
property base_url: str -
Базовый URL используется для извлечения схемы URL, имени хоста, порта и корневого пути.
-
property content_type: str | None -
Тип контента запроса. Отражается в и из
headers. Не устанавливайте, если вы установилиfilesилиformдля автоматического определения.
-
property mimetype: str | None -
MIME-тип (тип контента без набора символов и т. д.)
Журнал изменений
Добавлен в версии 0.14.
-
property mimetype_params: Mapping[str, str] -
Параметры MIME-типа в виде словаря. Например, если тип контента —
text/html; charset=utf-8, параметры будут{'charset': 'utf-8'}.Журнал изменений
Добавлен в версии 0.14.
-
property content_length: int | None -
Длина контента в виде целого числа. Отражается в и из
headers. Не устанавливайте, если вы установилиfilesилиformдля автоматического определения.
-
property form: MultiDict -
Словарь значений формы.
-
property files: FileMultiDict -
Словарь загруженных файлов. Используйте
add_file()для добавления новых файлов.
-
property input_stream: IO[bytes] | None -
Необязательный поток ввода. Это взаимоисключающее с настройкой
formиfiles. Установка приведет к очистке этих значений. Не передавайте, если метод неPOSTили другой метод с телом.
-
property query_string: str -
Строка запроса. Если вы установили это в строку,
argsбольше недоступен.
-
property args: MultiDict -
Аргументы URL в виде словаря.
-
property server_name: str -
Имя сервера (только для чтения, используйте
hostдля установки)
-
property server_port: int -
Порт сервера в виде целого числа (только для чтения, используйте
hostдля установки)
-
close() -
Закрывает все файлы. Если вы поместили реальные объекты
fileв словарьfiles, вы можете вызвать этот метод, чтобы автоматически закрыть их все одним разом.- Return type:
-
None
-
get_environ() -
Возвращает созданную среду.
Журнал изменений
Изменено в версии 0.15: Заголовки типа и длины контента устанавливаются на основе обнаружения потока ввода. Ранее это устанавливало только ключи WSGI.
- Return type:
-
WSGIEnvironment
-
get_request(cls=None) -
Возвращает запрос с данными. Если класс запроса не указан, используется
request_class.- Parameters:
-
cls (type[werkzeug.wrappers.request.Request] | None) – Обёртка для запроса для использования.
- Return type:
-
-
werkzeug.test.create_environ(*args, **kwargs) -
Создайте новый словарь WSGI environ на основе переданных значений. Первый параметр должен быть путем запроса, по умолчанию — ‘/’. Второй может быть абсолютным путем (в этом случае хост — localhost:80) или полным путем к запросу со схемой, именем сети, портом и путем к скрипту.
Принимает те же аргументы, что и конструктор
EnvironBuilder.Changelog
Изменено в версии 0.5: Эта функция теперь является тонким обертыванием над
EnvironBuilder, добавленным в 0.5. Параметрыheaders,environ_base,environ_overridesиcharsetбыли добавлены.- Parameters:
-
- args (t.Any) –
- kwargs (t.Any) –
- Return type:
-
WSGIEnvironment
-
werkzeug.test.run_wsgi_app(app, environ, buffered=False) -
Возвращает кортеж в формате (app_iter, status, headers) выходных данных приложения. Лучше всего это работает, если вы передаете приложение, которое всегда возвращает итератор.
Иногда приложения могут использовать вызываемый
write()возвращаемый функциейstart_response. Это пытается автоматически разрешить такие граничные случаи. Но если вы не получаете ожидаемые выходные данные, вы должны установитьbufferedвTrue, что принудительно включает буферизацию.Если передано некорректное WSGI-приложение, поведение этой функции не определено. Никогда не передавайте несоответствующие WSGI-приложения в эту функцию.
© 2007 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/3.0.x/test/