原理讲解
Postman支持程度
由于Postman只支持存储字符串,并且不支持全局函数。所以要支持全局函数,首先需要将函数转换为字符串,然后将字符串通过eval转换成函数。
eval函数的限制
在把函数字符串转换为函数的过程中,你需要了解一个知识点,eval只是去执行javascript字符串代码。如:
var str = "console.log('1')";
eval(str);
那么,我们的目的是通过eval去执行一个字符串,这个字符串返回一个函数,达到如下的效果:
var str = "console.log('1')";
eval(str);
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中填如代码:
代码内容
```csharp // 定义函数的工具方法 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);
}
调用方式
```csharp // 将全局字符串转换为函数 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
```