【问题标题】:Making an environment local for collection in Postman在 Postman 中创建本地收集环境
【发布时间】:2019-01-10 07:08:07
【问题描述】:

我看过邮递员关于环境的文档:

https://www.getpostman.com/docs/v6/postman/environments_and_globals/variables

图像表示环境是集合的本地环境,我没有在我的 Postman 中看到这种情况。

我有很多项目,每个项目都有自己的集合,我想为每个项目设置不同的环境 url。但是,我看到环境是通过所有集合共享的。如何使环境成为集合的本地环境?

谢谢!

【问题讨论】:

  • 如果您在集合文件夹上选择编辑,您可以在其中设置变量。然后可以使用 pm.variables.get('var_name') 在脚本中调用它 - 如果这就是您的意思?
  • 并非如此。我想为每个集合设置不同的环境变量值。例如,在我所有的项目中,我都有“开发”、“暂存”和“生产”环境,每个环境都有相应的“url”变量。这个 url 取决于项目,所以在所有集合之间共享环境不是我想要的。

标签: postman


【解决方案1】:

您发布的图片实际上定义了变量的解析方式。 你可以有不同类型的变量。

分别是:

  • 全局变量
  • 环境变量
  • 集合变量
  • 局部变量
  • 数据变量

假设您有一个变量“a”,其值为 5,定义为全局变量。 但是你也有一个 collection variable 'a' 值 '7' 因此,当您发送请求时,解析变量的顺序就是图片告诉您的。

全局 > 集合 > 环境 > 本地 > 数据 - 这是解决的顺序。

那么,就这样完成吧:

全局(a = 5)> 集合(a = 7)> 环境(a 未定义)> 本地(a 未定义)> 数据(a 未定义)

因此,经过解析顺序后,'a' 的最终值将是 7

环境变量可用于工作区中的所有集合 每个环境都特定于工作空间。 全局变量也是如此。

如果您只想使用特定于每个集合的变量,那么您需要使用 集合变量

要添加集合变量,只需转到侧边栏并将鼠标悬停在要为其添加变量的集合上,然后单击“●●●”

然后点击“编辑”>“变量”>添加您只需要特定于该集合的变量。

现在在请求中,您可以像使用其他变量一样使用这些变量。 例如:https://{{url}}/get?foo=bar

或在测试脚本中:

console.log(pm.variables.get('car'));  // 'astonMartin'

邮递员会为您完成剩下的工作。

当您拥有不同的环境(例如 PROD、STAGING、BETA 等)时,环境变量会派上用场。很多人都这样使用它们。 否则,它们只是变量,因此请随意使用。

或者,如果您想为几个集合使用一个环境,而为另一个集合使用另一个环境。 然后创建多个Workspaces,并为其添加对应环境的集合。最后,根据需要在这些工作区之间切换。

【讨论】:

  • 谢谢。所以最后,不可能为不同的集合定义不同的环境。不过应该是可以的。很多时候人们只为每个项目使用一个工作区和一个集合,它们应该有不同的环境变量。是否可以创建环境 PROD、STAGING 等?并将变量“url”的值设置为引用集合变量,如 {{url-staging}} ?
  • 但为什么“集合变量”不能为您解决这个问题?它旨在完全适合您的用例,只是您不能将其命名为“C1 变量”或“PROD”,并且根据不同的开发阶段具有不同的变量。
  • 您也可以通过api:pm.environment.get专门访问环境变量,并通过pm.environment.set函数进行设置。然后你可以指定条件,比如如果一个变量让我们说集合中的“STAGE”说“PROD”,然后使用所有的 PROD 环境变量。你可以做类似的东西。 :) 但实际上,切换环境也不难。在任何时候,您都将使用 1 个集合和 1 个请求来处理。此外,如果您使用的是集合运行器,那么您也将只使用 1 个集合和 1 个环境来运行。
  • 另外:pm.globals.getpm.globals.get API 也可用。
  • 集合变量将要求我使用 {{url-staging}}、{{url-production}} 而不是仅使用 {{url}} 并根据环境。对吗?
【解决方案2】:

我在这里找到了同样的问题,并想出了一种伪造它的方法。我的目标是能够轻松导出集合,而无需导出我的整个环境变量集(包括其他项目的环境变量)来支持它。

基本上,您为希望在集合中拥有的每组环境特定值创建一个代理变量。

首先,编辑您的集合并使用预请求脚本将环境名称设置为环境变量。我认为可能有一个内置变量,但没有找到。

pm.environment.set("envName", pm.environment.name)

接下来,在新的集合变量中使用该变量,该变量充当具有环境特定值的匹配变量的一种代理。或者,您也可以在预请求脚本中创建代理变量。

{{url}} -> {{{{envName}}-url}} -> {{ee-url}} -> your url for ee environment
                               -> {{pr-url}} -> your url for pr environment

最后,您可以正常使用代理变量了。

{{url}}

【讨论】:

  • 这行得通,谢谢分享,但多麻烦。
【解决方案3】:

或者干脆放弃邮递员的环境特性,简化并只使用 Pre-req 脚本和方法中的{{URL}},对每个集合重复:

const ENVIRONMENTS = {
    DEV: {
        name: "development", 
        url: "http://localhost:3000"
    }, 
    STAGE : {
        name: "staging", 
        url: "..."
    }, 
    PROD : {
        name: "production", 
        url: "..."
    } 
};
pm.collectionVariables.set("URL", (ENVIRONMENTS.DEV).url);

或者也许......使用 Postman 的环境功能只是为了设置环境变量??。 然后在每个集合预请求脚本中读取该变量,只需选择环境:

...

envName = pm.environment.get('Environment')
const selected = ENVIRONMENTS[envName]

pm.collectionVariables.set("URL", selected.url);
pm.collectionVariables.set("Token", selected.token);

【讨论】:

  • 很好的解决方案。我最终清除了十几个环境并省去了所有导出的麻烦。
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 2017-01-04
  • 2016-10-30
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多