pact.io:Select 提供商测试的特定端点
pact.io: Select specific endpoints for provider test
我们是运行微服务架构,希望在我们的项目中设置合约测试。我们的消费者不知道哪个请求由哪个微服务处理。我们希望我们的微服务 select 来自它们应该参与的契约的交互。
示例:
- 消费者 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 将 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 /articles
和 GET /articles/:articleId
的微服务
new Verifier({ provider: 'GET-articles', ... }).verifyProvider()...
new Verifier({ provider: 'GET-articles-:articleId', ... }).verifyProvider()...
我们现在可以单独启动单个微服务,运行 提供程序测试。
我们是运行微服务架构,希望在我们的项目中设置合约测试。我们的消费者不知道哪个请求由哪个微服务处理。我们希望我们的微服务 select 来自它们应该参与的契约的交互。
示例:
- 消费者 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 将 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 /articles
和 GET /articles/:articleId
new Verifier({ provider: 'GET-articles', ... }).verifyProvider()...
new Verifier({ provider: 'GET-articles-:articleId', ... }).verifyProvider()...
我们现在可以单独启动单个微服务,运行 提供程序测试。