【问题标题】:Test interaction between flask apps测试烧瓶应用程序之间的交互
【发布时间】:2020-06-11 15:48:31
【问题描述】:

我有一个烧瓶应用程序,旨在托管在多个主机上。也就是说,同一个应用程序在不同的主机上运行。然后,每个主机都可以向其他主机发送请求,以在其各自的系统上采取一些行动。

例如,假设系统 A 和 B 都在运行这个烧瓶应用程序。 A 知道 B 的 IP 地址和应用托管在 B 上的端口号。A 通过为 B 准备的 POST 获取请求。然后 A 需要将此请求转发给 B。

我在一个路由中完成了转发,该路由仅检查附加到 POST 的 JSON 以查看它是否是预期的主机。如果不是,则使用 python 的请求库向其他主机发出 POST 请求。

我的问题是如何在 python unittest 中模拟这个环境(具有不同端口的同一应用程序的两个不同实例),以便我可以确认转发是否正确完成?

现在我正在使用 app.test_client() 来测试大多数路由,但据我所知 app.test_client() 不包含与之关联的端口号或 IP 地址。因此,让应用程序 POST 到另一个 app.test_client() 似乎不太可能。

我尝试将应用程序托管在不同的线程中,但似乎没有一种干净简单的方法可以在 app.run() 启动后终止线程,因为 app.run() 永远不会退出,因此无法加入。此外,应用程序 (app.config) 的内部状态将被隐藏。这使得验证 A 不执行请求而 B 执行非常困难。

有没有办法在不同的端口号上同时运行两个烧瓶应用程序,并且仍然可以访问这两个应用程序的 app.config?还是我坚持使用线程并寻找其他方法来确保 A 不执行请求而 B 执行?

注意:这些应用没有任何论坛,因此没有 CSRF。

【问题讨论】:

    标签: python flask python-requests python-unittest


    【解决方案1】:

    我最终做了两件事。一,我开始使用模拟库中的补丁装饰器来伪造响应表单系统 B。更具体地说,我使用 @patch('requests.post') 然后在我的代码中我将返回值设置为 " ”。然而,这只确保 requests.post 被调用,而不是第二个系统正确处理它。我做的第二件事是编写一个单独的测试,它发出应该由 A 发送的请求并将其发送到系统以检查它是否正确处理它。以这种方式,系统 A 和 B 永远不会同时运行。相反,测试只是伪造那里的响应/请求。

    在夏天,我需要使用@patch('requests.post') 来伪造 B 的回复,说它收到了请求。然后,在另一个测试中,我设置了 B 并向它发出请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-14
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多