Coffee Break: Збереження функції у Postman через змінні оточення

Ihor Kovtun
3 min readJun 9, 2021
Схема використання функції через змінні оточення в Postman

Рано чи пізно, коли ви серйозно займетесь автоматизацією тестування API у Postman, ви зіткнетесь із неможливістю повторного використання вже одного разу написаної функції в іншому запиті. Оскільки кожен запит не пов’язаний між собою, вони не мають доступу до функцій один одного. Але, як ви вже могли здогадатися, ми можемо передавати дані з одного запиту в інший через змінні середовища, тому чому б ми не могли зробити те саме з функцією?

Припустимо, що ми хочемо мати надзвичайно важливу функцію, доступну в будь-якому запиті Postman в закладках pre-request і test:

let func = (name, date) => {
console.log(`Hello ${name}. Today is ${date}. Have a nice day!`)
}

Все, що нам потрібно зробити, це зберегти її в змінну середовища у вигляді рядка. Для цього використовуємо такий код:

pm.environment.set('getFunc', func.toSting());

Цей код перетворить нашу функцію у рядок і збереже її у змінну середовища приблизно у наступному форматі:

"(name, date) => {\n    console.log(`Hello ${name}. Today is ${date}. Have a nice day!`)\n}"

Тепер у нас є рядок з кодом JavaScript всередині, що далі? Далі нам потрібно відкрити потрібний нам запит і перетворити цей рядок на функцію.

let func = eval(pm.environment.get('getFunc'));

У цьому рядку коду спочатку ми отримуємо змінну середовища, в якій зберігається рядок з функцією, а потім передаємо його до eval та зберігаємо результат у змінну з тим самим іменем функції. Після цього ви вже можете використовувати її як звичайну функцію. Якщо ж вам потрібна ця функція лише один раз у запиті і ви намагаєтеся максимально скоротити кількість рядків (з якоїсь причини), ви можете навіть не зберігати функцію у змінну, а викликати її одразу. Це буде виглядати наступним чином:

eval(pm.environment.get('getFunc'))(name, date);

Тепер ви можете створювати функції у одному з перших запитів і потім використовувати їх далі через змінні середовища. Для тих, кому ще не закінчилась чашка кави під час читання і хто має бажання краще розібратися в деталях, давайте розглянемо ще один невеликий момент.

Збереження функції у стилі “Functional declaration”

Дуже важливий аспект, на який варто звернути увагу, це те, що ми оголошуємо функції як анонімні і зберігаємо посилання на них у змінну. Але чому б не зробити це як зазвичай з використанням ключового слова function? Справа в методі eval. Якщо ви спробуєте перетворити функцію на рядок у наступному стилі:

function func(){console.log('test');}

То в результаті ви отримаєте наступний результат:

"function func(){console.log('test');}"

На що ваш метод eval просто поверне undefined. Хоча й тут можна знайти вихід, якщо оточити вираз дужками:

eval(`(${pm.environment.get('getFunc')})`)();

Не дуже елегантно, чи не так? Все це можна, звичайно, виправити і отримати більш зрозумілий код:

const funcString = pm.environment.get('getFunc');
const func = eval(`(${funcString})`);
func();
>>>>
test

Але від цього підходу немає особливої вигоди.

Висновок

Функції-утиліти можна зберігати, записуючи їх у змінні середовища. Однак, потрібно бути уважними при способі їх оголошення і перетворенні. Цей підхід, звичайно ж, не можна назвати навіть хорошим, і варто серйозно задуматися, перш ніж його використовувати. Можливо, якщо у вас вже виникла така проблема, то краще розглянути інші інструменти, але це вже зовсім інша історія.

--

--