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

Anj*_*i R 21 javascript postman

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

我尝试过使用以下格式

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

postman.setGlobalVariable("function", function function1(parameters)
{
  //sample code
});
Run Code Online (Sandbox Code Playgroud)

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

var delay = eval(globals.function);
delay.function1(value1);
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

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

谁能帮助我如何定义全局/通用功能并在请求中使用它们?

提前致谢

ggu*_*erg 47

没有eval

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

utils = {
  myFunc: function() {
    return 'hello';
  }
};
Run Code Online (Sandbox Code Playgroud)

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

console.log(utils.myFunc());
Run Code Online (Sandbox Code Playgroud)

  • 我将 pm 传递给这个全局变量的每个方法。通过这种方式,我知道它与调用请求中存在的相同,并且可以执行诸如“pm.environment.set('foo', 'bar');”之类的操作 (5认同)
  • 这应该是答案。它以最简洁的方式实现了 OP 所追求的一切(全局可访问的函数),并且无需使用“eval()”。快速谷歌一下就会告诉你,出于安全、性能和可调试性的原因,开发人员通常会避免使用“eval()”。 (4认同)
  • @jake我发现了你所描述的同样的问题。对于全局函数,我只是将 pm 作为参数传递给函数,这在我的用例中对我有用。如果我需要不在范围内的其他东西,显然可能会变得有点混乱。 (4认同)
  • 直到您需要在这些函数之一中执行诸如“pm.environment.set('foo', 'bar');”之类的操作时,此操作才会起作用。它运行时没有错误,但变量从未被设置。 (3认同)

小智 28

我用这个小黑客:

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

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

const utils = eval(globals.loadUtils);
utils.reuseableFunction();
Run Code Online (Sandbox Code Playgroud)

您还可以在此处查看Postman团队的开发人员路线图:https: //trello.com/b/4N7PnHAz/postman-roadmap-for-developers

集合级脚本是近期议程,应尽快提供,直到那时您可以使用所示方法.

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

Gra*_*API 9

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

选项1

在集合级别预脚本

Object.prototype.doSomething = (foo) => console.log(foo);
Run Code Online (Sandbox Code Playgroud)

在任何其他地方:

pm.doSomething('bar');

// or

postman.doSomething('bar');
Run Code Online (Sandbox Code Playgroud)

选项#2

在集合级别预脚本

Utilities = {};
Utilities.getParam = (foo) => console.log(foo);
Run Code Online (Sandbox Code Playgroud)

在任何其他地方

Utilities.getParam('bar');
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 8

您可以使用以下语法,从而获得更具可读性的解决方案,并更有可能分解代码(例如function1()function2()直接在预请求脚本内部调用或声明包):

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

postman.setEnvironmentVariable("utils", () => {
    var myFunction1 = () => {
        //do something
    }
    var myFunction2 = () => {
        let func1Result = myFunction1();
        //do something else
    }
    return {
        myPackage: {
            myFunction1,
            myFunction2
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

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

let utils = eval(environment.utils)();
utils.myPackage.myFunction1(); //calls myFunction1()
utils.myPackage.myFunction2(); //calls myFunction2() which uses myFunction1()
Run Code Online (Sandbox Code Playgroud)

奖励:

如果您正在调用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,
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

然后使用它:

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


kam*_*and 6

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

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

  • 这对我不起作用。我收到“评估预请求脚本时出错:类型错误:eval(...) 不是函数”。 (3认同)

小智 6

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

\n\n
Object.prototype.sayHello = function(name){\nconsole.log(`Hello! ${name}`);\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后在任何地方调用该函数。它只需要一个定义的对象,如下所示:

\n\n
let obj = {};\nobj.sayHello(\xe2\x80\x98Griffin\xe2\x80\x99);\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者您甚至不需要对象的声明,而是使用一些内置对象,例如 lodash (您假装它具有以下功能 :smile: )

\n\n
_.sayHello(\xe2\x80\x98Griffin\xe2\x80\x99);\n
Run Code Online (Sandbox Code Playgroud)\n\n

它\xe2\x80\x99s 在我这边工作。我还将其发布在邮递员论坛中\n https://community.postman.com/t/global-functions-via-collection-level-folder/5927/6?u=franksunnn110

\n

  • 这是我在翻转时代见过的最糟糕的黑客,但它确实有效。这是我设法让它在预请求之间共享代码的唯一方法。经过这么长时间,邮差没有可以共享代码的东西,这很荒谬。 (2认同)