Основы тестов
Тесты в Postman пишутся на JavaScript и выполняются после получения ответа от сервера. Они находятся во вкладке Scripts > Post-response
.
Структура теста
Основная функция для создания теста — pm.test()
. Она принимает два аргумента:
- Название теста (String): Отображается в результатах. Должно быть описательным.
- Функция (Function): Содержит проверки (assertions). Тест считается пройденным, если функция выполнилась без ошибок.
Пример: Проверка статуса ответа
Это самый базовый и частый тест — проверка, что сервер вернул ожидаемый HTTP статус.
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
Postman использует библиотеку Chai Assertion Library
, которая предоставляет удобный BDD-синтаксис (expect
, should
). Альтернативный синтаксис для той же проверки:
pm.test("Status code is 200", () => {
pm.expect(pm.response.code).to.eql(200);
});
Несколько проверок в одном тесте
Вы можете группировать несколько связанных проверок в одном тесте. Тест упадет, если хотя бы одна из проверок не выполнится.
pm.test("The response has all properties", () => {
const responseJson = pm.response.json();
pm.expect(responseJson.type).to.eql('vip');
pm.expect(responseJson.name).to.be.a('string');
pm.expect(responseJson.id).to.have.lengthOf(1);
});
Работа с Response
Чтобы проводить проверки, сначала нужно извлечь (спарсить) данные из тела ответа и преобразовать их в JavaScript-объект.
Парсинг данных
JSON (самый частый случай):
const responseJson = pm.response.json();
XML:
const responseXml = xml2Json(pm.response.text());
CSV:
const parse = require('csv-parse/lib/sync');
const responseCsv = parse(pm.response.text());
HTML:
const $ = cheerio.load(pm.response.text());
// Пример использования: console.log($('h1').text());
Работа с "сырым" текстом
Если тело ответа не является парсируемым форматом, вы все равно можете проверять его как обычный текст.
Проверить наличие подстроки:
pm.test("Body contains string",() => {
pm.expect(pm.response.text()).to.include("customer_id");
});
Проверить точное совпадение тела ответа:
pm.test("Body is string", function () {
pm.response.to.have.body("Это точный текст ответа");
});
Примеры Assertions
Проверка тела ответа (Body)
pm.test("Person is Jane", () => {
const responseJson = pm.response.json();
pm.expect(responseJson.name).to.eql("Jane");
pm.expect(responseJson.age).to.eql(23);
});
Проверка статус-кодов (Status Codes)
// Проверка на один из кодов
pm.test("Successful POST request", () => {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
// Проверка текста статуса
pm.test("Status code name has string", () => {
pm.response.to.have.status("Created");
});
Проверка заголовков (Headers)
// Проверка наличия заголовка
pm.test("Content-Type header is present", () => {
pm.response.to.have.header("Content-Type");
});
// Проверка значения заголовка
pm.test("Content-Type header is application/json", () => {
pm.expect(pm.response.headers.get('Content-Type')).to.include('application/json');
});
Проверка Cookies
// Проверка наличия cookie
pm.test("Cookie isLoggedIn is present", () => {
pm.expect(pm.cookies.has('isLoggedIn')).to.be.true;
});
// Проверка значения cookie
pm.test("Cookie isLoggedIn has value 1", () => {
pm.expect(pm.cookies.get('isLoggedIn')).to.eql('1');
});
Проверка времени ответа (Response Time)
pm.test("Response time is less than 200ms", () => {
pm.expect(pm.response.responseTime).to.be.below(200);
});
Pre-request Скрипты
Эти скрипты выполняются до отправки запроса. Они идеально подходят для подготовки данных, генерации динамических значений или модификации запроса "на лету".
Частые сценарии использования:
- Генерация случайных данных для тела запроса.
- Установка динамических заголовков (например, временной метки или токена авторизации).
- Получение данных из одной переменной, их обработка и сохранение в другую.
Пример: Установка динамического ID в URL
Предположим, у вас есть URL {{baseUrl}}/users/{{userId}}
. Мы можем сгенерировать случайный ID в pre-request скрипте.
// Генерируем случайное число от 1 до 10
const randomUserId = Math.floor(Math.random() * 10) + 1;
// Устанавливаем его в переменную окружения
pm.environment.set("userId", randomUserId);
Пример: Установка заголовка авторизации
Если токен хранится в переменной, его можно добавить в заголовок перед отправкой запроса.
const authToken = pm.environment.get("my_auth_token");
if (authToken) {
pm.request.headers.add({
key: 'Authorization',
value: 'Bearer ' + authToken
});
}
Переменные
Переменные — ключевой элемент для создания гибких и переиспользуемых тестов. Postman поддерживает несколько уровней (scopes) переменных.
Иерархия (от низшего к высшему приоритету):
- Global: Доступны во всем workspace.
- Collection: Доступны внутри одной коллекции.
- Environment: Доступны при выборе активного окружения (например, dev, stage, prod).
- Data: Переменные из CSV/JSON файлов для Collection Runner.
- Local: Существуют только во время выполнения одного запроса.
Если переменные с одинаковым именем существуют на разных уровнях, будет использована переменная с более высоким приоритетом.
Работа с переменными окружения (pm.environment
)
// Установить значение
pm.environment.set("variable_key", "variable_value");
// Получить значение
const myVar = pm.environment.get("variable_key");
// Проверить наличие
pm.environment.has("variable_key"); // true/false
// Удалить переменную
pm.environment.unset("variable_key");
// Очистить все переменные окружения
pm.environment.clear();
Работа с переменными коллекции (pm.collectionVariables
)
Синтаксис аналогичен работе с pm.environment
.
pm.collectionVariables.set("user_id", "12345");
const userId = pm.collectionVariables.get("user_id");
Управление ходом выполнения
В Collection Runner или Newman можно динамически изменять порядок выполнения запросов.
Важно: эти функции не работают при одиночном запуске запроса через кнопку "Send".
Переход к следующему запросу (setNextRequest
)
Эта функция указывает Collection Runner, какой запрос выполнить следующим, вместо стандартного порядка.
// После этого запроса выполнить запрос с именем "Get User Details"
pm.execution.setNextRequest("Get User Details");
Можно передавать имя запроса (как в примере) или его ID.
// Пример условной логики
const response = pm.response.json();
if (response.status === 'pending') {
// Если статус "pending", повторить этот же запрос
pm.execution.setNextRequest(pm.info.requestName);
} else {
// Иначе перейти к запросу "Finalize Process"
pm.execution.setNextRequest("Finalize Process");
}
Пропуск запроса (skipRequest
)
Эта функция, вызванная в pre-request скрипте, предотвращает отправку текущего запроса.
// Пропустить этот запрос, если токен не найден
if (!pm.environment.get('token')) {
pm.execution.skipRequest();
}
Асинхронные запросы
Функция pm.sendRequest()
позволяет отправить HTTP-запрос прямо из pre-request или post-response скрипта.
Это полезно, например, когда для выполнения основного теста нужно предварительно получить токен или какие-либо данные другим запросом.
Пример: получение токена
Этот скрипт можно поместить в pre-request скрипт коллекции, чтобы он выполнялся перед каждым запросом.
const tokenRequest = {
url: 'https://auth.example.com/token',
method: 'POST',
header: { 'Content-Type': 'application/json' },
body: {
mode: 'raw',
raw: JSON.stringify({
grant_type: 'client_credentials',
client_id: 'your-id',
client_secret: 'your-secret'
})
}
};
pm.sendRequest(tokenRequest, (err, res) => {
if (err) {
console.log(err);
} else {
// Сохраняем полученный токен в переменную
const token = res.json().access_token;
pm.environment.set("my_auth_token", token);
}
});
Валидация JSON Schema
Вместо проверки каждого поля по отдельности, можно проверить всю структуру JSON-ответа на соответствие заранее определенной схеме. Postman использует библиотеку Ajv
для валидации.
Пример валидации
Предположим, API должен возвращать объект пользователя определенной структуры.
// 1. Определяем схему
const schema = {
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "number" },
"email": { "type": "string", "format": "email" },
"isActive": { "type": "boolean" }
},
"required": ["name", "age", "email", "isActive"]
};
// 2. Пишем тест
pm.test('Response structure is valid', function() {
const responseData = pm.response.json();
pm.expect(responseData).to.have.jsonSchema(schema);
});
Если ответ не будет соответствовать схеме (например, поле age
будет строкой или будет отсутствовать поле email
), тест упадет с подробным описанием ошибки.
Отладка
Когда тесты ведут себя не так, как ожидалось, главный инструмент для отладки — это Postman Console (открывается кнопкой Console внизу окна).
Вывод в консоль
Используйте console.log()
для вывода значений переменных, частей ответа или просто сообщений.
// Вывод значения переменной
console.log("Current user ID:", pm.environment.get("userId"));
// Вывод всего тела ответа
const response = pm.response.json();
console.log("Full response body:", response);
// Вывод типа данных
console.log("Type of 'age' field:", typeof response.age);
Частые ошибки
- AssertionError: expected <value> to deeply equal '<value>'
Часто возникает при сравнении разных типов данных, например, числа и строки (pm.expect(1).to.eql("1")
). - ReferenceError: <variable> is not defined
Переменная не определена в текущей области видимости. Например, переменная, объявленная внутри одногоpm.test()
, недоступна в другом. - AssertionError: expected undefined to deeply equal <value>
Вы пытаетесь проверить свойство, которого нет в объекте. Например,pm.response.json().name
, когда в ответе нет поляname
.