Pact:如何设置提供者状态

Pact: how to set up provider states

我正在查看 Pact 的 Python implementation 并尝试设置提供商状态。似乎说这样做的方法是让提供者在服务中内置一个端点,调用该端点以使提供者处于正确的状态。问题是我找不到任何关于该端点实际应该是什么样子的文档。输入是什么,它有什么作用return,等等

我试着查看默认值 ruby implementation,它似乎暗示了一种完全不同的机制,可以将提供程序置于特定状态。看起来它使用了一个 ruby 模块,该模块由验证程序脚本获取 required,根本不涉及 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" 端点,请考虑制作一个单独的应用程序,将凭据共享到您应用程序的数据存储区。