django - 为 django api 设置消费者驱动的合同测试并响应客户端的合适方法是什么?
问题描述
我刚刚学到了一个新术语,叫做消费者驱动的合同测试。
我在想也许它可以帮助我解决我为 django api 提供者编写测试和响应前端架构项目的问题。
前端和 Django API 后端位于不同的存储库中,并且有自己的单元测试。
但是,偶尔会出现错误,因为前端假设了 Django 服务后端未返回的某些字段。
我最初考虑编写端到端测试,但它们运行缓慢且非常脆弱。
我发现了这种消费者驱动的合同测试,这听起来是正确的。但是当我四处搜索时,我找不到任何合适的东西。甚至Pact似乎也只是为了将合同转换为消费者测试。
针对这种情况进行消费者驱动的合同测试的适当简单方法是什么?
解决方案
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 集成测试,因为如果您有多个被业务逻辑包围的调用,则很难找出失败的原因。
如果示例不够好,请告诉我,请随时给我们提供更多示例,以便我提供更详细的信息。
祝你好运!
推荐阅读
- javascript - Bootstrap 模态轮播重复内容
- python - 无法在 Python3 中将 NoneType 转换为 Float
- javascript - Angular Reactive Forms 多文件上传
- android - Android MPChart xAxis 偏移量
- reactjs - 应用状态改变时更新显示状态
- javascript - 为什么分号“意外”?
- reactjs - 如何从 create-react-app 项目中的代码渲染图像
- mysql - 如何手动将数据库从开发服务器同步到生产服务器
- nginx - 如何在 Kubernetes 托管应用程序中获取客户端 IP?
- winapi - 如何在 Win32 中读取鼠标的外观(指针、调整大小等)