如何使用pactjs

时间:2018-07-19 19:59:49

标签: javascript pact

我已经开始为CDC测试实施PACT。在不同环境的路径中传递不同参数的情况下,我该如何处理?

例如,我的测试调用一个函数,该函数通过命中端点并传递一些参数来从服务中请求一些数据。非常标准。

例如:api/nodeId/${nodeId}/userId/${userId}

对于不同的环境(QA,UAT等),必须传递特定于该环境的唯一数据,以得出有效的200响应。因此,在我的示例中,每个环境的carId和userId必须不同。最初设置测试时,我使用了质量检查环境,并生成了以下合同。

{
  "consumer": {
    "name": "myConsumer"
  },
  "provider": {
    "name": "myProvider"
  },
  "interactions": [
    {
      "description": "a request to view nodes",
      "request": {
        "method": "GET",
        "path": "/api/nodeId/RRTT6-3AFA-4B5B-BF76-5B6AC7/userId/123456789",
        "headers": {
          "Content-Type": "application/x-www-form-urlencoded",
        }
      },
      "response": {
        "status": 200,
        "headers": {
          "Content-Type": "application/json"
        },
        "body": {
          "startTime": 1549652248000,
          "endTime": 1549911448000,
          "startPrice": 83576,
          "reservePrice": 83876,
          "price": 84576,
          "status": null,
          "groupList": [
            "78945"
          ],
          "bids": 0,
        }
      }
    }
  ],
  "metadata": {
    "pactSpecification": {
      "version": "2.0.0"
    }
  }
}

如您所见,协定中的路径具有硬编码的nodeId和userId。如果我尝试针对其他环境进行验证,则这些测试将失败。那么,如何在不同的环境中重复使用同一合同?目前,针对不同的环境,我正在为每个环境生成单独的合同,但是似乎必须有另一种方法。

3 个答案:

答案 0 :(得分:0)

依靠外部环境变量来运行测试通常不是一个好主意,主要是因为使用“客户驱动合同”的优点之一是可以隔离生产者,甚至与环境隔离,对生产者进行测试。这意味着您的测试应设置其依赖或灵活的事物,而不依赖特定的环境配置。对于任何自动化测试,不仅CDC,这都是您应该做的。

例如,在您的方案中,您可以在测试开始之前创建合同中指定的用户,或者模拟您的用户适配器以返回有效用户,无论传递的用户ID是什么。答案将取决于您的消费者如何使用export default { key: process.env.KEY; }; nodeId

答案 1 :(得分:0)

您可以将term Matcher用于动态路径,但是正如Fabrico警告说的那样,在每个环境中拥有特定的数据段是一件很危险的游戏。出于各种原因,提供程序具有不同的ID是很常见的,因此在可能的情况下,请尝试使测试脱离依赖于这些ID。

例如使用路径匹配器:

const { Pact, Matchers } = require('@pact-foundation/pact');
const { term } = Matchers;

provider.addInteraction({
  state: 'has node ID 1234 and user with ID 5678',
  uponReceiving: 'a request to view nodes',
  withRequest: {
    method: 'GET',
    api/nodeId/${nodeId}/userId/${userId}
    path: term({ generate: '/api/nodeId/RRTT6-3AFA-4B5B-BF76-5B6AC7/userId/123456789', matcher: '/api/nodeId/[A-Z0-9\-]+/userId/[0-9]+' })
  },
  willRespondWith: {
    status: 200,
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: { ... }
  }
})

答案 2 :(得分:0)

通常在本地计算机或持续集成构建节点上针对本地运行的提供程序进行提供程序验证。它并非旨在在已部署的环境中运行,并且在某种程度上违背了使用它的目的。合同测试的优势在于,您应该在部署之前 知道服务是否可以协同工作。如果您对此感到困惑,请加入slack.pact.io,与我们交谈。