QA Interview Hub · База знань · Тести
API
Скрипти і перевірки в Postman
Postman: змінні, скрипти, chaining
Області змінних від ширшої до вужчої: global, collection, environment, data і local. Вужча перекриває ширшу, тому однойменна змінна з environment перекриє глобальну. Environments дають змогу запускати ту саму колекцію на dev, stage і prod, просто перемкнувши середовище.
Pre-request script виконується перед запитом: генерація унікальних даних, отримання токена, обчислення підпису чи timestamp. Post-response script (раніше вкладка Tests) виконується після відповіді: перевірки через pm.test і pm.expect, наприклад статус, поля й час відповіді. Скрипти можна задавати на рівні запиту, папки і колекції.
Chaining — передача даних між запитами: після створення користувача зберігаю його ID через pm.environment.set('userId', json.id). Наступні запити використовують {{userId}}. Колекцію проганяють через Collection Runner з CSV чи JSON для data-driven тестів або через Newman у CI.
Pre-request, post-response і базові перевірки
Pre-request виконується до відправки запиту (підготувати дані, токен), post-response — після (перевірити відповідь, зберегти значення). Порядок: скрипт колекції, потім папки, потім запиту. Мова — JavaScript, асерти — Chai через pm.expect.
Базовий набір перевірок:
pm.test('Status 201', () => pm.response.to.have.status(201));
pm.test('Response time < 800 ms', () => {
pm.expect(pm.response.responseTime).to.be.below(800);
});
pm.test('JSON content type', () => {
pm.response.to.have.header('Content-Type');
pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json');
});
const body = pm.response.json();
pm.test('Body fields', () => {
pm.expect(body).to.have.property('id');
pm.expect(body.status).to.eql('pending');
pm.expect(body.amount).to.be.a('number').and.eql(150);
pm.expect(body).to.not.have.property('cardNumber'); // чутливі дані не віддаються
});
Кожен pm.test — окремий рядок у звіті, тому краще мати кілька невеликих тестів з чіткими назвами, ніж один великий. Тоді з звіту Runner одразу видно, що саме зламалось.
На співбесіді: Pre-request готує дані й токен, post-response перевіряє відповідь і зберігає значення. Я перевіряю статус, час, Content-Type, ключові поля й відсутність чутливих даних, кожну перевірку окремим pm.test.
Валідація схеми і ланцюжок запитів
Валідація схеми перевіряє структуру цілком: обов'язкові поля, типи, дозволені значення.
const schema = {
type: 'object',
required: ['id', 'status', 'amount', 'currency'],
properties: {
id: { type: 'string' },
status: { enum: ['pending', 'completed', 'failed'] },
amount: { type: 'number', exclusiveMinimum: 0 },
currency: { type: 'string', pattern: '^[A-Z]{3}$' }
},
additionalProperties: false
};
pm.test('Schema is valid', () => pm.response.to.have.jsonSchema(schema));
additionalProperties: false ловить ситуацію, коли бекенд раптом почав віддавати нове поле, наприклад внутрішній ідентифікатор. Це і захист від витоку даних, і сигнал про незадокументовану зміну контракту.
Ланцюжок запитів — передати дані з одного запиту в наступний:
// post-response у POST /accounts
pm.environment.set('accountId', pm.response.json().id);
// наступний запит: GET {{baseUrl}}/accounts/{{accountId}}
На співбесіді: Схема перевіряє всю структуру відповіді одним тестом, а additionalProperties: false ловить зайві поля. Дані між запитами я передаю через змінні: зберігаю id у post-response і використовую {{accountId}} у наступному запиті.
Корисні команди і сильний тест
Корисні команди:
pm.sendRequest(...) — відправити допоміжний запит зі скрипту, наприклад отримати токен у pre-request.pm.execution.setNextRequest('Name') — змінити порядок у Runner; null зупиняє прогін. У старих колекціях трапляється postman.setNextRequest.pm.environment.unset('token') — прибрати за собою змінну.console.log(...) — вивід у Postman Console (знизу вікна): там видно сирий запит і відповідь, це головний інструмент дебагу.
Postman Console особливо корисна, коли змінна не підставилась: у ній видно фінальний URL і заголовки, і одразу ясно, чи пішов запит з {{token}} буквально, чи з реальним значенням.
Слабкий тест vs сильний. Перевірка лише статусу 200 пропустить порожній або хибний масив. Мінімум — статус, схема і ключові значення. Для запису — ще й наступний GET, щоб переконатися, що дані справді збереглися. Наприклад, після PATCH /accounts/42 з новою назвою я роблю GET /accounts/42 і перевіряю, що змінилось лише поле назви, а решта залишилась як була.
На співбесіді: Тест, що перевіряє лише 200, майже нічого не гарантує. Я перевіряю статус, схему і ключові значення, а після запису роблю GET, щоб підтвердити, що зміна збереглась.