pact.io:Select 提供商测试的特定端点

pact.io: Select specific endpoints for provider test

我们是运行微服务架构,希望在我们的项目中设置合约测试。我们的消费者不知道哪个请求由哪个微服务处理。我们希望我们的微服务 select 来自它们应该参与的契约的交互。

示例:

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

有没有办法使用 pactflow.io 和 nodejs 绑定协议?

编辑:添加架构图:

不,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()...

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