我需要帮助编写一个通用函数,以便在一组请求中使用,这将有助于构建框架。
我尝试使用以下格式
在第一个函数
的“测试”选项卡中声明了以下函数postman.setGlobalVariable("function", function function1(parameters)
{
//sample code
});
我在预请求中使用了以下内容
var delay = eval(globals.function);
delay.function1(value1);
我收到以下错误
评估预请求脚本时出错:无法读取属性' function1'未定义的。
任何人都可以帮我详细说明如何定义全局/通用功能并在请求中使用它们吗?
提前致谢
答案 0 :(得分:22)
没有eval
:
在集合的请求前脚本中定义一个包含您函数的对象,而无需使用let
,var
等。这会将其附加到Postman的全局沙箱对象。
utils = {
myFunc: function() {
return 'hello';
}
};
然后在您的请求的预请求或测试脚本部分中,只需调用函数:
console.log(utils.myFunc());
答案 1 :(得分:20)
我使用这个小黑客:
postman.setGlobalVariable("loadUtils", function loadUtils() {
let utils = {};
utils.reuseableFunction = function reuseableFunction() {
let jsonData = JSON.parse(responseBody);
console.log("foobar");
}
return utils;
} + '; loadUtils();');
tests['Utils initialized'] = true;
在另一个请求中,我可以重用全局变量loadUtils
:
let utils = eval(globals.loadUtils);
utils.reuseableFunction();
您还可以在此处查看Postman团队的开发者路线图: https://trello.com/b/4N7PnHAz/postman-roadmap-for-developers
集合级脚本是近期议程,应该很快就可以使用,直到那时你可以使用所示的方法。
答案 2 :(得分:3)
这个问题困扰了我一段时间,直到我找到了上面提到的通用方法。但是,它仍然为每个评估行保留一个警告图标,该图标在邮递员界面中指示“评估可能有害”。 最近,我找到了另一种方法并将其发布在这里: 用户可以在请求前脚本部分中使用所需的适当功能创建原型对象,如下所示:
Object.prototype.sayHello = function(name){
console.log(`Hello! ${name}`);
};
,然后在任何地方调用该函数。它只需要一个已定义的对象,就像这样:
let obj = {};
obj.sayHello(‘Griffin’);
或者您甚至不需要声明该对象,而是使用一些内置对象,例如lodash(您假设它具有功能:smile:)
_.sayHello(‘Griffin’);
它在我这边工作。我也把它张贴在邮递员论坛上 https://community.postman.com/t/global-functions-via-collection-level-folder/5927/6?u=franksunnn110
答案 3 :(得分:3)
一种更优雅的方法是在请求前脚本中使用全局上下文(而不是变量)。
例如,如果您希望在任何预请求脚本中都可以使用名为myFunction
的函数,则可以转到Edit Collection/Pre-request
并设置
globalThis.myFunction = function(){}
然后,您可以在集合内的任何请求的任何预请求脚本中调用myFunction
(无需对函数进行任何字符串化/评估)
答案 4 :(得分:2)
如果要在全局函数中调用pm.sendRequest
,请尝试以下操作:
在集合预请求中定义全局函数,如下所示:
postman.setGlobalVariable("globalFunction", (parameters) => {
console.log(parameters);
pm.sendRequest('https://google.com/', function(err, resp) {
pm.expect(err).to.not.be.ok;
});
});
使用如下函数:
eval(globals.globalFunction)('hello world!!');
注意,我使用箭头样式()=>{}
声明了功能。否则就行不通了
答案 5 :(得分:1)
您可以使用以下语法来提供更具可读性的解决方案,并有更多的可能性来分解代码(例如,直接在请求前脚本中从function1()
调用function2()
或声明包)>
初始化环境(或全局变量):
postman.setEnvironmentVariable("utils", () => {
var myFunction1 = () => {
//do something
}
var myFunction2 = () => {
let func1Result = myFunction1();
//do something else
}
return {
myPackage: {
myFunction1,
myFunction2
}
};
});
然后在以后的测试中使用您的函数:
let utils = eval(environment.utils)();
utils.myPackage.myFunction1(); //calls myFunction1()
utils.myPackage.myFunction2(); //calls myFunction2() which uses myFunction1()
奖金:
如果您正在调用API,并且需要等待调用完成才能执行测试,则可以执行以下操作:
postman.setEnvironmentVariable("utils", () => {
var myFunction = (callback) => {
return pm.sendRequest({
// call your API with postman here
}, function (err, res) {
if (callback) {
//if a callback method has been given, it's called
callback();
}
});
}
return {
myPackage: {
myFunction,
}
};
});
然后使用它:
utils.myPackage.myFunction(function() {
console.log("this is the callback !")
//perform test here
});
答案 6 :(得分:1)
您可以通过将以下函数分配给集合,环境或全局变量来声明全局函数:
(数字)=> {返回数字*数字}
要在您收藏中的其他地方重用此功能
let numberSquared = eval(pm.variables.get('global_func'))(5)
现在,numberSqaure变量的值为25
===============================
如果您需要声明一个函数库: 您可以创建一个集合变量并为其分配以下这段代码:
({
print:function() {
console.log('hello Postman')
},
squared:function(number) {
return number * number
}
})
注意:函数已用括号括起来
重用此库:
let lib = eval(pm.variables.get('global_func'))
lib1.print()
console.log(lib1.squared(4))
祝你好运:)
答案 7 :(得分:0)
将函数定义为全局变量,然后访问所有测试。
pm.environment.set("UTILS", `({ myFunction: (text) => console.log(text) })`)
调用函数
let utils = eval(pm.environment.get("UTILS"))
utils.myFunction('Test')
答案 8 :(得分:0)
上面的很多例子都会有 pm 变量的问题。为了在您的自定义 utils 方法中访问 pm 变量,您需要在 eval 之后将其传递到内部。最重要的是,为您的实用程序提供一些模块化是很好的。将此粘贴为名称下全局变量的值 -> Util
(function () {
const Util = function (pm) {
return {
customUtilFunction: function (customVariable) {
pm.environment.set("customVariable", customVariable);
}
}
}
return Util
}())
然后在您的测试中,您可以像下面那样调用它。
const Util = eval(pm.globals.get('Util'))(pm)
Util.customUtilFunction('myCustomVariableValue')