首页 > 解决方案 > 为 django api 设置消费者驱动的合同测试并响应客户端的合适方法是什么?

问题描述

我刚刚学到了一个新术语,叫做消费者驱动的合同测试

我在想也许它可以帮助我解决我为 django api 提供者编写测试和响应前端架构项目的问题。

前端和 Django API 后端位于不同的存储库中,并且有自己的单元测试。

但是,偶尔会出现错误,因为前端假设了 Django 服务后端未返回的某些字段。

我最初考虑编写端到端测试,但它们运行缓慢且非常脆弱。

我发现了这种消费者驱动的合同测试,这听起来是正确的。但是当我四处搜索时,我找不到任何合适的东西。甚至Pact似乎也只是为了将合同转换为消费者测试。

针对这种情况进行消费者驱动的合同测试的适当简单方法是什么?

标签: djangoreactjstesting

解决方案


Kim,听起来您正在寻找 API 集成测试,而不是真正的端到端。

正如您所说,使用协议的价值在于获得可以由提供商验证的合同。契约的运行方式与您的单元测试完全一样。如果您遵循前端应用程序的协议步骤,您最终将编写调用提供程序(您的 django API)的单元测试,建立您期望从每个调用中获得的请求和响应。

默认情况下,Pact 启动一个模拟服务器,它将指向您的 react 前端应用程序(您的消费者测试)中的 pact 测试发出的请求。这些测试一旦执行,就会在 json 中生成协议文件。然后应该由您的 API 执行协议文件,以便 API 知道它不会破坏前端。

看起来您正在尝试使用 pact 进行集成测试。Pact 不是正确的工具,因为您只需要一个调用 django API 来验证响应的测试。没有简单的方法来启动合同测试并全速运行。不过,这很容易上手,但是如果没有正确的设置,您将无法获得所需的一切,而且它也涉及到 devops 工作。

每当我需要测试与协议之外的 API 的集成时,我会做的是:

  • 确保 API 调用在方法中被隔离,以便于对您需要的每个单独的 API 方法调用进行单元测试;这太容易错过了,它会导致复杂的、不可靠的测试,因为您最终不得不在测试用例中放入大量逻辑,只是为了让它们返回您需要的响应;
  • 创建一个调用该方法的测试,然后调用您的 API 并为您提供所需的响应;

快速示例:假设您有一个允许用户创建配置文件的功能。逻辑都在一个名为 createNewUserProfile 的函数中

  • 调用 GET /user 传递用户 id 以查看用户是否存在
  • 调用 GET /location 以获取用户位置信息,以便您可以添加到用户配置文件
  • 调用 POST /user 将用户信息传递到您的后端以创建用户
  • 从 GET 或 POST 返回响应,具体取决于调用哪一个

此方法包含您的所有逻辑。所以你应该把它分解成

  • 一个执行 getUser 并调用 GET /user
  • 一个执行 getCurrentLocation 并调用 GET /location
  • 一个使用您拥有的数据调用 POST /user 的 createUser 。
  • 重构 createNewUserProfile 以调用上面列出的方法。

然后,您将为每个 getUser、getCurrentLocation、createUser 进行一次 API 集成测试,而对于更广泛的 createNewUserProfile,您将不需要进行一次 API 集成测试,因为如果您有多个被业务逻辑包围的调用,则很难找出失败的原因。

如果示例不够好,请告诉我,请随时给我们提供更多示例,以便我提供更详细的信息。

祝你好运!


推荐阅读