如何在邮递员中编写全局函数

时间:2017-08-14 11:53:50

标签: javascript postman

我需要帮助编写一个通用函数,以便在一组请求中使用,这将有助于构建框架。

我尝试使用以下格式

在第一个函数

的“测试”选项卡中声明了以下函数
postman.setGlobalVariable("function", function function1(parameters)
{
  //sample code
});

我在预请求中使用了以下内容

var delay = eval(globals.function);
delay.function1(value1);

我收到以下错误

评估预请求脚本时出错:无法读取属性' function1'未定义的。

任何人都可以帮我详细说明如何定义全局/通用功能并在请求中使用它们吗?

提前致谢

9 个答案:

答案 0 :(得分:22)

没有eval

在集合的请求前脚本中定义一个包含您函数的对象,而无需使用letvar等。这会将其附加到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,请尝试以下操作:

  1. 在集合预请求中定义全局函数,如下所示:

    postman.setGlobalVariable("globalFunction", (parameters) => { console.log(parameters); pm.sendRequest('https://google.com/', function(err, resp) { pm.expect(err).to.not.be.ok; }); });

  2. 使用如下函数:

    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)

您可以通过将以下函数分配给集合,环境或全局变量来声明全局函数:

  • 创建一个集合变量,即global_func
  • 在变量值中编写以下代码,
  

(数字)=> {返回数字*数字}

要在您收藏中的其他地方重用此功能

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')