测试WSGI应用程序

测试客户端

Werkzeug提供了一个 Client 在不启动服务器的情况下模拟对WSGI应用程序的请求。客户端有用于发出不同类型请求的方法,以及跨请求管理cookie的方法。

>>> 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"
)

测试JSONAPI时的一种快捷方式是将字典传递给 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环境很有用。可以将环境构建器或DICT传递给测试客户端请求方法,以代替使用自定义环境的其他参数。

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.requestresponse.request.environ

API

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

模拟在不运行WSGI或HTTP服务器的情况下向WSGI应用程序发送请求。

参数:
  • application (WSGIApplication) -- 要向其发出请求的WSGI应用程序。

  • response_wrapper (type[Response] | None) -- A Response 类来包装响应数据。默认为 TestResponse 。如果它不是 TestResponse ,将创建一个。

  • use_cookies (bool) -- 持久化Cookie Set-Cookie 的响应标头。 Cookie 后续请求中的标头。支持域和路径匹配,但忽略其他Cookie参数。

  • allow_subdomain_redirects (bool) -- 允许请求跟随到子域的重定向。如果应用程序处理子域并在子域之间进行重定向,则启用此选项。

Changelog

在 2.3 版本发生变更: 简化Cookie实现,支持域和路径匹配。

在 2.1 版本发生变更: 所有数据都可以作为返回的响应对象的属性。响应不能作为元组返回。

在 2.0 版本发生变更: response_wrapper 始终是 :class:``TestResponse` `

在 0.5 版本发生变更: 添加了 use_cookies 参数。

返回一个 Cookie 如果它存在的话。Cookie由唯一标识 (domain, path, key)

参数:
  • key (str) -- Cookie的密钥的解码形式。

  • domain (str) -- Cookie设置的域。

  • path (str) -- 为Cookie设置的路径。

返回类型:

Cookie | None

Changelog

在 2.3 版本加入.

设置要在后续请求中发送的Cookie。

这样可以方便地跳过向设置Cookie的路线发出测试请求。要测试Cookie,请向使用Cookie值的路由发出测试请求。

客户端使用 domainorigin_only ,以及 path 以确定与请求一起发送的Cookie。它不使用浏览器使用的其他cookie参数,因为它们在测试中不适用。

参数:
  • key (str) -- 饼干的关键部分。

  • value (str) -- Cookie的价值部分。

  • domain (str) -- 将此Cookie与与此域匹配的请求一起发送。如果 origin_only 为真,则必须完全匹配,否则可能是后缀匹配。

  • origin_only (bool) -- 域是否必须与请求完全匹配。

  • path (str) -- 将此Cookie与与此路径完全匹配或作为前缀的请求一起发送。

  • kwargs (Any) -- 已传递给 dump_cookie()

返回类型:

None

在 3.0 版本发生变更: 该参数 server_name 被移除。第一个参数是 key 。使用 domainorigin_only 参数而不是。

Changelog

在 2.3 版本发生变更: 这个 origin_only 参数已添加。

在 2.3 版本发生变更: 这个 domain 参数默认为 localhost

如果Cookie存在,请将其删除。Cookie由唯一标识 (domain, path, key)

参数:
  • key (str) -- Cookie的密钥的解码形式。

  • domain (str) -- Cookie设置的域。

  • path (str) -- 为Cookie设置的路径。

返回类型:

None

在 3.0 版本发生变更: 这个 server_name 参数将被删除。第一个参数是 key 。使用 domain 参数,而不是。

在 3.0 版本发生变更: 这个 securehttponlysamesite 参数将被删除。

Changelog

在 2.3 版本发生变更: 这个 domain 参数默认为 localhost

open(*args, buffered=False, follow_redirects=False, **kwargs)

从给定的参数生成环境字典,向使用它的应用程序发出请求,然后返回响应。

参数:
  • args (Any) -- 已传递给 EnvironBuilder 创建请求的环境。如果传递单个参数,则它可以是现有的 EnvironBuilder 或者是关于环境的判决书。

  • buffered (bool) -- 将应用程序返回的迭代器转换为列表。如果迭代器有一个 close() 方法,则会自动调用它。

  • follow_redirects (bool) -- 发出其他请求以遵循HTTP重定向,直到返回非重定向状态。 TestResponse.history 列出中间响应。

  • kwargs (Any) --

