【问题标题】:Modify environment with tests while running Postman Newman in NodeJS在 NodeJS 中运行 Postman Newman 时使用测试修改环境
【发布时间】:2018-06-20 22:48:18
【问题描述】:

我在节点脚本中运行 Newman。该集合具有环境变量,例如 {{claimNum}},会随着测试的每个帖子而增加。

示例

我有这个集合请求正文

 <ClaimIdentification>
      <company>0001</company>
      <office>100</office>
      <claimNum>{{claimNum}}</claimNum>
 </ClaimIdentification>

而在全球环境 JSON:

  {
  "enabled": true,
  "key": "claimNum",
  "value": "15200",
  "type": "text"
},

并且该集合有这个测试

pm.globals.set("claimNum", + pm.globals.get("claimNum") + 1);

但在脚本中运行时,global.json 文件不会被修改,“值”将保持不变。在桌面应用程序中运行相同的参数时,它可以工作。

是否有解决方案,这是否可行?

更新1:

这是新人脚本:

  collection: require('${__dirname}/ThirdServiceInjured.json'),
  reporters: 'json',
  globals: require('${__dirname}/globals.json')

}).on('done', function (err, summary) {
  if (err || summary.error) {
      console.error('>>> ERROR - Collection run failed.');
  }
  else {
    console.log(success('Collection run completed:'));  
    console.log(summary.run.executions[0].response.text());
  }
});

更新 2:

使用这个脚本,仍然没有覆盖环境:

const newman = require('newman'); // require newman in your project
const fs = require('fs');
const envName = '${__dirname}/environment_qbe600.json';
const env = require('${__dirname}/environment_qbe600.json');

newman.run({
  collection: require('${__dirname}/ThirdServiceInjured.json'),
  reporters: 'cli',
  environment: envName,
  iterationCount: 3

}).on('done', function (err, summary) {
  if (err || summary.error) {
      console.error('>>> ERROR - Collection run could failed.');
}
else {
  const newmanValue = summary.environment.values.members[0].value;
  env.values[0].value = newmanValue;
  console.log(summary.run.executions[0].response.text());
  fs.writeFile(envName, JSON.stringify(env, null, 2), function (err) {
    if (err) return
  })
}
});

更新 3:

这是环境:

