Javascript 如何在Postman中编写全局函数

Javascript 如何在Postman中编写全局函数,javascript,postman,Javascript,Postman,我需要帮助编写一个通用函数来跨请求集合使用,这将有助于构建一个框架 我试过使用下面的格式 以下函数在第一个函数的测试选项卡中声明 postman.setGlobalVariable("function", function function1(parameters) { //sample code }); 我在预请求中使用了以下内容 var delay = eval(globals.function); delay.function1(value1); 我得到以下错误 评估预请求脚本时出

我需要帮助编写一个通用函数来跨请求集合使用,这将有助于构建一个框架

我试过使用下面的格式

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

postman.setGlobalVariable("function", function function1(parameters)
{
  //sample code
});
我在预请求中使用了以下内容

var delay = eval(globals.function);
delay.function1(value1);
我得到以下错误

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

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


提前感谢

我使用了这个小技巧:

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

您也可以查看。收集级脚本已列入近期议程,不久将可用。在此之前,您可以使用所示的方法。

如果要在全局函数中调用
pm.sendRequest
,请尝试以下操作:

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

    pm.globals.set('globalFunction', parameters => {
        console.log(parameters);
        pm.sendRequest('https://google.com/', function(err, resp) {
            pm.expect(err).to.not.be.ok;
        });
    });
    
    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,
            }
        };
    });
    
    Object.prototype.sayHello = function(name){
    console.log(`Hello! ${name}`);
    };
    
    let obj = {};
    obj.sayHello(‘Griffin’);
    
  • 使用如下函数:

    pm.globals.set('globalFunction', parameters => {
        console.log(parameters);
        pm.sendRequest('https://google.com/', function(err, resp) {
            pm.expect(err).to.not.be.ok;
        });
    });
    
    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,
            }
        };
    });
    
    Object.prototype.sayHello = function(name){
    console.log(`Hello! ${name}`);
    };
    
    let obj = {};
    obj.sayHello(‘Griffin’);
    
    eval(globals.globalFunction)('helloworld!!')


  • 注意我使用箭头样式
    ()=>{}
    声明函数。否则,它将不起作用。

    编辑:以下答案仍然有效,您可以跳过阅读,但我想首先给出一个警告:如果您试图在《邮递员》中使用此选项,您可能应该在测试中使用除《邮递员》之外的其他选项,如摩卡。Postman适用于中小型应用程序,但使用Postman维护大型多开发人员应用程序可能是一场噩梦。应用程序内编辑器对于大型文件来说是一团糟,版本控制可能会有问题

    回答
    您可以使用以下语法提供更具可读性的解决方案和更大的可能性来考虑您的代码(例如从
    function2()
    直接在预请求脚本中调用
    function1()
    ,或声明包):

    初始化环境(或全局):

    然后在以后的测试中使用您的函数:

    let utils = eval(environment.utils)();
    utils.myPackage.myFunction1(); //calls myFunction1()
    utils.myPackage.myFunction2(); //calls myFunction2() which uses myFunction1()
    
    奖金:

    如果您正在调用API,并且需要在执行测试之前等待调用完成,则可以执行以下操作:

    pm.globals.set('globalFunction', parameters => {
        console.log(parameters);
        pm.sendRequest('https://google.com/', function(err, resp) {
            pm.expect(err).to.not.be.ok;
        });
    });
    
    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,
            }
        };
    });
    
    Object.prototype.sayHello = function(name){
    console.log(`Hello! ${name}`);
    };
    
    let obj = {};
    obj.sayHello(‘Griffin’);
    
    然后使用它:

    utils.myPackage.myFunction(function() {
        console.log("this is the callback !")
        //perform test here
    });
    

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

    • 创建一个集合变量,即全局函数
    • 在变量值中写入此代码
    (编号)=>{返回编号*编号}

    在集合中的其他位置重用此函数

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

    祝你好运:)

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

    pm.globals.set('globalFunction', parameters => {
        console.log(parameters);
        pm.sendRequest('https://google.com/', function(err, resp) {
            pm.expect(err).to.not.be.ok;
        });
    });
    
    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,
            }
        };
    });
    
    Object.prototype.sayHello = function(name){
    console.log(`Hello! ${name}`);
    };
    
    let obj = {};
    obj.sayHello(‘Griffin’);
    
    然后到处调用这个函数。它只需要定义一个对象,如下所示:

    pm.globals.set('globalFunction', parameters => {
        console.log(parameters);
        pm.sendRequest('https://google.com/', function(err, resp) {
            pm.expect(err).to.not.be.ok;
        });
    });
    
    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,
            }
        };
    });
    
    Object.prototype.sayHello = function(name){
    console.log(`Hello! ${name}`);
    };
    
    let obj = {};
    obj.sayHello(‘Griffin’);
    
    或者您甚至不需要对象的声明,而是使用一些内置对象,比如lodash(您假装它具有函数:smile:)

    它在我这边起作用。我也把它贴在了邮递员论坛上
    评估

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

    utils = {
      myFunc: function() {
        return 'hello';
      }
    };
    
    然后在请求的预请求或测试脚本部分中,只需调用函数:

    console.log(utils.myFunc());
    

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

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

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

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

    globalThis.myFunction = function(){}
    

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

    相关:集合范围的脚本现在根据2017年EOY支持-注:小心添加
    JSON.parse(responseBody)
    或pm.response.json();对于您的UTIL,如下所示:首先,它在预请求脚本中不起作用,因为无法从那里访问响应对象。其次,在响应体中没有JSON的情况下(例如,XML或HTML),它可能无法在Tests选项卡中工作。在引用响应对象的情况下,应该考虑对测试和预请求脚本有单独的UTIL。这应该是答案。它以最简洁的方式实现了OP所追求的所有功能(全局可访问函数),而无需使用
    eval()
    。一个快速的Google会告诉你,
    eval()
    通常是开发人员出于安全性、性能和可调试性的原因而避免使用的。这会一直工作到你需要做类似于
    pm.environment.set('foo','bar')。它运行时没有错误,但变量从未设置。@Jake我没有测试过它,因为我最近没有使用Postman,但我很想知道问题是否只是全局上下文无法访问环境上下文?也许
    pm.variables.set()
    pm.globals.set()
    仍然有效?@jake我发现了与您描述的相同的问题。对于全局函数,我只需要pas