Инструменты тестирования
Часто вам нужно протестировать ваше приложение или просто проверить вывод из интерактивной сессии 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.
- объект
-
get_environ() -
Возвращает созданную среду.
Изменено в версии 0.15: Заголовок типа контента и длина устанавливаются на основе обнаружения входного потока. Ранее это устанавливало только ключи WSGI.
-
get_request(cls=None) -
Возвращает запрос с данными. Если класс запроса не указан, используется
request_class.Параметры: cls – Обёртка запроса для использования.
-
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-перенаправлениям.
-
as_tuple – Возвращает кортеж в форме
Доступны сокращённые методы для многих 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/