Почтальон: как настроить библиотеку (полу) сложных повторно используемых скриптов для коллекции - PullRequest
0 голосов
/ 02 мая 2018

Обновление Я полностью переписал этот вопрос на основе последующего расследования. Надеюсь, это даст некоторые ответы.

Я новичок в Postman и пытаюсь выяснить, как наиболее эффективно создать набор тестов для REST-приложения. В каждом из моих тестовых сценариев есть несколько полезных функций, которые я хотел бы иметь в своем распоряжении, но вырезать и вставить их в каждый тестовый сценарий кажется ужасным решением.

Рассматривая различные «области», с которыми Postman позволяет вам сжимать данные (например, глобальные переменные, окружение, сбор), кажется, что все это просто хранилища строк / чисел. Другими словами, он должным образом хранит их, если вы можете / действительно зашифровать результаты. Но на самом деле это не позволяет вам хранить надлежащие объекты или функции. Это имеет смысл, поскольку каждый сценарий, по-видимому, выполняется как отдельное выполнение, поэтому идея совместного использования указателей на разные сценарии не имеет смысла.

Кажется, что общепринятым способом совместного использования служебных функций является toString () функция в определяющем скрипте (например, скрипт Pre-Req коллекции), а затем eval () этой строковой версии в тестовом скрипте. Например:

Сборник Pre-Req Script

const utilFunc =  () => { console.log("I am a utility function"); };
pm.environment.set("utilFunc",utilFunc.toString() );

Тестовый скрипт

const utilFunc = eval(pm.environment.get("utilFunc"));
utilFunc();

Тестовый скрипт успешно выведет на консоль «Я - служебная функция».

Я видел, как люди делали более сложные вещи, когда, если у них было более одной служебной функции, помещали их в объект, такой как utils.func1 и utils.func2, и чтобы общая функция возвращала объект utils, поэтому тестовый сценарий все еще должен иметь одну строку вверху, импортирующую все это.

Проблема, с которой я сталкиваюсь, заключается в области видимости - поскольку буквальный текст функции выполняется в тестовом скрипте, все, что должна иметь функция утилиты, должно быть в этом коде или иным образом существовать в eval() время в тестовом сценарии. Например, если я сделаю:

Сборник Pre-Req Script

const baseUtilFunc = (foo) => { console.log(foo); };

const utilFunc1 = (param) => { baseUtilFunc("One: " + param); };
const utilFunc2 = (param) => { baseUtilFunc("Two: " + param); };

pm.environment.set("utilFunc1",utilFunc1.toString() );
pm.environment.set("utilFunc2",utilFunc2.toString() );

Тестовый скрипт

const utilFunc1 = eval(pm.environment.get("utilFunc1"));
const utilFunc2 = eval(pm.environment.get("utilFunc2"));
utilFunc1("Test");

Сбой, потому что в тестовом скрипте baseUtilFunc не существует. Очевидно, в этом примере это было бы легко исправить. Но в более сложном мире, где функции утилит, которые я собираюсь использовать в своих тестовых скриптах, сами по себе строятся поверх базовых вспомогательных функций, это становится все труднее.

Так, как правильно решить эту проблему? Люди просто втискивают всю соответствующую логику в одну большую функцию, которую они затем вызывают toString()? Встраивают ли они извлечение из окружения и затем в eval в каждую функцию util в своем определении, чтобы оно работало в контексте тестового сценария? Они экспортируют каждый отдельный метод?

1 Ответ

0 голосов
/ 10 мая 2018

Есть разные способы сделать это. То, что я недавно сделал для одного из проектов, - это создание проекта в Git, а затем использование необработанного URL для извлечения данных. У меня есть образец, созданный в репо ниже

https://github.com/tarunlalwani/postman-utils

Для загрузки файла вам нужно будет связать приведенный ниже код на уровне сбора

if (typeof pmutil == "undefined") {
    var url = "https://raw.githubusercontent.com/tarunlalwani/postman-utils/master/pmutils.js";

    if (pm.globals.has("pmutiljs"))
        eval(pm.globals.get("pmutiljs"))
    else {
        console.log("pmutil not found. loading from " + url);
        pm.sendRequest(url, function (err, res) {
            eval(res.text());
            pm.globals.set('pmutiljs', res.text())
        });
    }
}

Как показано на скриншоте ниже

Collection Pre-Request

И позже в tests или Pre-Requests вы запустите следующую строку кода для загрузки

eval(pm.globals.get("pmutiljs"))

И тогда вы можете легко использовать функции в тесте.

Tests with reusable functions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...