返回类型:

TestResponse

Changelog

在 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

参数:
返回类型:

TestResponse

post(*args, **kw)

打电话 open() 使用 method 设置为 POST

参数:
返回类型:

TestResponse

put(*args, **kw)

打电话 open() 使用 method 设置为 PUT

参数:
返回类型:

TestResponse

delete(*args, **kw)

打电话 open() 使用 method 设置为 DELETE

参数:
返回类型:

TestResponse

patch(*args, **kw)

打电话 open() 使用 method 设置为 PATCH

参数:
返回类型:

TestResponse

options(*args, **kw)

打电话 open() 使用 method 设置为 OPTIONS

参数:
返回类型:

TestResponse

head(*args, **kw)

打电话 open() 使用 method 设置为 HEAD

参数:
返回类型:

TestResponse

trace(*args, **kw)

打电话 open() 使用 method 设置为 TRACE

参数:
返回类型:

TestResponse

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

Response 提供有关测试请求的额外信息的子类 Client

测试客户端请求将始终返回此类的实例。如果将自定义响应类传递给客户端,则会将其子类化以支持测试信息。

如果测试请求包括大文件,或者应用程序正在提供文件,则调用 close() 要关闭任何打开的文件并防止Python显示 ResourceWarning

Changelog

在 2.2 版本发生变更: 设置 default_mimetype 设置为None可防止在缺少Mimetype时假定为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)

Changelog

在 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() 只有这样。

Changelog

在 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 参数。

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() )。正因为如此,大部分功能仅通过构造函数可用。

文件和常规表单数据可以通过 formfiles 属性,但使用相同的参数传递给构造函数: data .

data 可以是以下任何值:

  • strbytes 对象:对象被转换为 input_stream , the content_length 已设置,您必须提供 content_type .

  • dictMultiDict :键必须是字符串。这些值必须是以下任何对象或以下任何对象的列表:

    • file -类似对象:这些被转换为 FileStorage 对象自动。

    • tuple :的 add_file() 方法是用键和解包的 tuple 项作为位置参数。

    • str :字符串被设置为关联键的表单数据。

  • 一个类似文件的对象:对象内容加载到内存中,然后像常规的那样处理 str 或A bytes .

参数:
  • path (str) -- 请求的路径。在wsgi环境中,这将最终成为 PATH_INFO . 如果 query_string 未定义,并且在 path 之后的所有内容都用作查询字符串。

  • base_url (str | None) -- 基本URL是用于提取wsgi URL方案、主机(服务器名称+服务器端口)和脚本根目录的URL。 (SCRIPT_NAME

  • query_string (t.Mapping[str, str] | str | None) -- 带有URL参数的可选字符串或dict。

  • method (str) -- 要使用的HTTP方法,默认为 GET .

  • input_stream (t.IO[bytes] | None) -- 可选的输入流。不指定此和 data .一旦设置了输入流,就不能修改 argsfiles 除非你把 input_streamNone 再一次。

  • content_type (str | None) -- 请求的内容类型。从0.5开始,在通过 data .

  • content_length (int | None) -- 请求的内容长度。在通过 data .

  • errors_stream (t.IO[str] | None) -- 用于的可选错误流 wsgi.errors . 默认为 stderr .

  • multithread (bool) -- Controls wsgi.multithread . 默认为 False .

  • multiprocess (bool) -- Controls wsgi.multiprocess . 默认为 False .

  • run_once (bool) -- Controls 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])) -- 表单数据或文件对象的字符串或dict。见上述说明。

  • json (t.Mapping[str, t.Any] | None) -- 要序列化并分配给的对象 data .默认内容类型为 "application/json" .使用分配给的函数序列化 json_dumps .

  • environ_base (t.Mapping[str, t.Any] | None) -- 环境默认值的可选dict。

  • environ_overrides (t.Mapping[str, t.Any] | None) -- 环境重写的可选dict。

  • auth (Authorization | tuple[str, str] | None) -- 一个授权对象,用于 Authorization 标题值。一个 (username, password) 元组是 Basic 授权。

  • mimetype (str | None) --

在 3.0 版本发生变更: 这个 charset 参数已删除。

Changelog

在 2.1 版本发生变更: CONTENT_TYPECONTENT_LENGTH 不会被复制为环境中的头关键字。

