在 NodeJS 中运行 Postman Newman 时使用测试修改环境

Posted

技术标签:

【中文标题】在 NodeJS 中运行 Postman Newman 时使用测试修改环境【英文标题】:Modify environment with tests while running Postman Newman in NodeJS 【发布时间】: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 完成,抱歉耽搁了! 谢谢。我添加了一个对我有用的基本答案。 【参考方案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,但claimNumXML 的工作方式相同,就像您的示例一样。

这是解决问题的一种方法,但由于它没有使用 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)还是只是文档知识?

以上是关于在 NodeJS 中运行 Postman Newman 时使用测试修改环境的主要内容,如果未能解决你的问题,请参考以下文章

需要有关如何将 Postman 的 Newman 与 Nodejs 一起使用的示例吗?

Jenkins+postman+newman

Linux postman脚本运行环境配置

Linux postman脚本运行环境配置

Linux postman脚本运行环境配置

在 NodeJS/Express 中将带有其他键值参数的图像上传到 postman