在NodeJS中运行Postman Newman时,通过测试修改环境

时间:2018-01-11 14:54:34

标签: node.js testing postman puppeteer newman

我在节点脚本中运行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文件,并且“value”将保持不变。在桌面应用程序中运行相同的参数时,它可以正常工作。

是否有解决方案,这是否有效?

UPDATE1:

这是纽曼剧本:

  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);"
            ]
        }
    }
],

3 个答案:

答案 0 :(得分:1)

Postman Github account

上查看了以下最近的问题

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

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

我创建了一个基本节点脚本来运行Newman,其中包含从Postman导出的Collection和Environment文件:

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增加。

Newman Test Run

在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"
    }
  ]
}

File Update

更新2

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

Newman Run Script

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') 
}
})

收集文件中的测试部分

    "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()))"
                ]
            }
        }
    ]

邮递员申请机构

Postman Request Body

脚本运行和更新环境文件

Newman Run

答案 1 :(得分:0)

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

--export-globals <path>

调用newman时,请添加此选项以更新globals.json

答案 2 :(得分:0)

尽管Newman API Ref没有提及,但是您传递给options的{​​{1}}对象确实支持在全局变量和环境变量中写出与newman.run CLI相同。提示在newman issues list中找到。

newman

还要注意,由于某些奇怪的原因,其他事件侦听器,例如: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',() => {})没有属性.on('item',() => {})