如何使用pytest-flask将发布数据发送到烧瓶

时间:2017-08-16 01:01:20

标签: flask python-3.5 pytest

项目设置

  • Python 3.5.3
  • 烧瓶0.12.2

目录

.
├── Core
│   ├── BackgroundProcessManager.py
│   ├── FirebaseDatabaseManager.py
│   ├── LearningManager.py
│   ├── __init__.py
│  
├── FrontEnd
│   ├── HomePage.py
│   ├── __init__.py
│  
├── LICENSE
├── README.md
├── Route
│   ├── RouteManager.py
│   ├── __init__.py
│  
├── Settings
│   ├── DefineManager.py
│   ├── __init__.py
│   
├── Utils
│   ├── LoggingManager.py
│   ├── __init__.py
│   
├── index.py
└── runner.sh

预期行为

  • 所有路线链接均在Route/RouteManager.py

  • Flask主要来源位于index.py

  • 我希望使用pytest-flask发送虚假请求和测试响应。

实际行为

  • 我不知道如何发送虚假的帖子数据和测试。

来源

index.py

from flask import Flask
from Settings import DefineManager
from Route import *
import imp
import sys

imp.reload(sys)

app = Flask(__name__)
app.register_blueprint(routes)

if __name__ == '__main__':
    app.debug = True
    app.run(host=DefineManager.SERVER_USING_HOST, port=DefineManager.SERVER_USING_PORT)

路线/ RouteManager.py

@routes.route("/")
def IndexPage():
    LoggingManager.PrintLogMessage("RouteManager", "IndexPage", "web page connection!", DefineManager.LOG_LEVEL_INFO)
    return HomePage.RenderIndexPage()

@routes.route("/upload/", methods=['POST'])
def UploadRawDatas():
    content = request.get_json(silent=True)
    LoggingManager.PrintLogMessage("RouteManager", "UploadRawDatas", "json data: " + str(content), DefineManager.LOG_LEVEL_INFO)
    return BackgroundProcessManager.UploadRawDatas(content['Data'], content['Date'], content['Day'])

@routes.route("/forecast/", methods=['POST'])
def ForecastDatas():
    content = request.get_json(silent=True)
    LoggingManager.PrintLogMessage("RouteManager", "ForecastDatas", "json data: " + str(content), DefineManager.LOG_LEVEL_INFO)
    return BackgroundProcessManager.ForecastDatas(content['ProcessId'])

测试用例

/上传/

请求数据

Content-Type application/json

{ "Data": [20.0, 30.0, 401.0, 50.0], "Date": ["2017-08-11", "2017-08-12", "2017-08-13", "2017-08-14"], "Day": 4 }

响应数据

Content-Type application/json

  • {"结果":39}

期待测试过程

  • 发送假发布数据。
  • 接收回复数据。
  • 断言检查Result不等于-1

2 个答案:

答案 0 :(得分:13)

pytest-flask提供several fixtures,包括client个。有了它,您可以制作类似于此的测试功能:

def test_upload(client):

    mimetype = 'application/json'
    headers = {
        'Content-Type': mimetype,
        'Accept': mimetype
    }
    data = {
        'Data': [20.0, 30.0, 401.0, 50.0],
        'Date': ['2017-08-11', '2017-08-12', '2017-08-13', '2017-08-14'],
        'Day': 4
    }
    url = '/upload/'

    response = client.post(url, data=json.dumps(data), headers=headers)

    assert response.content_type == mimetype
    assert response.json['Result'] == 39

答案 1 :(得分:2)

虽然可接受的答案有效,但可以通过将kwarg json传递到post方法而不是data

来简化它
def test_upload(client):
    data = {
        'Data': [20.0, 30.0, 401.0, 50.0],
        'Date': ['2017-08-11', '2017-08-12', '2017-08-13', '2017-08-14'],
        'Day': 4
    }
    url = '/upload/'

    response = client.post(url, json=data)

    assert response.content_type == 'application/json'
    assert response.json['Result'] == 39