在 2.0 版本发生变更: REQUEST_URIRAW_URI 是包括查询字符串的完整原始URI,而不仅仅是路径。

在 2.0 版本发生变更: 默认设置 request_classRequest 而不是 BaseRequest

在 2.0 版本加入: 添加了 auth 参数。

在 0.15 版本加入: 这个 json 参数和 json_dumps() 方法。

在 0.15 版本加入: 环境是有钥匙的 REQUEST_URIRAW_URI 包含百分比解码前的路径。这不是WSGI PEP的一部分,但许多WSGI服务器都包含它。

在 0.6 版本发生变更: pathbase_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)

把环境字典变回生成器。任何额外的Kwarg都会覆盖从环境中提取的arg。

Changelog

在 2.0 版本发生变更: 路径和查询值通过WSGI解码舞蹈传递,以避免重复编码。

在 0.15 版本加入.

参数:
  • environ (WSGIEnvironment) --

  • kwargs (t.Any) --

返回类型:

EnvironBuilder

property base_url: str

基本URL用于提取URL方案、主机名、端口和根路径。

property content_type: str | None

请求的内容类型。从和到的反射 headers .如果设置,则不设置 filesform 用于自动检测。

property mimetype: str | None

mimetype(不带字符集的内容类型等)

Changelog

在 0.14 版本加入.

property mimetype_params: Mapping[str, str]

mimetype参数为dict。例如,如果内容类型为 text/html; charset=utf-8 参数是 {{'charset': 'utf-8'}} .

Changelog

在 0.14 版本加入.

property content_length: int | None

内容长度为整数。从和到的反射 headers .如果设置,则不设置 filesform 用于自动检测。

property form: MultiDict

A MultiDict 形式值。

property files: FileMultiDict

A FileMultiDict 已上载文件数。使用 add_file() 添加新文件。

property input_stream: IO[bytes] | None

可选输入流。这与设置是互斥的 formfiles ,设置它将清除这些。如果该方法不是 POST 或者其他具有主体的方法。

property query_string: str

查询字符串。如果将此设置为字符串 args 将不再可用。

property args: MultiDict

URL参数为 MultiDict .

property server_name: str

服务器名称(只读,使用 host 设置)

property server_port: int

服务器端口为整数(只读,使用 host 设置)

close()

关闭所有文件。如果你真的 file 对象到 files dict您可以调用这个方法,一次就自动关闭它们。

返回类型:

None

get_environ()

返回生成的环境。

Changelog

在 0.15 版本发生变更: 内容类型和长度头是根据输入流检测设置的。以前,这只设置了wsgi键。

返回类型:

WSGIEnvironment

get_request(cls=None)

返回包含数据的请求。如果未指定请求类 request_class 使用。

参数:

cls (type[werkzeug.wrappers.request.Request] | None) -- 要使用的请求包装器。

返回类型:

Request

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

根据传递的值创建新的wsgi environ dict。第一个参数应该是请求的路径,默认为“/”。第二个路径可以是绝对路径(在这种情况下,主机为localhost:80),也可以是使用方案、netloc端口和脚本路径的请求的完整路径。

它接受与 EnvironBuilder 建造师。

Changelog

在 0.5 版本发生变更: 这个函数现在是一个薄包装 EnvironBuilder 在0.5中加入。这个 headersenviron_baseenviron_overridescharset 已添加参数。

参数:
  • args (t.Any) --

  • kwargs (t.Any) --

返回类型:

WSGIEnvironment

werkzeug.test.run_wsgi_app(app, environ, buffered=False)

以应用程序输出的形式(app-iter、status、headers)返回一个元组。如果您将一个始终返回迭代器的应用程序传递给它,那么它的效果最好。

有时应用程序可能使用 write() 由返回的可调用 start_response 功能。这将尝试自动解决此类边缘情况。但是如果你没有得到预期的输出,你应该设置 bufferedTrue 它强制缓冲。

如果传递的wsgi应用程序无效,则此函数的行为未定义。永远不要将不一致的WSGI应用程序传递给此函数。

参数:
  • app (WSGIApplication) -- 要执行的应用程序。

  • buffered (bool) -- 设置为 True 强制缓冲。

  • environ (WSGIEnvironment) --

返回:

形式中的元组 (app_iter, status, headers)

返回类型:

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