如何在 Postman 中编写全局函数

IT技术 javascript postman
2021-02-25 04:57:35

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

我尝试使用以下格式

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

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

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

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

我收到以下错误

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

任何人都可以帮助我定义全局/通用函数并在请求中使用它们吗?

提前致谢

6个回答

没有eval

定义包含您在收集的预请求脚本功能(S)的对象,而不使用letvar等等。这是重视邮差的全球沙箱的对象。

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

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

console.log(utils.myFunc());
这应该是答案。它以最简洁的方式实现了 OP 所追求的一切(全局可访问的函数),并且不使用eval(). 快速谷歌会告诉你,eval()出于安全、性能和可调试性的原因,开发人员通常会避免这样做。
2021-04-22 04:57:35
惊人。谢谢!通过javascriptio.com/view/116768 /...找到了这个,然后回来分享/信用却发现它第一次在这里错过了:D
2021-04-25 04:57:35
@Jake 我没有测试过这个,因为我最近没有使用过 Postman,但我很想知道问题是否只是全局上下文无法访问环境上下文?也许pm.variables.set()还是pm.globals.set()会工作?
2021-04-30 04:57:35
@jake 我发现了您描述的相同问题。对于全局函数,我只是将 pm 作为参数传递给函数,这在我的用例中对我有用。如果我需要其他不在范围内的东西,显然可能会有点混乱。
2021-05-16 04:57:35
这一直有效,直到您需要pm.environment.set('foo', 'bar');在其中一个函数中执行类似操作它运行没有错误,但变量永远不会被设置。
2021-05-17 04:57:35

我使用这个小技巧:

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 团队开发人员路线图集合级别的脚本在近期议程上,应该很快就会可用,在那之前您可以使用显示的方法。

注意:添加JSON.parse(responseBody);或 pm.response.json() 时要小心到您的实用程序,如:首先,它在预请求脚本中不起作用,因为无法从那里访问响应对象。其次,在响应正文中没有可用 JSON 的情况下,它也可能无法在“测试”选项卡中工作:例如,XML 或 HTML。在引用响应对象的情况下,应考虑为测试和预请求脚本使用单独的工具。
2021-04-24 04:57:35

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

ANSWER
你可以有一个更易读的解决方案和更多的可能性来分解你的代码(比如直接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
});

如果你想调用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!!');

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

这对我不起作用。我得到There was an error in evaluating the Pre-request Script: TypeError: eval(...) is not a function
2021-05-02 04:57:35

这个问题让我困惑了一段时间,直到我找到了上面提到的常用方法。但是,它仍然为每个 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

作品!但是要从请求脚本调用在集合脚本中以这种方式声明的函数,只需要函数名即可。例如 sayHello('Griffin');。
2021-04-21 04:57:35
这是我在翻转时代见过的最糟糕的黑客,但它有效。这是我设法让它在预请求之间共享代码的唯一方法。毕竟,POSTMAN 没有东西可以共享代码是荒谬的。
2021-04-27 04:57:35