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',
    )