在 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
,但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 的链接,您可能需要在脚本中使用options
或summary
对象。【参考方案3】:
虽然Newman API Ref 没有提及它,但您传递给newman.run
的options
对象确实支持以与@ 相同的方式写出全局变量和环境变量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',() => )
和 .on('item',() => )
没有属性 summary.environment
【讨论】:
这是你尝试过的东西(派对迟到了,不确定你是否仍然活跃 sansSpoon)还是只是文档知识?以上是关于在 NodeJS 中运行 Postman Newman 时使用测试修改环境的主要内容,如果未能解决你的问题,请参考以下文章