Pact:如何设置提供者状态
Pact: how to set up provider states
我正在查看 Pact 的 Python implementation 并尝试设置提供商状态。似乎说这样做的方法是让提供者在服务中内置一个端点,调用该端点以使提供者处于正确的状态。问题是我找不到任何关于该端点实际应该是什么样子的文档。输入是什么,它有什么作用return,等等
我试着查看默认值 ruby implementation,它似乎暗示了一种完全不同的机制,可以将提供程序置于特定状态。看起来它使用了一个 ruby 模块,该模块由验证程序脚本获取 require
d,根本不涉及 HTTP 请求。
设置提供商状态的正确方法是什么?如果它需要设置额外的端点,我需要知道该端点应该是什么样子。如果它需要将 class/module 导入验证程序脚本,我需要知道它是如何用 ruby.
以外的语言实现的
根据 the documentation in Pact-Python,您如何实际完成此任务有点开放性。就个人而言,我会怎么做,比如说,我通常不使用 Python 的节点提供者在我的提供者测试中,我会在未使用的端口上创建一个服务器,其目的是从协议接收状态并正确设置它们。一旦您 运行 进行了测试,这个小型服务器就会受到包含消费者、提供者和状态的 JSON 文件的影响。
例如,这里有一个节点示例:
var http = require('http');
beforeAll(function(){
// PROVIDER STATE LISTENER
http.createServer(function (req, res) {
var body = [];
// Ignore this bit, this is just how node does server request/response
req.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
// Get body, parse JSON. JSON includes 'consumer' string and 'states' array of string
var json = JSON.parse(Buffer.concat(body).toString());
// THIS IS WHERE YOU NEED TO SETUP YOUR STATE
res.status = 200;
switch(json.state) {
case "When User does something": // this is the actual name of the state that's specified by your consumer, which is found in the contract
// Setup any data that relates to your state here, like adding rows to a DB, setting environment variables, etc
break;
// Add another states that are used in your provider tests
default:
res.status = 500;
res.statusMessage = "Missing state '" + json.state + "'";
}
res.end(); // Send the response back
});
}).listen(9001);
})
// Run your tests
it("Test Pact Interactions", function() {
return pact.verifyPacts({
// options here
providerStatesSetupUrl: "http://localhost:9001"
});
});
我希望这是有道理的。
这是提供商状态的文档https://github.com/pact-foundation/pact-provider-verifier/#api-with-provider-states
API 与提供者状态
阅读 docs.pact.io 上的提供者状态部分,了解提供者状态的介绍。
为了在每次交互重播之前设置正确的数据,您需要创建一个接受 JSON 文件看起来像:
{
"consumer": "CONSUMER_NAME",
"state": "PROVIDER_STATE"
}
端点应为给定的消费者同步设置给定的提供者状态,并且 return 如果提供者状态未被识别则出错。如果多个消费者使用不同的数据定义相同的提供者状态,则在每个消费者中命名您的提供者状态将避免冲突。
运行 CLI 时需要以下标志:
--provider-states-setup-url
- 设置活动消费者和提供者状态的端点的完整 url。
与其拆除每次交互后创建的特定测试数据,不如在每次设置调用开始时清除所有现有数据。这是一种更可靠的方法,可确保您的测试数据不会从一个测试泄漏到另一个测试。
请注意,HTTP 端点不必实际位于您的应用程序中。它只需能够访问与您的应用程序相同的数据存储。因此,如果您无法在测试套件期间添加 "test only" 端点,请考虑制作一个单独的应用程序,将凭据共享到您应用程序的数据存储区。
我正在查看 Pact 的 Python implementation 并尝试设置提供商状态。似乎说这样做的方法是让提供者在服务中内置一个端点,调用该端点以使提供者处于正确的状态。问题是我找不到任何关于该端点实际应该是什么样子的文档。输入是什么,它有什么作用return,等等
我试着查看默认值 ruby implementation,它似乎暗示了一种完全不同的机制,可以将提供程序置于特定状态。看起来它使用了一个 ruby 模块,该模块由验证程序脚本获取 require
d,根本不涉及 HTTP 请求。
设置提供商状态的正确方法是什么?如果它需要设置额外的端点,我需要知道该端点应该是什么样子。如果它需要将 class/module 导入验证程序脚本,我需要知道它是如何用 ruby.
以外的语言实现的根据 the documentation in Pact-Python,您如何实际完成此任务有点开放性。就个人而言,我会怎么做,比如说,我通常不使用 Python 的节点提供者在我的提供者测试中,我会在未使用的端口上创建一个服务器,其目的是从协议接收状态并正确设置它们。一旦您 运行 进行了测试,这个小型服务器就会受到包含消费者、提供者和状态的 JSON 文件的影响。
例如,这里有一个节点示例:
var http = require('http');
beforeAll(function(){
// PROVIDER STATE LISTENER
http.createServer(function (req, res) {
var body = [];
// Ignore this bit, this is just how node does server request/response
req.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
// Get body, parse JSON. JSON includes 'consumer' string and 'states' array of string
var json = JSON.parse(Buffer.concat(body).toString());
// THIS IS WHERE YOU NEED TO SETUP YOUR STATE
res.status = 200;
switch(json.state) {
case "When User does something": // this is the actual name of the state that's specified by your consumer, which is found in the contract
// Setup any data that relates to your state here, like adding rows to a DB, setting environment variables, etc
break;
// Add another states that are used in your provider tests
default:
res.status = 500;
res.statusMessage = "Missing state '" + json.state + "'";
}
res.end(); // Send the response back
});
}).listen(9001);
})
// Run your tests
it("Test Pact Interactions", function() {
return pact.verifyPacts({
// options here
providerStatesSetupUrl: "http://localhost:9001"
});
});
我希望这是有道理的。
这是提供商状态的文档https://github.com/pact-foundation/pact-provider-verifier/#api-with-provider-states
API 与提供者状态
阅读 docs.pact.io 上的提供者状态部分,了解提供者状态的介绍。
为了在每次交互重播之前设置正确的数据,您需要创建一个接受 JSON 文件看起来像:
{
"consumer": "CONSUMER_NAME",
"state": "PROVIDER_STATE"
}
端点应为给定的消费者同步设置给定的提供者状态,并且 return 如果提供者状态未被识别则出错。如果多个消费者使用不同的数据定义相同的提供者状态,则在每个消费者中命名您的提供者状态将避免冲突。
运行 CLI 时需要以下标志:
--provider-states-setup-url
- 设置活动消费者和提供者状态的端点的完整 url。
与其拆除每次交互后创建的特定测试数据,不如在每次设置调用开始时清除所有现有数据。这是一种更可靠的方法,可确保您的测试数据不会从一个测试泄漏到另一个测试。
请注意,HTTP 端点不必实际位于您的应用程序中。它只需能够访问与您的应用程序相同的数据存储。因此,如果您无法在测试套件期间添加 "test only" 端点,请考虑制作一个单独的应用程序,将凭据共享到您应用程序的数据存储区。