微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

pact.io:选择特定端点进行提供者测试

如何解决pact.io:选择特定端点进行提供者测试

我们正在运行微服务架构,并希望在我们的项目中设置合约测试。我们的消费者不知道哪个请求由哪个微服务处理。我们希望我们的微服务从它们应该参与的协议中选择交互。

示例:

  • 消费者 A 编写了一个测试 POST /users 的测试。
  • 消费者 A 使用不同的参数为 POST /users 编写了第二个测试。
  • 消费者 A 为 GET /users/$userId 编写测试。
  • 消费者 A 为 GET /articles/$articleId 编写测试。
  • 微服务 A 处理所有 POST /users 请求。
  • 微服务 B 处理所有 GET /users/$userId 请求。
  • 微服务 C 处理所有 GET /articles/$articleId 请求。
  • 所有消费者测试在其交互中只有一个请求。

我们希望将提供者测试放在微服务旁边。每个微服务应该只测试它能够处理的端点。在这种情况下,微服务 A 将测试所有 POST /users 合同。微服务 B 将选择 GET /users/$userId 合同等。

有没有办法使用 pactflow.io 和 nodejs 绑定来实现 pact?

编辑:添加了架构图:

Architecture Diagram

解决方法

不,Pact 中没有支持该用例的内置功能。

我们已经讨论了以这种方式发布对消息的期望的可能性,而不是 HTTP(因为这有点不寻常,不像 Kafka 这样的消息队列通常有更多的间接性)。

您是否在使用某种形式的动态 API 网关?

您将面临的一个挑战是以可靠的方式对请求本身进行逆向工程。

想法

我唯一的建议是在提供方测试中使用代理, 知道不同的端点,并将请求重定向到正确的提供方。但随后状态处理变得困难。

您当然也可以手动获取契约,然后拆分它们,但是您会失去契约所具有的很多价值。

我不确定消费者不了解提供者是否更像是一种哲学、实践或其他方面的事情,但显然最简单的解决方案可能是让消费者了解他们的提供者。

提出功能请求

也许更清楚地说明您的用例并在 https://pact.canny.io/ 请求功能可能是值得的,以了解您的用例与更广泛的社区的相关性以及是否值得实施。

,

我们已经找到了解决我们特定问题的方法:

  • 消费者不知道哪个服务充当提供者,但它知道它调用的(HTTP 方法、URL)元组。
  • 微服务知道它负责的每个(HTTP 方法、URL)。

我们将提供者定义为元组(HTTP 方法、URL)。因此,一个消费者包含针对多个提供者的多个测试,而一个微服务也包含针对多个提供者的多个测试。

node.js 中为消费者提供的类似内容:

const consumer = "MyConsumer";

const providerGetArticles = new Pact({ consumer,provider: 'GET-articles',...  });

const providerGetArticlesArticleId = new Pact({ consumer,provider: 'GET-articles-:articleId',...  });

const providerPostUsers = new Pact({ consumer,provider: 'POST-users',...  });

const providerGetUsers = new Pact({ consumer,provider: 'GET-users',...  });

const providerGetUsersUserId = new Pact({ consumer,provider: 'GET-users-:userId',...  });

providerGetArticles.setup().then(() => {
  providerGetArticles.addInteraction(
    {
      withRequest: { method: 'GET',path: '/articles' },...


providerGetArticlesArticleId.setup().then(() => {
  providerGetArticlesArticleId.addInteraction(
    {
      withRequest: { method: 'GET',path: '/articles/12345' },...

providerPostUsers.setup().then(() => {
  providerPostUsers.addInteraction(
    {
      withRequest: { method: 'POST',path: '/users' },...

对于处理 GET /articlesGET /articles/:articleId 的微服务来说,就像这样

new Verifier({ provider: 'GET-articles',... }).verifyProvider()...

new Verifier({ provider: 'GET-articles-:articleId',... }).verifyProvider()...

我们现在可以单独启动单个微服务并运行提供者测试。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。