Тестирование 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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"...'
Методы запроса клиента возвращают экземпляры 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) -
Этот класс позволяет отправлять запросы к обернутому приложению.
Параметр use_cookies указывает, следует ли хранить и отправлять файлы cookie для последующих запросов. По умолчанию это значение равно True, но передача False отключит это поведение.
Если вы хотите запросить какой-либо поддомен вашего приложения, вы можете установить
allow_subdomain_redirectsнаTrue, так как в противном случае внешние перенаправления не допускаются.Изменено в версии 2.1: Удалено устаревшее поведение обработки ответа как кортежа. Все данные доступны как свойства возвращаемого объекта ответа.
Журнал изменений
Изменено в версии 2.0:
response_wrapperвсегда является подклассом :class:TestResponse.Изменено в версии 0.5: Добавлен параметр
use_cookies.- Параметры
- Тип возвращаемого значения
-
None
-
set_cookie(server_name, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False, samesite=None, charset='utf-8') -
Устанавливает cookie в хранилище cookie клиента. Требуется имя сервера, и оно должно совпадать с тем, которое также передается в открытый вызов.
- Параметры
- Тип возвращаемого значения
-
None
-
delete_cookie(server_name, key, path='/', domain=None, secure=False, httponly=False, samesite=None) -
Удаляет cookie в тестовом клиенте.
-
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:
as_tupleустарел и будет удален в Werkzeug 2.1. ИспользуйтеTestResponse.requestиrequest.environвместо этого.Изменено в версии 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.1: Убрано устаревшее поведение по обработке экземпляра ответа как кортежа.
Журнал изменений
Новое в версии 2.0: Методы тестового клиента всегда возвращают экземпляры этого класса.
- Параметры
-
- response (Union[Iterable[str], Iterable[bytes]]) –
- status (str) –
- headers (werkzeug.datastructures.Headers) –
- request (werkzeug.wrappers.request.Request) –
- history (Tuple[werkzeug.test.TestResponse, ...]) –
- kwargs (Any) –
- Тип возвращаемого значения
-
None
-
request: werkzeug.wrappers.request.Request -
Объект запроса с окружением, используемым для выполнения запроса, который привел к этому ответу.
-
history: Tuple[werkzeug.test.TestResponse, ...] -
Список промежуточных ответов. Заполняется, когда тестовый запрос выполняется с
follow_redirectsвключенным.
-
property text: str -
Данные ответа в виде текста. Краткая форма для
response.get_data(as_text=True).Новое в версии 2.1.
-
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='utf-8', 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 (Optional[str]) – базовый URL, используемый для извлечения схемы URL WSGI, хоста (имя сервера + порт сервера) и корня скрипта (
SCRIPT_NAME). - query_string (Optional[Union[Mapping[str, str], str]]) – необязательная строка или словарь с параметрами URL.
-
method (str) – HTTP-метод, используемый по умолчанию
GET. -
input_stream (Optional[IO[bytes]]) – необязательный входной поток. Не указывайте его и
data. Как только задан входной поток, вы не можете изменитьargsиfiles, если не установитеinput_streamнаNoneснова. -
content_type (Optional[str]) – тип контента для запроса. Начиная с версии 0.5, его не нужно указывать при указании файлов и данных формы через
data. -
content_length (Optional[int]) – длина контента запроса. Не нужно указывать при предоставлении данных через
data. -
errors_stream (Optional[IO[str]]) – необязательный поток ошибок, используемый для
wsgi.errors. По умолчаниюstderr. -
multithread (bool) – управляет
wsgi.multithread. По умолчаниюFalse. -
multiprocess (bool) – управляет
wsgi.multiprocess. По умолчаниюFalse. -
run_once (bool) – управляет
wsgi.run_once. По умолчаниюFalse. -
headers (Optional[Union[werkzeug.datastructures.Headers, Iterable[Tuple[str, str]]]]) – необязательный список или объект
Headersзаголовков. - data (Optional[Union[IO[bytes], str, bytes, Mapping[str, Any]]]) – строка, словарь данных формы или объект файла. См. объяснение выше.
-
json (Optional[Mapping[str, Any]]) – объект, который нужно сериализовать и присвоить
data. По умолчанию тип контента"application/json". Сериализуется с помощью функции, присвоеннойjson_dumps. - environ_base (Optional[Mapping[str, Any]]) – необязательный словарь со значениями по умолчанию для среды.
- environ_overrides (Optional[Mapping[str, Any]]) – необязательный словарь с переопределениями среды.
- charset (str) – кодировка символов, используемая для кодирования строковых данных.
-
auth (Optional[Union[werkzeug.datastructures.Authorization, Tuple[str, str]]]) – объект авторизации для использования в качестве значения заголовка
Authorization. Кортеж(username, password)— это сокращение дляBasicавторизации.
-
path (str) – путь запроса. В среде WSGI он будет представлен как
-
Изменено в версии 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().Псевдоним
werkzeug.wrappers.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.
- Параметры
-
- environ (WSGIEnvironment) –
- kwargs (Any) –
- Тип возвращаемого значения
-
property base_url: str -
Базовый URL используется для извлечения схемы URL, имени хоста, порта и корневого пути.
-
property content_type: Optional[str] -
Тип содержимого запроса. Отражается из и в
headers. Не устанавливайте, если установленыfilesилиformдля автоматического определения.
-
property mimetype: Optional[str] -
Тип MIME (тип содержимого без набора символов и т. д.)
Журнал изменений
Добавлен в версии 0.14.
-
property mimetype_params: Mapping[str, str] -
Параметры типа MIME как словарь. Например, если тип содержимого
text/html; charset=utf-8, параметры будут{'charset': 'utf-8'}.Журнал изменений
Добавлен в версии 0.14.
-
property content_length: Optional[int] -
Длина содержимого как целое число. Отражается из и в
headers. Не устанавливайте, если установленыfilesилиformдля автоматического определения.
-
property form: werkzeug.datastructures.MultiDict -
Словарь значений формы.
-
property files: werkzeug.datastructures.FileMultiDict -
Словарь загруженных файлов. Используйте
add_file()для добавления новых файлов.
-
property input_stream: Optional[IO[bytes]] -
Необязательный поток ввода. Взаимоисключающее с настройкой
formиfiles, ее установка очистит их. Не предоставляйте, если метод неPOSTили другой метод, имеющий тело.
-
property query_string: str -
Строка запроса. Если вы установите строку,
argsбольше не будет доступна.
-
property args: werkzeug.datastructures.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 (Optional[Type[werkzeug.wrappers.request.Request]]) – Обёртка запроса для использования.
- Тип возвращаемого значения
-
-
werkzeug.test.create_environ(*args, **kwargs) -
Создайте новый словарь WSGI environ на основе переданных значений. Первый параметр должен быть путём запроса, по умолчанию — «/». Второй может быть абсолютным путём (в этом случае хост — localhost:80) или полным путём к запросу со схемой, netloc, портом и путём к скрипту.
Этот метод принимает те же аргументы, что и конструктор
EnvironBuilder.Изменения
Изменено в версии 0.5: Эта функция теперь является тонким обёрткой над
EnvironBuilder, которая была добавлена в 0.5. Параметрыheaders,environ_base,environ_overridesиcharsetбыли добавлены.
-
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[Iterable[bytes], str, werkzeug.datastructures.Headers]
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://werkzeug.palletsprojects.com/en/2.1.x/test/