繁体   English   中英

如何在 Postman 中编写全局函数

[英]How to Write Global Functions in Postman

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

我尝试使用以下格式

以下函数在第一个函数的 Test 选项卡中声明

postman.setGlobalVariable("function", function function1(parameters)
{
  //sample code
});

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

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

我收到以下错误

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

谁能帮我定义全局/通用函数并在请求中使用它们?

提前致谢

没有eval

在集合的预请求脚本中定义一个包含您的函数的对象,而不使用letvar等。这会将其附加到 Postman 的全局沙箱对象。

utils = {
  myFunc: function() {
    return 'hello';
  }
};

然后在您请求的预请求或测试脚本部分中,只需调用该函数:

console.log(utils.myFunc());

我使用这个小技巧:

pm.globals.set('loadUtils', function loadUtils() {
    let utils = {};
    utils.reuseableFunction = function reuseableFunction() {
        let jsonData = JSON.parse(responseBody);
    }
    return utils;
} + '; loadUtils();');
tests['Utils initialized'] = true;

在另一个请求中,我可以重用全局变量loadUtils

const utils = eval(globals.loadUtils);
utils.reuseableFunction();

您还可以查看Postman 团队的开发者路线图 集合级别的脚本在近期议程上,应该很快就可以使用,直到那时您可以使用所示的方法。

编辑:以下答案仍然有效,您可以跳过并阅读它,但我想先发出警告:如果您尝试在 Postman 中使用它,您可能应该使用 Postman 以外的其他东西,例如 Mocha,进行测试. Postman 适用于中小型应用程序,但使用 postman 维护非常大的多开发人员应用程序可能是一场噩梦。 应用内编辑器对于大文件来说是一团糟,并且版本控制可能会出现问题。

回答
您可以有一个更具可读性的解决方案,并且更有可能使用以下语法来分解您的代码(例如直接在您的预请求脚本中从function2()调用function1()或声明包):

初始化环境(或全局变量):

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
});

如果你想在全局函数中调用pm.sendRequest ,试试这个:

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

     pm.globals.set('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!!');

请注意,我使用箭头样式()=>{}声明了函数。 否则,它就行不通了。

在对象(或任何你想要的)上使用猴子补丁很容易实现。

选项1

在集合级别的脚本

Object.prototype.doSomething = (foo) => console.log(foo);

在任何其他地方:

pm.doSomething('bar');

// or

postman.doSomething('bar');

选项 #2

在集合级别的脚本

Utilities = {};
Utilities.getParam = (foo) => console.log(foo);

在任何其他地方

Utilities.getParam('bar');

这个问题困扰了我一段时间,直到我找到了上面提到的常用方法。 但是,它仍然会为每个 eval 行留下一个警告图标,在 postman 界面中表示“eval 可能有害”。 最近,我找到了另一种方法并在这里发布:用户可以在预请求脚本部分创建一个具有您想要的适当功能的原型对象,如下所示:

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

更优雅的方法是在预请求脚本中使用全局上下文(而不是变量)。 例如,如果您希望一个名为myFunction的函数在任何预请求脚本中可用,您可以转到Edit Collection/Pre-request并设置

globalThis.myFunction = function(){}

然后,您可以在集合内任何请求的任何预请求脚本中调用myFunction (无需对函数进行任何字符串化/评估)

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

  • 创建一个集合变量,即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))

祝你好运 :)

如果您希望能够在全局函数中使用pm.response ,请将this作为参数传递。

在您的收藏预请求中:

Utils = {
   myFunc: function(that) {
        return that.pm.response;
   }
};

并在您的请求预请求或测试脚本中使用它,如下所示:

Utils.myFunc(this);

将函数定义为全局变量,然后访问所有测试。

pm.environment.set("UTILS", `({ myFunction: (text) => console.log(text) })`)

调用函数

let utils = eval(pm.environment.get("UTILS"))
utils.myFunction('Test')

上面的很多例子都会有 pm 变量的问题。 为了在您的自定义 utils 方法中访问 pm 变量,您需要在 eval 之后将其传递进去。 最重要的是,为您的实用程序提供一些模块化是很好的。 将此粘贴为 name -> 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')

pm.globals.set("compare_obj",function compare_obj(){
    return (response,outputName)=>{
  if(response !== undefined && response !== null){
    var key = response.hasOwnProperty(Object.keys(response)[0]);
    if(key === true){
       var keyName =  Object.keys(response)[0];
       delete response[keyName];
    }
    delete response.cr_dt;
    delete response.up_dt;
  }
    for(const property in response){
        const isExist = pm.globals.get(outputName).hasOwnProperty(property);
        pm.expect(isExist).to.eql(true);
        if(isExist === true){
            var val = pm.globals.get(outputName);
            pm.expect(response[property]).to.eql(val[property]);
        }
    }
};
} + ';compare_obj();');

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM