测试工具 — Werkzeug 文档

来自菜鸟教程
Werkzeug/docs/1.0.x/test
跳转至:导航、​搜索

测试工具

很多时候你想对你的应用程序进行单元测试,或者只是检查交互式 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', '6658')])
>>> resp.data.splitlines()[0]
b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"'

或者没有定义包装器:

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

环境建设

0.5 版中的新功能。


交互式测试应用程序的最简单方法是使用 EnvironBuilder。 它可以创建标准的 WSGI 环境和请求对象。

以下示例使用一个上传的文件和一个表单字段创建一个 WSGI 环境:

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

生成的环境是一个常规的 WSGI 环境,可用于进一步处理:

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

如果您将 dict 作为 data 传递给构造函数,则 EnvironBuilder 会自动计算出内容类型。 如果您提供字符串或输入流,则必须自己完成。

默认情况下,它会尝试使用 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'] = BytesIO('contents'.encode("utf8"))
>>> builder.content_type
'multipart/form-data'

如果字符串作为数据(或输入流)提供,您必须自己指定内容类型:

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

测试API