Учебник: Создание автотестов в Postman

Практическое руководство по написанию тестов и скриптов для автоматизации API тестирования.

Основы тестов

Тесты в 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.