テストユーティリティ—Werkzeugのドキュメント

提供:Dev Guides
Werkzeug/docs/1.0.x/test
移動先:案内検索

テストユーティリティ

アプリケーションを単体テストしたり、インタラクティブなPythonセッションからの出力を確認したりすることがよくあります。 理論的には、WSGI環境を偽造し、ダミーの start_response を使用してアプリケーションを呼び出し、アプリケーションイテレーターを反復処理できるため、これは非常に単純ですが、アプリケーションと対話するためのより良い方法があります。

飛び込み

Werkzeugは、仮想リクエストをアプリケーションに送信するために使用できるWSGIアプリケーション(およびオプションで応答ラッパー)を渡すことができる Client オブジェクトを提供します。

応答ラッパーは、アプリケーションイテレーター、ステータス、最後にヘッダーのリストの3つの引数を取る呼び出し可能オブジェクトです。 デフォルトの応答ラッパーはタプルを返します。 応答オブジェクトは同じシグネチャを持っているため、理想的にはそれらをサブクラス化してテスト機能をフックすることにより、応答ラッパーとして使用できます。

>>> 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環境とリクエストオブジェクトの両方を作成できます。

次の例では、アップロードされた1つのファイルとフォームフィールドを使用して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'

EnvironBuilderは、コンストラクターにdictを 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'] = 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