Postman全局函数

/ 测试 / 没有评论 / 3188浏览

原理讲解

Postman支持程度

由于Postman只支持存储字符串,并且不支持全局函数。所以要支持全局函数,首先需要将函数转换为字符串,然后将字符串通过eval转换成函数。

eval函数的限制

在把函数字符串转换为函数的过程中,你需要了解一个知识点,eval只是去执行javascript字符串代码。如:

var str = "console.log('1')";
eval(str);

那么,我们的目的是通过eval去执行一个字符串,这个字符串返回一个函数,达到如下的效果:

var func = eval("...");
func(para1,para2);

javascript返回一个函数

  1. 首先创建一个函数,这个函数返回一个函数
var func = function(){
    return function(x){
    	console.log('x:'+x);
    };
}
  1. 执行该函数,让eval可以获取到返回值
 // var funcTo = eval(str)
var funcTo = func();
var x = 1;
funcTo(x);
// 输出 x:1
  1. 优化该函数,方便直接执行.首先需要吧原来的函数用括号扩起来,然后后面增加()执行。
var funcTo = (function(){
 	return function(x){
    	console.log('x:'+x);
    };
})();
  1. 然后我们将函数转换为字符串
var funcString =  "(function(){ return function(x){ console.log('x:'+x);  }; })();";
var funcTo = eval(funcString);
  1. 动态函数字符串
function funcFrom( func) {
	return "(function(){return  " + func + ";})()";
}
var funcString = funcFrom(function(x){
	console.log('x:'+x);
});
var funcTo = eval(funcString);
  1. 增加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