Как написать глобальные функции в почтальоне

Мне нужна помощь в написании общей функции для использования в коллекции запросов, которая поможет в построении фреймворка.

Я пытался использовать следующий формат

Следующая функция объявлена ​​на вкладке "Тест" в первой функции

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

Я использовал следующее в предварительной заявке

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

Я получаю следующую ошибку

при оценке сценария предварительного запроса произошла ошибка: невозможно прочитать свойство 'function1' из неопределенного.

Может кто-нибудь помочь мне с тем, как определить глобальные / общие функции и использовать их в запросах?

заранее спасибо

12 ответов

Без eval:

Определите объект, содержащий ваши функции, в сценариях предварительного запроса коллекции без использования let, varи т.д. Это присоединяет его к глобальному объекту песочницы Postman.

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

Затем в разделе предварительного запроса или тестового сценария вашего запроса просто вызовите функцию:

console.log(utils.myFunc());

Я использую этот маленький взломать:

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

Вы также можете проверить план разработчиков команды Почтальона здесь: https://trello.com/b/4N7PnHAz/postman-roadmap-for-developers

Сценарии уровня коллекции находятся в ближайшей перспективе и должны быть доступны в ближайшее время, до тех пор пока вы не сможете использовать показанный метод.

У вас может быть более читаемое решение и больше возможностей для учета вашего кода (например, вызов 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
});

Очень легко добиться с помощью нашивки обезьяны на объекте (или чем угодно).

Опция 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');

Если хочешь позвонить 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, который указывает, что "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. Чтобы иметь доступ к переменной pm внутри вашего пользовательского метода utils, вам необходимо передать ее внутри после eval. Вдобавок ко всему хорошо иметь некоторую модульность для ваших утилит. Вставьте это как значение для глобальной переменной под именем -> Util

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

Определите функции как глобальные переменные, а затем получите доступ ко всем вашим тестам.

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

Вызов функций

let utils = eval(pm.environment.get("UTILS"))
utils.myFunction('Test')
Другие вопросы по тегам