【问题标题】:How do you get two Flask test clients to communicate using Request如何让两个 Flask 测试客户端使用 Request 进行通信
【发布时间】:2020-09-01 19:55:57
【问题描述】:

我是 Flask 的新手,我正在努力学习以便为我正在开发的应用程序编写 pytest。

在我的项目中,有两个应用程序有时会进行通信;一个偶尔会使用“请求”库向另一个发送请求,而另一个会发回响应。

在我见过的大多数 Flask 测试示例中,它是通过使用应用程序的“test_client”方法完成的。我的问题是如何让这两个测试客户端进行通信。

举个玩具例子,这里有两个应用:

flask_app1.py

from flask import Flask
import requests

def create_app():

    app = Flask(__name__)

    @app.route('/send_message/<msg>')
    def send_message(msg):
        response = requests.post('http://127.0.0.1:5001/receive_msg', json={'message': msg})
        print(response.text)
        return "sent:" + response.json()['received']

    return app


if __name__ == '__main__':
    app = create_app()
    app.run()

flask_app2.py

from flask import Flask, request

def create_app():

    app = Flask(__name__)

    @app.route('/receive_msg', methods=["POST"])
    def receive():
        msg = request.get_json()["message"]
        print(msg)
        return {'received': msg}

    return app


if __name__ == '__main__':
    app = create_app()
    app.run(port=5001)

简单地说,第一个应用程序向第二个应用程序发送一条消息,然后将其发送回第一个应用程序。

现在假设我有测试:

import flask_app1
import flask_app2


def test_two_clients():
    app1 = flask_app1.create_app()
    client1 = app1.test_client()

    app2 = flask_app2.create_app()
    client2 = app2.test_client()

    r = client1.get('/send_message/hello_there')

    assert r.status_code == 200


def test_one_client():
    app1 = flask_app1.create_app()
    client1 = app1.test_client()

    r = client1.get('/send_message/hello_there')

    assert r.status_code == 200

当flask_app2 在终端中运行时,底部测试有效,但这不是我想要的。 我不确定如何让 client1 与 client2 通信

【问题讨论】:

  • 我不完全相信我能得到你想要的东西,但从我在这里收集到的东西是我的看法;这两个应用程序将通过相互发出请求进行通信,就像网络上的任何其他应用程序一样,因此您需要同时运行它们(可能在不同的端口上)。然后,您可以为每个单独编写测试,检查请求是否成功以及是否收到了预期的响应。

标签: flask python-requests pytest


【解决方案1】:

我不知道有什么模式可以相互测试两个 Flask 应用程序,至少不运行一个。

我承认您不想运行它们,但为了完整性:

您可以启动一些 Docker 容器,在那里运行您的应用程序,然后以这种方式对其进行测试。恕我直言,这对于端到端测试非常有意义。

由于您不想这样做,因此您应该考虑代码的实现。有一种称为依赖注入的模式 - 这使您能够完全独立地测试您的应用程序。

关于这个https://www.cosmicpython.com/blog/2020-01-25-testing_external_api_calls.html有一篇很棒的博文

其他可能性是模拟对其他 Flask 应用程序的调用或通过https://github.com/kevin1024/vcrpy记录其输出

我知道,这不是预期的答案,但我希望你能找到一些有用的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2019-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多