原理讲解
Postman支持程度
由于Postman只支持存储字符串,并且不支持全局函数。所以要支持全局函数,首先需要将函数转换为字符串,然后将字符串通过eval转换成函数。
eval函数的限制
在把函数字符串转换为函数的过程中,你需要了解一个知识点,eval只是去执行javascript字符串代码。如:
var str = "console.log('1')";
eval(str);
那么,我们的目的是通过eval去执行一个字符串,这个字符串返回一个函数,达到如下的效果:
var func = eval("...");
func(para1,para2);
javascript返回一个函数
- 首先创建一个函数,这个函数返回一个函数
var func = function(){
return function(x){
console.log('x:'+x);
};
}
- 执行该函数,让eval可以获取到返回值
// var funcTo = eval(str)
var funcTo = func();
var x = 1;
funcTo(x);
// 输出 x:1
- 优化该函数,方便直接执行.首先需要吧原来的函数用括号扩起来,然后后面增加
()
执行。
var funcTo = (function(){
return function(x){
console.log('x:'+x);
};
})();
- 然后我们将函数转换为字符串
var funcString = "(function(){ return function(x){ console.log('x:'+x); }; })();";
var funcTo = eval(funcString);
- 动态函数字符串
function funcFrom( func) {
return "(function(){return " + func + ";})()";
}
var funcString = funcFrom(function(x){
console.log('x:'+x);
});
var funcTo = eval(funcString);
- 增加Postman全局变量做为中转
- 设置到变量中
// 定义函数的工具方法
function initFunc(funcName, func) {
postman.setGlobalVariable(funcName, "(function(){return " + func + ";})()");
}
initFunc("funcTo",function(x){
console.log('x:'+x);
});
- 读取变量字符串,转换为函数
var funcTo = eval(globals.funcTo);
具体实现
右击Postman项目,选择Edit,在Pre-request Scripts中填如代码:
代码内容
// 定义函数的工具方法
function initFunc(funcName, func) {
postman.setGlobalVariable(funcName, "(function(){return " + func + ";})()");
}
// 定义一个writeItem的函数, 可以在其他地方通过如下代码调用:
// 获取到函数
// var writeItem = eval(globals.writeItem);
// 执行函数
// writeItem(item,"name");
initFunc("writeItem", function (item, tag) {
// 遍历对象的键名称
for (var key in item) {
// 取得对象的值 item[key];
var value = item[key];
if (value instanceof Array) {
pm.globals.set(tag + key, JSON.stringify(value));
}
else {
pm.globals.set(tag + key, value);
}
}
});
// 定义一个 randUser的函数
initFunc("randUser", function () {
// 将配置用户转换为数组
var userIdJson = pm.variables.get("userIds");
var userIds = JSON.parse(userIdJson);
// 随机一个用户主题
var userIdPos = parseInt(userIds.length * Math.random());
var userId = userIds[userIdPos];
pm.globals.set("userId", userId);
// 随机一个查看用户主体
var viewUserIdPos = parseInt(userIds.length * Math.random());
var viewUserId = userIds[viewUserIdPos];
pm.globals.set("viewUserId", viewUserId);这个字符串返回一个函数
});
initFunc("randerPerson", function (personId) {
var person_length = parseInt(pm.variables.get("person_length") || "200");
var person_pos = parseInt(Math.random() * person_length);
// 选择当前用户位置作为主体
var randPersonId = "0" + person_pos;
if (randPersonId != personId) {
return randPersonId;
}
else {
return randerPerson(personId);
}
});
/**
* 随机取范围内不重复的数据
* max: 值的最大值
* length : 取得最大的数量
*/
initFunc("randNumberList", function (max, length) {
if (max < length) {
length = max;
}
// 要返回的结果
var mapResult = {};
var result = [];
function rand() {
// 从临时数组中随机取出一个
var pos = parseInt(Math.random() * max);
// 已经全部随机取完
if (mapResult[pos]) {
rand();
return;
}
// 将取得的结果放入结果集合
result.push(pos);
// 从tempList 删除已经取出的对象
mapResult[pos] = true;
}
// 随机取length次
for (var i = 0; i < length; i++) {
rand();
}
return result;
});
/**
* list: 来源数组
* length : 要取的随机数据的长度
* notCopy: 不复制,防止从list中取出的数据重复。
* 示例:
* 首先取总数10个出来,然后其中 三个用于A,另外3个用于,剩余用于C
* var total = randList(list,10); // llist.length > 10
* var A = randList(total,3,true); // total.length = 7
* var B =randList(total,3,true); // total.length = 4
* var C = total;
*/
initFunc("randList", function (list, length, notCopy) {
// 将来源数组放入临时数组,防止对list造成影响
var tempList = [];
if (notCopy) {
tempList = list;
}
else {
for (var i = 0; i < list.length; i++) {
tempList.push(list[i]);
}
}
// 要返回的结果
var result = [];
// 随机取length次
for (var i = 0; i < length; i++) {
// 已经全部随机取完
if (tempList.length < 1) {
break;
}
// 从临时数组中随机取出一个
var pos = parseInt(Math.random() * tempList.length);
var item = tempList[pos];
// 将取得的结果放入结果集合
result.push(item);
// 从tempList 删除已经取出的对象
tempList.splice(pos, 1);
}
return result;
});
调用方式
// 将全局字符串转换为函数
var randList = eval(globals.randList);
var randNumberList = eval(globals.randNumberList);
// 调用函数
var list10 = randNumberList(20000, 10);
console.log("list10:");
console.log(list10);
// 日志结果:
// list10: 12399,19876,5890,14697,9063,8270,18716,19745,162,6944
var list3 = randList(list10, 3, true);
console.log("list3:");
console.log(list3);
// 日志结果:
// list3: 19745 , 162, 19876
console.log("list10:");
console.log(list10);
// 日志结果:
// list10: 12399,5890,14697,9063,8270,18716,6944
var list4 = randList(list10, 4);
console.log("list4:");
console.log(list4);
// 日志结果:
// list10: 18716,14697,5890,6944
console.log("list10:");
console.log(list10);
// 日志结果:
// list10: 12399,5890,14697,9063,8270,18716,6944
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2020/05/20 08:00