当前位置: 首页 > 知识库问答 >
问题:

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

李谦
2023-03-14

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

例如,我的测试调用一个html" target="_blank">函数,该函数通过命中endpoint并传递一些参数来请求服务中的一些数据。非常标准。

E、 G: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个答案

翟奇
2023-03-14

提供程序验证通常针对本地计算机或持续集成生成节点上本地运行的提供程序运行。它并不打算针对已部署的环境运行,这样使用它在某种程度上违背了目的。契约测试的优点是,在部署服务之前,您应该知道这些服务是否能够协同工作。放松地加入我们。契约如果你对此感到困惑,请与我们谈谈。

袁鸿畴
2023-03-14

依靠外部环境变量来运行测试通常不是一个好主意,主要是因为使用客户机驱动的契约的优点之一是,您的生产者可以在隔离的情况下进行测试,甚至可以与环境隔离。这意味着您的测试应该设置它所依赖的东西,或者应该灵活,而不依赖于特定的环境配置。这是任何自动测试都应该做的,而不仅仅是CDC。

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

黄弘盛
2023-03-14

您可以使用术语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: { ... }
  }
})
 类似资料:
  • 对于登录页面自动化,用户需要输入用户id、安全答案和密码。不同的环境有不同的用户。例如,qa和dev环境的用户具有不同的用户id、安全答案和密码。那么在自动化测试中如何妥善处理用户信息呢?我们可以将所有的属性存储在属性文件中,还有其他更好的解决方案吗?

  • A Zen student went up to a hot dog vendor and said: "Make me one with everything". — Joke 环境背景很重要。 如果你想对 Puppet 的配置清单在应用到生产环境之前先进行测试, 你可以使用 Puppet 的 environment 特性来做到。 这可以让你根据环境应用不同的配置清单来设置客户机。例如,你可以定

  • 我有一个服务,它可以基于头有两种不同的主体参数。 例如。对于路径: > 如果使用 ,则 POST 可以将 作为正文参数。 如果使用了,那么POST应该使用一些不同的主体参数来调用函数并返回不同的响应。 关于如何在OpenAPI(Swagger)中体现这一点,有什么建议吗?

  • 本文向大家介绍spring Profile如何为不同环境提供不同的配置支持,包括了spring Profile如何为不同环境提供不同的配置支持的使用技巧和注意事项,需要的朋友参考一下 说明 Profile为在不同环境下使用不同的配置提供了支持(开发环境下的配置和生产环境下的配置肯定是不同的, 例如, 数据库的配置) 。 在spring开发中用@Profile 注解使用来选择行配置系统属性。而在sp

  • 问题内容: 我目前在“开发”框中安装了Jenkins实例。这样可以很好地构建并且可以毫无问题地部署到我们的开发环境中。 在构建过程中,我的项目使用了一个包含诸如数据库连接URL之类的详细信息的属性文件(诸如此类的详细信息显然会因我所指向的环境而异)。 我想知道的是配置项目的最佳方法是什么,以便当我想将Jenkins构建的WAR文件发布到Production中时,它包含Production属性而不是

  • 我有一个拓扑,其中我有2个不同的源主题(2个子拓扑)。其中一个是Avro格式,另一个是JSON格式。有没有办法为不同的处理器使用不同的SERDE?我已经看到商店里有消费。使用()但我看不到处理器有这样的功能。 除了编写自己的序列化程序或反序列化程序来区分主题和相应的序列化/反序列化之外,是否有使用不同Serde的配置?