代码之家  ›  专栏  ›  技术社区  ›  user1523236

如何使用pactjs为不同的环境处理不同的路径参数

  •  0
  • user1523236  · 技术社区  · 6 年前

    我已经开始实施CDC测试协议。我如何处理我们在不同环境的路径中传递不同参数的场景?

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

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

    对于不同的环境(QA、UAT等),必须传递特定于该环境的唯一数据,以获得有效的200响应。所以在我的示例中,对于每个env,carid和userid必须是不同的。当我最初设置测试时,我使用了我们的QA环境,并生成了以下契约。

    {
      "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 回复  |  直到 6 年前
        1
  •  0
  •   Matthew Fellows    6 年前

    您可以使用 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
  •   Fabricio Lemos    6 年前

    依赖外部环境变量来运行测试通常不是一个好主意,主要是因为使用客户机驱动的合同的好处之一是,可以单独测试生产商,甚至与环境隔离。这意味着您的测试应该设置它所依赖或灵活的东西,而不依赖于特定的环境配置。这是您应该为任何自动化测试做的,而不仅仅是CDC。

    例如,在您的场景中,您可以在测试开始之前创建契约中指定的用户,或者模拟用户适配器以返回有效的用户,而不管用户ID是否通过。这里的答案将取决于您的消费者如何使用 nodeId userId .

        3
  •  0
  •   Beth Skurrie    6 年前

    提供程序验证通常针对本地计算机或持续集成构建节点上本地运行的提供程序运行。它并不是针对部署的环境运行的,它在某种程度上破坏了像这样使用它的目的。合同测试的好处是你应该知道 之前 您可以部署服务是否可以协同工作。加入我们 slack.pact.io 如果你对此感到困惑,请和我们谈谈。