原理讲解

Postman支持程度

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

eval函数的限制

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

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

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

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

JavaScript返回一个函数

  1. 首先创建一个函数,这个函数返回一个函数

    1. var func = function(){
    2. return function(x){
    3. console.log('x:'+x);
    4. };
    5. }
  2. 执行该函数,让eval可以获取到返回值

    1. // var funcTo = eval(str)
    2. var funcTo = func();
    3. var x = 1;
    4. funcTo(x);
    5. // 输出 x:1
  3. 优化该函数,方便直接执行.首先需要吧原来的函数用括号扩起来,然后后面增加()执行。

    1. var funcTo = (function(){
    2. return function(x){
    3. console.log('x:'+x);
    4. };
    5. })();
  4. 然后我们将函数转换为字符串

    1. var funcString = "(function(){ return function(x){ console.log('x:'+x); }; })();";
    2. var funcTo = eval(funcString);
  5. 动态函数字符串

    1. function funcFrom( func) {
    2. return "(function(){return " + func + ";})()";
    3. }
    4. var funcString = funcFrom(function(x){
    5. console.log('x:'+x);
    6. });
    7. var funcTo = eval(funcString);
  6. 增加Postman全局变量做为中转

  • 设置到变量中

    1. // 定义函数的工具方法
    2. function initFunc(funcName, func) {
    3. postman.setGlobalVariable(funcName, "(function(){return " + func + ";})()");
    4. }
    5. initFunc("funcTo",function(x){
    6. console.log('x:'+x);
    7. });
  • 读取变量字符串,转换为函数

    1. var funcTo = eval(globals.funcTo);

    具体实现

    右击Postman项目,选择Edit,在Pre-request Scripts中填如代码:Postman全局函数 - 图1

    代码内容

    ```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) {

    1. length = max;

    }

    // 要返回的结果 var mapResult = {}; var result = [];

    function rand() {

    1. // 从临时数组中随机取出一个
    2. var pos = parseInt(Math.random() * max);
    3. // 已经全部随机取完
    4. if (mapResult[pos]) {
    5. rand();
    6. return;
    7. }
    8. // 将取得的结果放入结果集合
    9. result.push(pos);
    10. // 从tempList 删除已经取出的对象
    11. mapResult[pos] = true;

    }

    // 随机取length次 for (var i = 0; i < length; i++) {

    1. 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) {

    1. tempList = list;

    } else {

    1. for (var i = 0; i < list.length; i++) {
    2. tempList.push(list[i]);
    3. }

    }

    // 要返回的结果 var result = [];

    // 随机取length次 for (var i = 0; i < length; i++) {

    1. // 已经全部随机取完
    2. if (tempList.length < 1) {
    3. break;
    4. }
    5. // 从临时数组中随机取出一个
    6. var pos = parseInt(Math.random() * tempList.length);
    7. var item = tempList[pos];
    8. // 将取得的结果放入结果集合
    9. result.push(item);
    10. // 从tempList 删除已经取出的对象
    11. tempList.splice(pos, 1);

    }

    return result; }); ```

    调用方式

    ```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 ```