Spec-Zone.ru › Werkzeug

Тестирование 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 environ. Клиент для тестирования использует его в качестве внутренней составляющей для подготовки своих запросов. Аргументы, передаваемые методам запроса клиента, совпадают с аргументами построителя.

Иногда полезно вручную построить WSGI-окружение. Построитель environ или словарь можно передать методам запроса клиента вместо других аргументов, чтобы использовать пользовательское окружение.

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 (type[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).

Параметры:
  • key (str) – Декодированное значение ключа куки.
  • domain (str) – Домен, для которого была установлена кука.
  • path (str) – Путь, для которого была установлена кука.
Тип возвращаемого значения:

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 равно true, оно должно быть точным совпадением, в противном случае это может быть соответствие по суффиксу.
  • 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).

Параметры:
  • key (str) – Декодированное значение ключа куки.
  • domain (str) – Домен, для которого была установлена кука.
  • path (str) – Путь, для которого была установлена кука.
Тип возвращаемого значения:

None

Изменения

Изменено в версии 3.0: Параметр server_name удалён. Первый параметр — key. Используйте параметр domain вместо него.

Изменено в версии 3.0: Параметры secure, httponly и samesite удалены.

Изменено в версии 2.3: Параметр domain по умолчанию localhost.

END_OF_DOCUMENT_MARKER
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)
Тип возвращаемого значения:

TestResponse

Журнал изменений

Изменено в версии 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.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

post(*args, **kw)

Вызов open() с method установленным в POST.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

put(*args, **kw)

Вызов open() с method установленным в PUT.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

delete(*args, **kw)

Вызов open() с method установленным в DELETE.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

patch(*args, **kw)

Вызов open() с method установленным в PATCH.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

options(*args, **kw)

Вызов open() с method установленным в OPTIONS.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

head(*args, **kw)

Вызов open() с method установленным в HEAD.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

trace(*args, **kw)

Вызов open() с method установленным в TRACE.

Параметры:
  • args (Any)
  • kw (Any)
Тип возвращаемого значения:

TestResponse

class werkzeug.test.TestResponse(response, status, headers, request, history=(), **kwargs)

Response подкласс, предоставляющий дополнительную информацию о запросах, выполненных с помощью тестового Client.

Запросы тестового клиента всегда возвращают экземпляр этого класса. Если для клиента задан пользовательский класс ответа, он также подклассифицируется вместе с этим, чтобы поддерживать тестовую информацию.

Если тестовый запрос включал большие файлы или приложение обслуживает файл, вызовите close() для закрытия всех открытых файлов и предотвращения отображения Python ResourceWarning.

Журнал изменений

Изменено в версии 2.2: Установите default_mimetype в None, чтобы предотвратить предположение типа MIME при его отсутствии.

Изменено в версии 2.1: Экземпляры ответа нельзя рассматривать как кортежи.

Добавлено в версии 2.0: Методы тестового клиента всегда возвращают экземпляры этого класса.

Параметры:
  • response (Iterable[str] | Iterable[bytes])
  • status (str)
  • headers (Headers)
  • request (Request)
  • history (tuple[TestResponse, ...])
  • kwargs (t.Any)
default_mimetype: str | None = None

Значение по умолчанию для типа MIME, если не указан другой.

request: Request

Объект запроса с окружением, используемым для создания запроса, который привел к этому ответу.

history: tuple[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)
  • value (str)
  • decoded_key (str)
  • decoded_value (str)
  • expires (datetime | None)
  • max_age (int | None)
  • domain (str)
  • origin_only (bool)
  • path (str)
  • secure (bool | None)
  • http_only (bool | None)
  • same_site (str | None)
key: str

Ключ cookie, закодированный так, как его увидит клиент.

value: str

Значение cookie, закодированное так, как его увидит клиент.

decoded_key: str

Ключ cookie, декодированный так, как его увидит приложение.

decoded_value: str

Значение cookie, декодированное так, как его увидит приложение.

expires: datetime | None

Время, когда cookie перестает быть действительным.

max_age: int | None

Количество секунд от момента установки cookie, по истечении которых 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.

END_OF_DOCUMENT_MARKER
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, используемый для извлечения схемы 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)
END_OF_DOCUMENT_MARKER
Журнал изменений

Изменено в версии 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 обратно в конструктор. Любые дополнительные ключевые слова переопределяют аргументы, извлеченные из окружения.

Журнал изменений

Изменено в версии 2.0: Значения пути и строки запроса передаются через танец декодирования WSGI для предотвращения двойного кодирования.

Добавлен в версии 0.15.

Параметры:
  • environ (WSGIEnvironment)
  • kwargs (t.Any)
Возвращаемое значение:

EnvironBuilder

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[str, str]

Словарь значений формы.

property files: FileMultiDict

Словарь загруженных файлов. Используйте add_file() для добавления новых файлов.

property input_stream: IO[bytes] | None

Необязательный поток ввода. Это взаимоисключающее условие с настройкой form и files. Установка этого значения очистит эти значения. Не предоставляйте это, если метод не POST или другой метод, имеющий тело.

property query_string: str

Строка запроса. Если вы установите это значение в строку, args больше недоступна.

property args: MultiDict[str, str]

Аргументы URL в виде словаря.

property server_name: str

Имя сервера (только для чтения, используйте host для установки)

property server_port: int

Порт сервера в виде целого числа (только для чтения, используйте host для установки)

close()

Закрывает все файлы. Если вы поместите реальные объекты file в словарь files, вы можете вызвать этот метод, чтобы автоматически закрыть их все сразу.

Возвращаемое значение:

None

get_environ()

Возвращает построенное окружение.

Журнал изменений

Изменено в версии 0.15: Заголовки типа содержимого и длины устанавливаются на основе обнаружения потока ввода. Ранее это устанавливало только ключи WSGI.

Возвращаемое значение:

WSGIEnvironment

get_request(cls=None)

Возвращает запрос с данными. Если класс запроса не указан, используется request_class.

Параметры:

cls (type[Request] | None) – Обёртка запроса для использования.

Возвращаемое значение:

Request

werkzeug.test.create_environ(*args, **kwargs)

Создайте новый словарь WSGI environ на основе переданных значений. Первый параметр должен быть путём запроса, по умолчанию «/». Второй параметр может быть абсолютным путём (в этом случае хост — localhost:80) или полным путём запроса со схемой, доменным именем, портом и путём к скрипту.

Принимает те же аргументы, что и конструктор EnvironBuilder.

Журнал изменений

Изменено в версии 0.5: Эта функция теперь является тонким обёрткой над EnvironBuilder, которая была добавлена в 0.5. Параметры headers, environ_base, environ_overrides и charset были добавлены.

Параметры:
  • 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-приложения в эту функцию.

Параметры:
  • app (WSGIApplication) – приложение, которое нужно выполнить.
  • buffered (bool) – устанавливается в True для принудительной буферизации.
  • environ (WSGIEnvironment)
Возвращает:

кортеж в формате (app_iter, status, headers)

Тип возвращаемого значения:

tuple[t.Iterable[bytes], str, Headers]

© 2007 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/latest/test/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API