Postman для тестировщика — 20 pre-request и post-response скриптов

Postman для тестировщика — 20 pre-request и post-response скриптов

QA❤️4Life

Postman — главный инструмент тестировщика для работы с API. Pre-request и post-response скрипты превращают его из простого HTTP-клиента в полноценную тестовую среду. В этой шпаргалке — 20 скриптов, собранных из практики.

Канал: QA❤️4Life
Автор: Евгений Гусинец


Pre-request скрипты — подготовка запроса

1. Автоматическое получение токена аутентификации
Если токена нет — скрипт сам отправляет запрос на /auth/login, парсит ответ и сохраняет access_token в переменную окружения. Больше никакого ручного копирования.

if (!pm.environment.get("accessToken")) {
pm.sendRequest({
url: 'https://your-api.com/auth/login',
method: 'POST',
header: {'Content-Type': 'application/json'},
body: {
mode: 'raw',
raw: JSON.stringify({
"username": "{{username}}",
"password": "***"
})
}
}, function (err, response) {
if (err) { console.error(err); }
else {
const responseJson = response.json();
pm.environment.set("accessToken", responseJson.access_token);
}
});
}

2. Автообновление токена по сроку жизни
Токен живёт час? Скрипт запоминает время получения и запрашивает новый за 10 минут до истечения.

const tokenExpiryMargin = 50 * 60 * 1000;
const savedTokenTimestamp = pm.environment.get("tokenTimestamp");
const now = new Date().getTime();

if (!pm.environment.get("accessToken") || (now - savedTokenTimestamp > tokenExpiryMargin)) {
pm.sendRequest({
url: 'https://your-api.com/auth/login',
method: 'POST',
header: {'Content-Type': 'application/json'},
body: {
mode: 'raw',
raw: JSON.stringify({
"username": "{{username}}",
"password": "***"
})
}
}, function (err, response) {
if (err) { console.error(err); }
else if (response.code === 200) {
const responseJson = response.json();
pm.environment.set("accessToken", responseJson.access_token);
pm.environment.set("tokenTimestamp", new Date().getTime());
}
});
}

3. Настройка данных в зависимости от окружения
Переключаетесь между dev/staging/prod — скрипт сам подставляет нужный baseUrl.

const currentEnvironment = pm.environment.get("environment");
let baseUrl;

if (currentEnvironment === "dev") {
baseUrl = "https://dev.example.com/api/v1";
} else if (currentEnvironment === "staging") {
baseUrl = "https://staging.example.com/api/v1";
} else if (currentEnvironment === "prod") {
baseUrl = "https://api.example.com/v1";
} else {
baseUrl = "https://dev.example.com/api/v1";
}
pm.environment.set("baseUrl", baseUrl);

4. Динамическое формирование параметров запроса
Собираете query-параметры из переменных окружения или предыдущих ответов.

const params = {
page: pm.environment.get("currentPage") || 1,
limit: pm.environment.get("pageSize") || 20,
sort: pm.environment.get("sortOrder") || "asc"
};
pm.request.url.query.remove(query => true);
Object.keys(params).forEach(key => {
pm.request.url.query.insert({ key, value: params[key] });
});

5. Генерация случайных данных
Для тестовых данных, которые не должны повторяться.

const timestamp = Date.now();
const randomEmail = `test_${timestamp}@example.com`;
const randomName = `User_${Math.random().toString(36).substring(7)}`;
pm.variables.set("randomEmail", randomEmail);
pm.variables.set("randomName", randomName);

6. Подготовка тела запроса
Собираете JSON-тело из переменных перед отправкой.

const requestBody = {
name: pm.variables.get("randomName"),
email: pm.variables.get("randomEmail"),
role: "user",
created_at: new Date().toISOString()
};
pm.request.body.raw = JSON.stringify(requestBody);

7. Проверка обязательных переменных
Если переменная не задана — скрипт устанавливает значение по умолчанию.

const requiredVars = ["baseUrl", "apiKey", "timeout"];
requiredVars.forEach(varName => {
if (!pm.environment.get(varName)) {
console.warn(`Переменная ${varName} не задана!`);
}
});

8. Установка динамических заголовков
Content-Type, Accept, метки времени — всё, что должно быть в каждом запросе.

