Тестирование 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
>>> resp.headers
Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '6658')])
>>> 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='', *args, domain='localhost', origin_only=True, path='/', **kwargs) -
Устанавливает куки для отправки в последующих запросах.
Это удобный способ пропустить тестовый запрос к маршруту, который установил бы куки. Для проверки куки выполните тестовый запрос к маршруту, использующему значение куки.
Клиент использует
domain,origin_only, иpathдля определения, какие куки отправлять с запросом. Он не использует другие параметры куки, которые используются браузерами, так как они не применимы в тестах.- Параметры:
-
- key (строка) – Ключевая часть куки.
- value (строка) – Значение части куки.
-
domain (строка) – Отправлять эту куки с запросами, соответствующими этому домену. Если
origin_onlyравно true, должно быть точное совпадение, иначе может быть совпадение по суффиксу. - origin_only (bool) – Требуется ли точное совпадение домена с запросом.
- path (строка) – Отправлять эту куки с запросами, соответствующими этому пути, либо точно, либо как префикс.
-
kwargs (любое) – Передается в
dump_cookie(). - args (любое) –
- Тип возвращаемого значения:
-
None
Изменено в версии 2.3: Добавлен параметр
origin_only.Изменено в версии 2.3: Параметр
domainпо умолчаниюlocalhost.Изменено в версии 2.3: Первый параметр
server_nameустарел и будет удалён в Werkzeug 3.0. Первый параметрkey. Используйте параметрыdomainиorigin_onlyвместо него.
-
delete_cookie(key, *args, domain='localhost', path='/', **kwargs) -
Удаляет куки, если она существует. Куки уникально идентифицируются по
(domain, path, key).- Параметры:
- Тип возвращаемого значения:
-
None
Изменено в версии 2.3: Параметр
domainпо умолчаниюlocalhost.Изменено в версии 2.3: Первый параметр
server_nameустарел и будет удалён в Werkzeug 3.0. Первый параметрkey. Используйте параметрdomainвместо него.Изменено в версии 2.3: Параметры
secure,httponlyиsamesiteустарели и будут удалены в Werkzeug 2.4.
-
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: Объекты ответа не могут обрабатываться как кортежи.
Добавлен в версии 2.0: Методы тестового клиента всегда возвращают экземпляры этого класса.
- Параметры:
-
default_mimetype: str | None = None -
Значение mimetype по умолчанию, если оно не указано.
-
request: Request -
Объект запроса с окружением, используемым для создания запроса, который привёл к этому ответу.
-
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, charset=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, хоста (имя сервера + порт сервера) и корня скрипта (
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авторизации. - charset (str | None) –
- mimetype (str | None) –
-
path (str) – путь к запросу. В WSGI-среде он будет представлен как
Изменено в версии 2.3: Параметр
charsetустарел и будет удален в Werkzeug 3.0 - объект
Журнал изменений
Изменено в версии 2.1:
CONTENT_TYPEиCONTENT_LENGTHне дублируются в качестве ключей заголовка в environ.Изменено в версии 2.0:
REQUEST_URIиRAW_URIпредставляет собой полный необработанный URI, включая строку запроса, а не только путь.Изменено в версии 2.0: По умолчанию
request_classиспользуетсяRequestвместоBaseRequest.Добавлена в версии 2.0: Добавлен параметр
auth.Добавлена в версии 0.15: Параметр
jsonи методjson_dumps().Добавлена в версии 0.15: В environ есть ключи
REQUEST_URIиRAW_URI, содержащие путь до проценто-декодирования. Это не часть PEP WSGI, но многие серверы 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 обратно в конструктор. Любые дополнительные параметры kwargs переопределяют аргументы, извлеченные из environ.
Журнал изменений
Изменено в версии 2.0: Значения пути и строки запроса передаются через WSGI-декодирование, чтобы избежать двойного кодирования.
Добавлена в версии 0.15.
- Параметры:
-
- environ (WSGIEnvironment) –
- kwargs (t.Any) –
- Тип возвращаемого значения:
-
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, вы можете вызвать этот метод, чтобы автоматически закрыть их все сразу.- Тип возвращаемого значения:
-
None
-
get_environ() -
Возвращает созданный словарь environ.
Журнал изменений
Изменено в версии 0.15: Заголовки типа содержимого и длины устанавливаются на основе обнаружения потока ввода. Ранее это устанавливало только ключи WSGI.
- Тип возвращаемого значения:
-
WSGIEnvironment
-
get_request(cls=None) -
Возвращает запрос с данными. Если класс запроса не указан, используется
request_class.- Параметры:
-
cls (type[werkzeug.wrappers.request.Request] | None) – Обёртка объекта запроса для использования.
- Тип возвращаемого значения:
-
-
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) –
- Тип возвращаемого значения:
-
WSGIEnvironment
-
werkzeug.test.run_wsgi_app(app, environ, buffered=False) -
Возвращает кортеж в виде (app_iter, status, headers) выходных данных приложения. Это лучше всего работает, если вы передаёте приложение, которое всегда возвращает итератор.
Иногда приложения могут использовать вызываемый объект
write(), возвращаемый функциейstart_response. Это пытается автоматически решить такие частные случаи. Но если вы не получаете ожидаемый результат, вы должны установитьbufferedвTrue, что обеспечивает буферизацию.Если передано некорректное WSGI-приложение, поведение этой функции не определено. Никогда не передавайте несовместимые WSGI-приложения в эту функцию.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.3.x/test/