Spec-Zone.ru › Werkzeug 0.15

Инструменты тестирования

Часто вам нужно протестировать ваше приложение или просто проверить вывод из интерактивной сессии Python. Теоретически это довольно просто, потому что вы можете смоделировать среду WSGI и вызвать приложение с фиктивными start_response данными и перебрать итератор приложения, но существуют, безусловно, лучшие способы взаимодействия с приложением.

Погружение

Werkzeug предоставляет объект Client, которому вы можете передать приложение WSGI (и необязательно обёртку ответа), которую вы можете использовать для отправки виртуальных запросов к приложению.

Обёртка ответа — это вызываемый объект, который принимает три аргумента: итератор приложения, статус и, наконец, список заголовков. По умолчанию обёртка ответа возвращает кортеж. Поскольку объекты ответа имеют такую же сигнатуру, вы можете использовать их в качестве обёртки ответа, предпочтительно, наследуя их и подключая функциональность тестирования.

>>> from werkzeug.test import Client
>>> from werkzeug.testapp import test_app
>>> from werkzeug.wrappers import BaseResponse
>>> c = Client(test_app, BaseResponse)
>>> resp = c.get('/')
>>> resp.status_code
200
>>> resp.headers
Headers([('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '8339')])
>>> resp.data.splitlines()[0]
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"'

Или без определения обёртки:

>>> c = Client(test_app)
>>> app_iter, status, headers = c.get('/')
>>> status
'200 OK'
>>> headers
[('Content-Type', 'text/html; charset=utf-8'), ('Content-Length', '8339')]
>>> ''.join(app_iter).splitlines()[0]
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"'

Создание среды

Новая функция в версии 0.5.

Самый простой способ интерактивного тестирования приложений — использовать EnvironBuilder. Он может создавать как стандартные среды WSGI, так и объекты запросов.

Следующий пример создаёт среду WSGI с одним загруженным файлом и полем формы:

>>> from werkzeug.test import EnvironBuilder
>>> from StringIO import StringIO
>>> builder = EnvironBuilder(method='POST', data={'foo': 'this is some text',
...      'file': (StringIO('my file contents'), 'test.txt')})
>>> env = builder.get_environ()

Полученная среда — обычная среда WSGI, которую можно использовать для дальнейшей обработки:

>>> from werkzeug.wrappers import Request
>>> req = Request(env)
>>> req.form['foo']
u'this is some text'
>>> req.files['file']
<FileStorage: u'test.txt' ('text/plain')>
>>> req.files['file'].read()
'my file contents'

Класс EnvironBuilder автоматически определяет тип содержимого, если вы передаёте словарь в конструктор в виде data. Если вы предоставляете строку или поток ввода, вы должны сделать это сами.

По умолчанию он будет пытаться использовать application/x-www-form-urlencoded и только использовать multipart/form-data при загрузке файлов:

>>> builder = EnvironBuilder(method='POST', data={'foo': 'bar'})
>>> builder.content_type
'application/x-www-form-urlencoded'
>>> builder.files['foo'] = StringIO('contents')
>>> builder.content_type
'multipart/form-data'

Если в качестве данных предоставлена строка (или поток ввода), вы должны самостоятельно указать тип содержимого:

>>> builder = EnvironBuilder(method='POST', data='{"json": "this is"}')
>>> builder.content_type
>>> builder.content_type = 'application/json'

Тестирование API

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)

Этот класс можно использовать для удобного создания WSGI-окружения в целях тестирования. Он может использоваться для быстрого создания WSGI-окружений или объектов запросов из произвольных данных.

Подпись этого класса также используется в некоторых других местах начиная с Werkzeug 0.5 (create_environ(), BaseResponse.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 – путь запроса. В WSGI-окружении он отображается как PATH_INFO. Если query_string не определен и в path есть знак вопроса, все после него используется в качестве строки запроса.
  • base_url – базовый URL-адрес, используемый для извлечения схемы URL, хоста (имя сервера + порт сервера) и корня скрипта (SCRIPT_NAME).
  • query_string – необязательная строка или словарь с параметрами URL.
  • method – HTTP-метод, по умолчанию GET.
  • input_stream – необязательный поток ввода. Не указывайте это, и data. Как только поток ввода установлен, вы не можете изменить args и files, если вы не установите input_stream снова на None.
  • content_type – тип содержимого для запроса. Начиная с версии 0.5, вам не нужно указывать его при указании файлов и данных формы через data.
  • content_length – длина содержимого для запроса. Вам не нужно указывать его при предоставлении данных через data.
  • errors_stream – необязательный поток ошибок, используемый для wsgi.errors. По умолчанию stderr.
  • multithread – управляет wsgi.multithread. По умолчанию False.
  • multiprocess – управляет wsgi.multiprocess. По умолчанию False.
  • run_once – управляет wsgi.run_once. По умолчанию False.
  • headers – необязательный список или объект Headers заголовков.
  • data – строка, словарь данных формы или объект файла. См. объяснение выше.
  • json – Объект, который необходимо сериализовать и назначить data. По умолчанию тип содержимого устанавливается на "application/json". Сериализуется с помощью функции, назначенной json_dumps.
  • environ_base – необязательный словарь со значениями по умолчанию для среды.
  • environ_overrides – необязательный словарь с замещениями для среды.
  • charset – кодировка символов, используемая для кодирования данных Unicode.

Добавлена в версии 0.15: Параметр json и метод json_dumps().

Добавлена в версии 0.15: В среде присутствуют ключи REQUEST_URI и RAW_URI, содержащие путь перед декодированием процентов. Это не часть WSGI PEP, но многие WSGI-серверы его включают.

Изменено в версии 0.6: path и base_url теперь могут быть строками Unicode, закодированными с использованием iri_to_uri().

path

Путь приложения. (также известен как PATH_INFO)

charset

Кодировка символов, используемая для кодирования данных Unicode.

headers

Объект Headers с заголовками запроса.

errors_stream

Поток ошибок, используемый для потока wsgi.errors.

multithread

Значение wsgi.multithread

multiprocess

Значение wsgi.multiprocess

environ_base

Словарь, используемый в качестве базового для вновь созданной среды.

environ_overrides

Словарь со значениями, используемыми для переопределения сгенерированной среды.

input_stream

Необязательный поток ввода. Он и form / files взаимоисключают. Также не предоставляйте этот поток, если метод запроса не POST / PUT или что-то подобное.

args

Аргументы URL в виде MultiDict.

base_url

Базовый URL используется для извлечения схемы URL, имени хоста, порта и пути к корню.

close()

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

content_length

Длина содержимого как целое число. Отражается в headers и из него. Не устанавливайте, если вы установили files или form для автоматического определения.

content_type

Тип содержимого запроса. Отражается в headers и из него. Не устанавливайте, если вы установили files или form для автоматического определения.

files

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

form

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

classmethod from_environ(environ, **kwargs)

Преобразует словарь environ обратно в билдер. Любые дополнительные значения kwargs переопределяют аргументы, извлеченные из environ.

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

END_OF_DOCUMENT_MARKER
get_environ()

Возвращает созданную среду.

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

get_request(cls=None)

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

Параметры: cls – Обёртка запроса для использования.
input_stream

Необязательный входной поток. Если вы его установите, он очистит form и files.

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.

mimetype

MIME-тип (тип контента без кодировки символов и т. д.).

Введено в версии 0.14.

mimetype_params

Параметры MIME-типа как словарь. Например, если тип контента text/html; charset=utf-8, параметры будут {'charset': 'utf-8'}.

Введено в версии 0.14.

query_string

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

request_class

Псевдоним werkzeug.wrappers.base_request.BaseRequest

server_name

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

server_port

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

server_protocol = 'HTTP/1.1'

Протокол сервера для использования. По умолчанию HTTP/1.1.

wsgi_version = (1, 0)

Версия WSGI для использования. По умолчанию (1, 0).

class werkzeug.test.Client(application, response_wrapper=None, use_cookies=True, allow_subdomain_redirects=False)

Этот класс позволяет отправлять запросы к обернутому приложению.

Обёртка ответа может быть классом или функцией-фабрикой, которая принимает три аргумента: app_iter, status и headers. По умолчанию обёртка ответа просто возвращает кортеж.

Пример:

class ClientResponse(BaseResponse):
    ...

client = Client(MyApplication(), response_wrapper=ClientResponse)

Параметр use_cookies указывает, должны ли сохраняться и отправляться cookie для последующих запросов. По умолчанию это True, но при передаче False этот процесс будет отключён.

Если вы хотите запросить какое-либо поддоменное имя вашего приложения, вы можете установить allow_subdomain_redirects на True, как если бы не было, то внешние перенаправления запрещены.

Введено в версии 0.5: use_cookies появилось в этой версии. Более старые версии не предоставляли встроенной поддержки cookie.

Введено в версии 0.14: Параметр mimetype был добавлен.

Введено в версии 0.15: Параметр json.

open(*args, **kwargs)

Принимает те же аргументы, что и класс EnvironBuilder с некоторыми дополнениями: вы можете предоставить EnvironBuilder или среду WSGI в качестве единственного аргумента вместо аргументов EnvironBuilder и двух необязательных ключевых аргументов (as_tuple, buffered) которые изменяют тип возвращаемого значения или способ выполнения приложения.

Изменено в версии 0.5: Если в словаре передаётся файл в словаре для параметра data, тип контента должен называться content_type теперь вместо mimetype. Это изменение сделано для согласованности с werkzeug.FileWrapper.

Параметр follow_redirects был добавлен в open().

Дополнительные параметры:

Параметры:
  • as_tuple – Возвращает кортеж в форме (environ, result)
  • buffered – Установите это в True, чтобы буферизовать выполнение приложения. Это также автоматически закроет приложение.
  • follow_redirects – Установите это в True, если Client должен следовать HTTP-перенаправлениям.

Доступны сокращённые методы для многих HTTP-методов:

get(*args, **kw)

Как open, но метод принудительно устанавливается в GET.

patch(*args, **kw)

Как open, но метод принудительно устанавливается в PATCH.

post(*args, **kw)

Как open, но метод принудительно устанавливается в POST.

head(*args, **kw)

Как open, но метод принудительно устанавливается в HEAD.

put(*args, **kw)

Как open, но метод принудительно устанавливается в PUT.

delete(*args, **kw)

Как open, но метод принудительно устанавливается в DELETE.

options(*args, **kw)

Как open, но метод принудительно устанавливается в OPTIONS.

trace(*args, **kw)

Как open, но метод принудительно устанавливается в TRACE.

werkzeug.test.create_environ([options])

Создаёт новый словарь 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 – приложение для выполнения.
  • buffered – установить в True для принудительной буферизации.
Возвращает:

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

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

Spec-Zone.ru

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