{
  "id": "ecabb925-829e-69f8-2348-f71dc76c0e87",
  "name": "Test",
  "values": [
    {
      "enabled": true,
      "key": "host",
      "value": "${___server}",
      "type": "text"
    },
    {
      "enabled": true,
      "key": "company",
      "value": "0001",
      "type": "text"
    },
    {
      "enabled": true,
      "key": "claimNbr",
      "value": "14600",
      "type": "text"
    },
    {
      "enabled": true,
      "key": "dni",
      "value": "150",
      "type": "text"
    },
    {
      "enabled": true,
      "key": "cost",
      "value": "107000",
      "type": "text"
    },
    {
      "enabled": true,
      "key": "testNum",
      "value": "157",
      "type": "text"
    }
  ],
  "timestamp": 1515789551332,
  "_postman_variable_scope": "environment",
  "_postman_exported_at": "2018-01-12T20:39:14.795Z",
  "_postman_exported_using": "Postman/5.5.0"

还有来自集合的测试部分:

"event": [
    {
        "listen": "test",
        "script": {
            "type": "text/javascript",
            "exec": [
                "pm.environment.set(\"claimNbr\", +pm.environment.get(\"claimNbr\") + 1);",
                "pm.environment.set(\"testNum\", +pm.environment.get(\"testNum\") + 1);",
                "pm.environment.set(\"dni\", +pm.environment.get(\"dni\") + 1);",
                "pm.environment.set(\"cost\", +pm.environment.get(\"cost\") + 1000);"
            ]
        }
    }
],

【问题讨论】:

  • 该变量的语法是否有效? pm.globals.set("claimNbr", pm.globals.get("claimNbr") + 1) 不是你需要的吗?
  • 我的是 JSON 导出时的语法。但是是的,在桌面应用程序上是:pm.globals.set("claimNum", +pm.globals.get("claimNum") + 1);
  • 请问您能否使用 Newman 使用您的节点脚本更新问题?
  • @DannyDainton 完成,抱歉耽搁了!
  • 谢谢。我添加了一个对我有用的基本答案。

标签: node.js testing postman puppeteer newman


【解决方案1】:

Postman Github account 上查看了以下最近的问题

如果您将global 变量更改为environment 变量,您可以在每次运行时查看更新后的值。我刚刚将您的 test 代码更改为 environment 而不是 global

pm.environment.set("claimNum", + pm.environment.get("claimNum") + 1)

我创建了一个基本节点脚本来使用从 Postman 导出的集合和环境文件运行 Newman:

var newman = require('newman')

newman.run({
    collection: `${__dirname}/default_collection.json`,
    environment: `${__dirname}/default_environment.json`,
    reporters: 'cli',
    iterationCount: 10
  }, (err) => {
    if (err) { throw err }
  })

我在 newman 脚本中引用的两个文件:

default_collection.json

{
    "info": {
        "name": "Test_Collection",
        "_postman_id": "d08f1b36-591a-f25f-aaaa-4368ca966fb4",
        "description": "",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "item": [
        {
            "name": "Test_Request",
            "event": [
                {
                    "listen": "test",
                    "script": {
                        "id": "068b6634-e310-46e9-86fc-265376c65ff6",
                        "type": "text/javascript",
                        "exec": [
                            "console.log(pm.environment.get('claimNum'))"
                        ]
                    }
                }
            ],
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ],
                "body": {
                    "mode": "raw",
                    "raw": "{\n\t\"id\": {{claimNum}}\n}"
                },
                "url": {
                    "raw": "localhost:3000/test",
                    "host": [
                        "localhost"
                    ],
                    "port": "3000",
                    "path": [
                        "test"
                    ]
                },
                "description": ""
            },
            "response": []
        }
    ],
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "id": "4c1d562f-e4d5-4017-8f25-48ac0b6aa3fc",
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        },
        {
            "listen": "test",
            "script": {
                "id": "026c029e-a427-4624-b196-3d8982a103f1",
                "type": "text/javascript",
                "exec": [
                    "pm.environment.set(\"claimNum\", + pm.environment.get(\"claimNum\") + 1)"
                ]
            }
        }
    ]
}

default_environment.json

{
  "id": "539073e6-adab-f812-95b0-82d4d82ce4b2",
  "name": "test_environment",
  "values": [
    {
      "enabled": true,
      "key": "claimNum",
      "value": "9",
      "type": "text"
    }
  ],
  "timestamp": 1515782483636,
  "_postman_variable_scope": "environment",
  "_postman_exported_at": "2018-01-12T18:42:04.661Z",
  "_postman_exported_using": "Postman/5.5.0"
}

我在脚本中添加了iterationCount: 10,这样我就可以看到每次迭代中claimNum 的增加。

在 Postman 中,我添加了一个简单的 console.log() 以在每次测试运行时写出 claimNum - 您可以在上图中看到输出。

console.log(pm.environment.get('claimNum'))

我的请求正文使用JSON,但{{claimNum}}XML 的工作方式相同,就像您的示例一样。

这是解决问题的一种方法,但由于它没有使用 global 变量,我不确定您的要求 - 它可能不是您想要的。


更新 1

根据您的用例 - 可以更新环境文件以显示上次运行的值,并可以在下一个请求中使用此值 - 这样它就不会针对静态文件中的相同值重复运行测试.运行以下代码将运行测试,然后更新 default_environment.json 文件中的值。

const newman   = require('newman')
const fs       = require('fs');
const fileName = `${__dirname}/default_environment.json`;
const file     = require(fileName);

newman.run({
    collection: `${__dirname}/default_collection.json`,
    environment: `${__dirname}/default_environment.json`,
    reporters: 'cli',
    iterationCount: 3
}).on('done', function (err, summary) {
  if (err || summary.error) {
    console.error('>>> ERROR - Collection run failed.');
  }
  else {
    const newmanValue = summary.environment.values.members[0].value
    file.values[0].value = newmanValue

    fs.writeFile(fileName, JSON.stringify(file, null, 2), function (err) {
      if (err) return
    })
  }
}) 

我的environment 文件在测试运行后将如下所示:

{
  "name": "test_environment",
  "values": [
    {
      "enabled": true,
      "key": "claimNum",
      "value": 19,
      "type": "text"
    }
  ]
}


更新 2

使用新信息再次修改了代码,这对我来说在本地工作:

纽曼运行脚本

const newman  = require('newman')
const fs      = require('fs')
const envName = `${__dirname}/default_environment.json`
const env     = require(envName)

newman.run({
  collection: require(`${__dirname}/default_collection.json`),
  reporters: 'cli',
  environment: envName,
  iterationCount: 3

}).on('done', function (err, summary) {
  if (err || summary.error) {
      console.error('ERROR - Collection run could failed')
}
else {
  const claimNbr  = summary.environment.values.members[0].value
  const testNum   = summary.environment.values.members[1].value
  const dni       = summary.environment.values.members[2].value
  const cost      = summary.environment.values.members[3].value

  env.values[0].value = claimNbr
  env.values[1].value = testNum
  env.values[2].value = dni
  env.values[3].value = cost

  fs.writeFile(envName, JSON.stringify(env, null, 2), function (err) {
    if (err) return
  })
  console.log('Collection run complete') 
}
})

Collection 文件中的测试部分

    "name": "Test_Request",
    "event": [
        {
            "listen": "test",
            "script": {
                "id": "a407e1e2-4961-4c65-af1b-22190b1ab0cc",
                "type": "text/javascript",
                "exec": [
                    "pm.environment.set(\"claimNbr\", + pm.environment.get(\"claimNbr\") + 1)",
                    "pm.environment.set(\"testNum\", + pm.environment.get(\"testNum\") + 1)",
                    "pm.environment.set(\"dni\", + pm.environment.get(\"dni\") + 1)",
                    "pm.environment.set(\"cost\", + pm.environment.get(\"cost\") + 1000)",
                    "",
                    "console.log(JSON.stringify(pm.response.json()))"
                ]
            }
        }
    ]

邮递员请求正文

脚本运行和更新环境文件

【讨论】:

  • 对不起,脚本中的--export-enviroment怎么调用?
  • 我不确定你是否也需要。这些标志只有在你从命令行运行它时才有用,你是从节点脚本运行它。在您的脚本中,您有 globals: 将其更改为 environment: 并在您的 global.json 文件中添加一个 environment.json 文件。确保你也为你的测试做同样的事情。
  • 在测试中检查你的语法,它应该是pm.environment而不是pm.globals
  • 添加更新以在每次运行后更改环境文件中的值。
  • 感谢您的耐心等待。我按照说明进行了操作,但仍然没有编写环境(我不再使用全局变量)。此外,身体响应是我需要的唯一有用的东西,有什么方法可以比:console.log(summary.run.executions[0].response.text()); 更好地记录它?
【解决方案2】:

您正在寻找的是这个选项:

--export-globals <path>

调用 newman 时添加此选项以更新您的 globals.json

【讨论】:

  • 取决于正在使用的 newman 实现 - --export-globals 标志 可能 不起作用,因为这仅在 CLI 上使用。这是指向Newman API 的链接,您可能需要在脚本中使用optionssummary 对象。
【解决方案3】:

虽然Newman API Ref 没有提及它,但您传递给newman.runoptions 对象确实支持以与@ 相同的方式写出全局变量和环境变量987654325@cli。提示在newman issues list 中找到。

newman.run({
    collection: '/path/to/collection.json',
    environment: require('/path/to/env'),
    exportEnvironment: '/path/to/env.json',
    globals: require('/path/to/global'),
    exportGlobals: '/path/to/global.json'
})
    .on('done', (err, summary) => {
        console.log(summary.environment.values);
    })

另请注意,由于某些奇怪的原因,其他事件侦听器如:.on('beforeItem',() =&gt; {}).on('item',() =&gt; {}) 没有属性 summary.environment

【讨论】:

  • 这是你尝试过的东西(派对迟到了,不确定你是否仍然活跃 sansSpoon)还是只是文档知识?
猜你喜欢
  • 2016-09-24
  • 2021-08-25
  • 2019-03-29
  • 2015-10-12
  • 2019-01-23
  • 2017-11-03
  • 2018-01-30
  • 2020-06-08
  • 2021-10-29
相关资源
最近更新 更多