pm.request.headers.add({
key: "X-Request-ID",
value: `req_${Date.now()}`
});
pm.request.headers.add({
key: "X-Client-Version",
value: "1.0.0"
});

9. Текущая дата и время в нужном формате
Для полей created_at, updated_at, временных меток.

const now = new Date();
const formattedDate = now.toISOString().replace('T', ' ').substring(0, 19);
pm.variables.set("currentDateTime", formattedDate);
pm.variables.set("currentTimestamp", now.getTime());

10. Кодирование данных (Base64)
Для Basic Auth или передачи бинарных данных.

const credentials = `${pm.environment.get("username")}:${pm.environment.get("password")}`;
const encoded = btoa(credentials);
pm.variables.set("basicAuth", encoded);

Post-response скрипты — проверка ответа

11. Валидация кода статуса
Проверить, что API вернул ожидаемый код. Можно проверять конкретный код или диапазон 2xx.

pm.test("Status code is 201", function () {
pm.response.to.have.status(201);
});

// Или диапазон успешных кодов:
pm.test("Status code is 2xx", function () {
pm.expect(pm.response.code).to.be.within(200, 299);
});

12. Извлечение данных из ответа
Сохранить ID созданного ресурса для следующего запроса.

const responseJson = pm.response.json();
const userId = responseJson.id;
if (userId) {
pm.environment.set("userId", userId);
} else {
console.warn("ID не найден в ответе");
}

13. Валидация полей в теле ответа
Проверить, что все нужные поля есть и имеют правильные значения.

pm.test("Response has expected fields", function () {
const json = pm.response.json();
pm.expect(json).to.have.property('id');
pm.expect(json).to.have.property('name').that.equals('John Doe');
pm.expect(json).to.have.property('email').that.is.a('string');
});

14. Проверка сообщений об ошибках
Для негативных тестов — убедиться, что API возвращает понятную ошибку.

pm.test("Error message is correct", () => {
let json;
try { json = pm.response.json(); }
catch (e) { throw new Error("Failed to parse response as JSON"); }
pm.expect(json).to.have.property('error');
pm.expect(json.error).to.be.a('string').that.equals("Invalid credentials");
});

15. Валидация заголовков ответа
Проверить Content-Type, Cache-Control, отсутствие опасных заголовков.

pm.test("Content-Type is JSON", function () {
pm.response.to.have.header("Content-Type", "application/json");
});

pm.test("No Server header exposed", function () {
pm.expect(pm.response.headers.has("Server")).to.be.false;
});

16. JSON Schema Validation
Проверить, что структура ответа соответствует контракту.

const schema = {
type: "object",
properties: {
id: {type: "string"},
name: {type: "string"},
email: {type: "string", format: "email"},
age: {type: "integer", minimum: 18}
},
required: ["id", "name", "email", "age"]
};
pm.test("Schema is valid", function () {
pm.response.to.have.jsonSchema(schema);
});

17. Условная установка переменных
В зависимости от ответа — установить разные переменные для следующих шагов.

const json = pm.response.json();
if (json.status === "active") {
pm.environment.set("userState", "active");
pm.environment.set("nextAction", "verify_features");
} else {
pm.environment.set("userState", "inactive");
pm.environment.set("nextAction", "send_reminder");
}

18. Логирование деталей ответа
Для отладки — записать в консоль всё, что пришло от сервера.

console.log("Response status:", pm.response.code);
console.log("Response time:", pm.response.responseTime + "ms");
console.log("Response body:", JSON.stringify(pm.response.json(), null, 2));

19. Измерение времени ответа
Проверить, что API укладывается в SLA по времени.

pm.test("Response time < 500ms", function () {
pm.expect(pm.response.responseTime).to.be.below(500);
});

20. Визуализация данных ответа
Postman умеет отображать кастомные HTML-шаблоны прямо в интерфейсе.

const template = `<html>
<body>
<h2>User Info</h2>
<p>ID: {{id}}</p>
<p>Name: {{name}}</p>
<p>Email: {{email}}</p>
</body>
</html>`;
pm.visualizer.set(template, {id: "123", name: "John", email: "john@test.com"});

Совет: начни с малого — добавь проверку статус-кода и извлечение ID в первый же запрос. Когда освоишь — подключи автообновление токена и JSON Schema. 20 скриптов покрывают 95% задач тестировщика в Postman.

Report Page