如何模拟测试主要与 3rd 方 API 交互的 Flask 端点?

How to mock test Flask endpoints that mainly interact with 3rd party APIs?

我们使用 Flask 开发了各种服务,所有这些服务实际上都充当了最终用户和各种第 3 方 API(但没有数据库)之间的中介。我已经使用带有 test_client 夹具等的 pytest 开发了测试,并且效果很好。但每次 route/endpoint 被其中一个测试调用时,它实际上与第 3 方 API 交互。

在这种情况下进行模拟测试的正确方法是什么?我想知道我是否应该只开发端点的精确副本,而是模拟对 3rd 方 API 的请求发生的行。这看起来工作量很大,但如果我只是 return 一些来自给定端点的预期 JSON 那么我认为代码不会被测试得很好。

需要调用第三方的场景API,可以考虑使用Pytest VCR

它是一个 pytest 插件,允许通过使用装饰器记录在测试方法或函数内发出的所有 http 请求,如下所示。

@pytest.mark.vcr()
def my_test():
   """
   Example of a function that test a client doing http requests
   """
   some_client = SomeClient()
   some_client.authenticate()
   resource = some_client.get_resource("foo")
   assert resource is not None

第一次 运行 测试时,通话会被记录到一个名为“磁带”的文件中。然后此测试的后续 运行 将使用此盒式磁带作为一种模拟,而不是发送真正的 http 调用。

如果您正在测试完成 https 调用的烧瓶应用程序视图,它也能正常工作。

小心 因为此解决方案意味着如果您以添加 http 调用的方式更改测试代码,测试将中断,因为盒中不存在新调用。您要么必须删除录音带并重新录制,要么 运行 使用 --vcr-record=new_episodes 进行测试以向现有录音带添加新呼叫。