Flask Test Client - GET / POST examples
Posted on Sep 15, 2018 in Flask by Amo Chen ‐ 1 min read
Flask 的 test client 其實是複用 Werkzeug 的 Client 支援 get
patch
post
head
等方法。
不過文件中對於各個方法可以使用的參數並沒有寫得十分清楚,本篇紀錄常見的 get
post
使用方法。
前情提要
本文環境為:
- Flask 1.0.2
- Python 3.6.5
- py.test 3.5.1
本文使用以下 Flask APP 作為要測試的目標 ( app.py ) ,此 app 會將收到的 HTTP request 中的 GET parameters 及 POST 的內容轉成 JSON 後回應:
# -*- coding: utf-8 -*-
from flask import Flask
from flask import request
from flask import jsonify
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
method = request.method
if method == 'GET':
content_dict = request.args
elif method == 'POST':
content_dict = request.json
content_dict.update(request.headers)
return jsonify(content_dict)
本文開始
Flask 官方文件推薦使用 py.test 進行測試,因此可以看到官方文件中將 test client 製作成 fixture ,以方便進行測試:
import pytest
from app import app
@pytest.fixture
def client():
app.config['TESTING'] = True
with app.app_context():
client = app.test_client()
yield client
p.s. 不懂 py.test 的話,可以參考 pytest 教學
而用過 requests 的人一定也會覺得 Werkzeug 的 test client 很像,大部分的參數及用法都很類似,例如 headers
data
content_type
等等,但是 requests 模組的 get 方法有支援 params 的用法,而相同的參數在 Werkzeug 的 test client 無法使用,原因是因為 Werkzeug 的 test client 的 params 叫做 query_string ,所以要在 get 方法很方便地加上 URL 的 parameters 時,就得改用 query_string 。
以下就是 Flask test client 的 get / post 的範例,細節就不加以詳述了。
# -*- coding: utf-8 -*-
import json
import pytest
from app import app
@pytest.fixture
def client():
app.config['TESTING'] = True
with app.app_context():
client = app.test_client()
yield client
def test_get_home(client):
resp = client.get(
'/',
headers={
'X-My-Header': 'Header',
},
query_string={
'ref': 'google',
},
)
def test_post_home(client):
resp = client.post(
'/',
headers={
'X-My-Header': 'Header',
},
data=json.dumps({
'ref': 'google',
}),
content_type='application/json',
)