среда, 23 июля 2025 г.

Postman

Пройдены курсы:
https://stepik.org/course/120679

https://stepik.org/course/198019

https://stepik.org/users/625350177/profile

Для совершенных новичков будет тяжеловато, а для тех, кто уже знает азы - вполне.

Список статей по скриптам:
https://habr.com/ru/articles/906150/

https://qaservicelab.ru/blog/polnyj-gajd-po-postman/

https://infostart.ru/1c/articles/1545930/

https://testengineer.ru/common-test-scripts-in-postman/

И конечно лучшее здесь это документация Postman https://learning.postman.com/docs/tests-and-scripts/tests-and-scripts/  - для перевода можно открыть в браузера яндекса + использовать ИИ для разбора некоторых моментов.

+ немного скриптов от себя:


/**
 * Тест для проверки статуса ответа
 * @description Проверяет, что статус ответа равен ожидаемому значению.
 * @param {number} expectedStatus - Ожидаемый статус ответа.
 */
pm.test("Status code is 200", function () {
    pm.response.to.have.status(200);
});

/**
 * @description Функция для проверки статуса ответа.
 * @returns {void} Ничего не возвращает.
 * @example "Проверка статуса ответа" - проверка, что статус ответа равен 200.
 * @throws {Error} Если статус ответа не соответствует ожидаемому значению.
 * @example "Проверка статуса ответа" - проверка, что статус ответа равен 200.
 */
pm.test("Status code is 200", function () {
    pm.expect(pm.response.code).to.eql(200);
});

/** другой вариант написания
*/
pm.test("Status code is 200", () => {
    pm.expect(pm.response.code).to.eql(200);
});


/**
 * @description Функция для проверки, что окружение является " ".
 * @returns {void} Ничего не возвращает.
 * @example "Проверка окружения" - проверка, что окружение является " ".
 * @throws {Error} Если окружение не является " ".
 */
pm.test("environment to be", function () {
    pm.expect(pm.environment.get("env")).to.equal("Test");
});

/**
 * @description Функция для проверки статуса ответа.
 * @returns {void} Ничего не возвращает.
 * @example "Проверка статуса ответа" - проверка, что статус ответа равен 200.  
 */
pm.test("Проверка статуса ответа", function () {
    try {
        const statusCode = pm.response.code;
       
        pm.expect(statusCode).to.equal(200,
            `Ожидался статус 200, получен ${statusCode}`);
       
        console.log("Статус ответа проверен успешно");
    } catch (error) {
        console.error("Ошибка при проверке статуса:", error.message);
        pm.expect.fail(error.message);
    }
});


/**
 * @description Функция для получения значения переменной окружения.
 * @param {string} key - Ключ переменной окружения.
 * @returns {string} Значение переменной окружения.
 * @example "personnelNumber": "1234567890"
 * @throws {Error} Если переменная окружения не найдена.
 */
var jsonData = pm.response.json();

/**
 * @description Функция для установки переменной окружения.
 * @param {string} key - Ключ переменной окружения.
 * @returns {string} Значение переменной окружения.
 * @example "sessionId": "1234567890"
 * @throws {Error} Если статус ответа не соответствует ожидаемому значению.
 */
pm.collectionVariables.set("sessionId", jsonData.sessionId)

/**
 * @description Функция для проверки ответа.
 * @returns {void} Ничего не возвращает.
 * @example "Проверка ответа" - проверка, что позиция сотрудника "Водитель" и что сотрудник является объектом с строковым значением personnelNumber.
 * @throws {Error} Если проверка не пройдена.
 * @example "Проверка статуса ответа" - проверка, что статус ответа равен 200.
 */
pm.test("Проверка ответа", function () {
    const response = pm.response.json();
   
    pm.expect(response.employee.position).to.eql("Водитель");
    pm.expect(response.employee).to.be.an("object");
    pm.expect(response.employee.personnelNumber).to.be.a("string");
});

/**
 * @description Функция для проверки корректности ответа API.
 * @returns {void} Ничего не возвращает.
 * @example "Проверка статуса ответа" - проверка, что статус ответа равен 200 или 201.
 * @example "Проверка типа контента" - проверка, что тип контента ответа равен "application/json".
 * @example "Проверка наличия JSON тела" - проверка, что тело ответа является объектом.
 * @example "Проверка отсутствия поля 'error'" - проверка, что поле "error" отсутствует в ответе.
 * @example "Проверка структуры ответа" - проверка, что ответ является объектом.
 */
pm.test("Проверка корректности ответа API", function () {
    try {
        // Проверка статуса ответа
        pm.expect(pm.response.code).to.be.oneOf([200, 201]);

        // Проверка статуса ответа
        pm.expect(pm.response.code).to.be.within(200, 299);
       
        // Проверка типа контента
        pm.expect(pm.response.headers.get("Content-Type")).to.contain("application/json");
       
        // Проверка наличия JSON тела
        const responseBody = pm.response.json();
        pm.expect(responseBody).to.exist;
       
        // Проверка отсутствия поля "error"
        pm.expect(responseBody).to.not.have.property("error");
       
        // Дополнительная проверка структуры ответа
        pm.expect(responseBody).to.be.an("object");
       
        console.log("Ответ API проверен успешно");
    } catch (error) {
        console.error("Ошибка при проверке ответа:", error.message);
        pm.expect.fail(error.message);
    }
});

/**
 * @description Функция для проверки подробности ответа.
 * @returns {void} Ничего не возвращает.
 * @example "Подробная проверка ответа" - проверка, что статус ответа в диапазоне 200-299, что тип контента ответа "application/json", что тело ответа не пусто и является объектом.
 * @example "Проверка статуса ответа" - проверка, что статус ответа в диапазоне 200-299.
 * @example "Проверка типа контента" - проверка, что тип контента ответа "application/json".
 */
pm.test("Подробная проверка ответа", function () {
 try {
 pm.response.to.be.ok;
 
 const status = pm.response.code;
 
 pm.expect(status).to.be.within(200, 299);
 pm.expect(pm.response.headers.get("Content-Type")).to.contain("application/json");
 
 const response = pm.response.json();
 pm.expect(response).to.exist;
 
 console.log(`Запрос успешно выполнен со статусом ${status}`);
 } catch (error) {
 console.error("Ошибка при проверке ответа:", error.message);
 pm.expect.fail(error.message);
 }
});

/**
 * @description Функция для проверки наличия тела ответа.
 * @returns {void} Ничего не возвращает.
 * @example "Проверка наличия тела ответа" - проверка, что тело ответа не пусто.
 * @example "Проверка наличия JSON тела" - проверка, что тело ответа является объектом.
 */
pm.test("response must be valid and have a body", function () {
    pm.response.to.be.ok;
    pm.response.to.be.withBody;
    pm.response.to.be.json;
});


//


/**
 * @description Функция для проверки свойств ответа.
 * @example "Проверка свойств ответа" - проверка, что ответ содержит обязательные свойства "type", "name", "id" и что их значения соответствуют ожидаем
 * @returns {void} Ничего не возвращает.
*/
 
 pm.test("Комплексная проверка свойств ответа", function () {
    try {
        const responseJson = pm.response.json();
       
        // Базовая проверка структуры
        pm.expect(responseJson).to.exist;
        pm.expect(responseJson).to.be.an('object');
       
        // Проверка обязательных свойств
        pm.expect(responseJson).to.have.all.keys('type', 'name', 'id');
       
        // Проверка значений
        pm.expect(responseJson.type).to.equal('vip');
        pm.expect(responseJson.name).to.be.a('string');
        pm.expect(responseJson.name).to.not.be.empty;
       
        // Проверка ID
        pm.expect(responseJson.id).to.be.a('string');
        pm.expect(responseJson.id).to.have.lengthOf(1);
        pm.expect(responseJson.id).to.match(/^[a-zA-Z0-9]+$/); // проверка формата
       
        console.log("Все проверки пройдены успешно");
    } catch (error) {
        console.error("Ошибка:", error.message);
        pm.expect.fail(error.message);
    }
});

/**
 * @description Функция для проверки формата ID.
 * @example "Проверка формата ID" - проверка, что ID соответствует формату UUID или состоит только из букв и цифр.
 * @returns {void} Ничего не возвращает.
 */
pm.test("Проверка формата ID", function () {
    const responseJson = pm.response.json();
   
    // Базовая проверка
    pm.expect(responseJson.id).to.match(/^[a-zA-Z0-9]+$/);
   
    // Альтернативные варианты
    // Только цифры
    pm.expect(responseJson.id).to.match(/^\d+$/);
   
    // Буквы и цифры с подчеркиванием
    pm.expect(responseJson.id).to.match(/^[a-zA-Z0-9_]+$/);
   
    // UUID формат
    pm.expect(responseJson.id).to.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
});

/**
 * @description Функция для проверки формата электронной почты.
 */
pm.expect(email).to.match(/^[^\s@]+@[^\s@]+\.[^\s@]+$/);

/**
 * @description Функция для проверки формата номера телефона.
 */
pm.expect(phone).to.match(/^\+?[0-9]{10,15}$/);

/**
 * @description Функция для проверки формата даты.
 */
pm.expect(date).to.match(/^\d{4}-\d{2}-\d{2}$/); // формат YYYY-MM-DD

/**
 * @description Функция для проверки формата ID.
 */
pm.test("Комплексная проверка ID", function () {
    try {
        const responseJson = pm.response.json();
       
        // Проверка существования
        pm.expect(responseJson.id).to.exist;
       
        // Проверка типа
        pm.expect(responseJson.id).to.be.a('string');
       
        // Проверка формата
        pm.expect(responseJson.id).to.match(/^[a-zA-Z0-9]+$/);
       
        // Дополнительная проверка длины
        pm.expect(responseJson.id).to.have.lengthOf(10);
       
        console.log("ID прошел все проверки");
    } catch (error) {
        console.error("Ошибка при проверке ID:", error.message);
        pm.expect.fail(error.message);
    }
});

pm.test("Проверка JSON ответа", function () {
    try {
        const responseJson = pm.response.json();
       
        // Базовые проверки
        pm.expect(responseJson).to.exist;
        pm.expect(responseJson).to.be.an('object');
       
        // Проверка конкретных полей
        pm.expect(responseJson.id).to.be.a('string');
        pm.expect(responseJson.name).to.be.a('string');
        pm.expect(responseJson.name).to.not.be.empty;
       
        // Сохранение значений
        pm.environment.set("userId", responseJson.id);
       
        console.log("JSON ответ успешно обработан");
    } catch (error) {
        console.error("Ошибка:", error.message);
        pm.expect.fail("Не удалось обработать JSON ответ");
    }
});

pm.test("Комплексная проверка XML ответа", function () {
    try {
        // Преобразуем XML в JSON
        const responseJson = xml2Json(pm.response.text());
       
        // Проверка базового ответа
        pm.expect(responseJson).to.exist;
        pm.expect(responseJson).to.be.an('object');
       
        // Проверка HTTP статуса
        pm.expect(pm.response.code).to.equal(200);
       
        // Проверка времени ответа
        pm.expect(pm.response.responseTime).to.be.below(1000);
       
        // Проверка Content-Type
        pm.expect(pm.response.headers.get("Content-Type"))
            .to.contain("application/xml");
       
        // Проверка корневой ноды
        const root = Object.keys(responseJson)[0];
        pm.expect(root).to.equal('users');
       
        // Проверка наличия обязательных элементов
        pm.expect(responseJson.users).to.have.property('user');
        pm.expect(responseJson.users.user).to.be.an('array');
       
        // Проверка количества пользователей
        pm.expect(responseJson.users.user).to.have.lengthOf(3);
       
        // Проверка каждого пользователя
        responseJson.users.user.forEach((user, index) => {
            pm.test(`Проверка пользователя ${index + 1}`, () => {
                // Проверка обязательных полей
                pm.expect(user).to.have.property('id');
                pm.expect(user).to.have.property('name');
                pm.expect(user).to.have.property('email');
               
                // Проверка типов данных
                pm.expect(user.id).to.be.a('string');
                pm.expect(user.name).to.be.a('string');
                pm.expect(user.email).to.be.a('string');
               
                // Проверка форматов
                pm.expect(user.id).to.match(/^\d+$/);
                pm.expect(user.email).to.match(/^^@\s+@^@\s+\.^@\s+$/);
               
                // Проверка бизнес-логики
                pm.expect(user.name).to.not.be.empty;
                pm.expect(user.email).to.not.be.empty;
            });
        });
       
        // Дополнительная проверка атрибутов
        if (responseJson.users.hasOwnProperty('attributes')) {
            pm.expect(responseJson.users.attributes.total).to.equal('3');
        }
       
        // Сохранение важных данных
        pm.environment.set("totalUsers", responseJson.users.user.length);
       
        console.log("Все проверки XML данных пройдены успешно");
    } catch (error) {
        console.error("Ошибка при проверке XML данных:", error.message);
        pm.expect.fail("Тест не пройден: " + error.message);
    }
});

pm.test("Проверка XML ответа", function () {
    try {
        // Получаем и преобразуем ответ
        const responseJson = xml2Json(pm.response.text());
       
        // Базовые проверки
        pm.expect(responseJson).to.exist;
        pm.expect(responseJson).to.be.an('object');
       
        // Проверка конкретных полей
        pm.expect(responseJson.user.id).to.be.a('string');
        pm.expect(responseJson.user.name).to.be.a('string');
        pm.expect(responseJson.user.name).to.not.be.empty;
       
        // Сохранение значений
        pm.environment.set("userId", responseJson.user.id);
       
        console.log("XML ответ успешно обработан");
    } catch (error) {
        console.error("Ошибка:", error.message);
        pm.expect.fail("Не удалось обработать XML ответ");
    }
});

pm.test("Комплексная проверка CSV ответа", function () {
 try {
 // Получаем и парсим CSV данные
 const responseJson = parse(pm.response.text(), {
 delimiter: ',',
 trim: true,
 columns: true,
 skip_empty_lines: true
 });
 
 // Проверка базового ответа
 pm.expect(responseJson).to.exist;
 pm.expect(responseJson).to.be.an('array');
 
 // Проверка HTTP статуса
 pm.expect(pm.response.code).to.equal(200);
 
 // Проверка времени ответа
 pm.expect(pm.response.responseTime).to.be.below(1000);
 
 // Проверка Content-Type
 pm.expect(pm.response.headers.get("Content-Type"))
 .to.contain("text/csv");
 
 // Проверка количества записей
 pm.expect(responseJson).to.have.lengthOf(3);
 
 // Проверка заголовков
 const headers = Object.keys(responseJson0);
 pm.expect(headers).to.have.members(['id', 'name', 'age', 'email']);
 
 // Проверка конкретных значений
 responseJson.forEach((row, index) => {
 pm.test(`Проверка записи ${index + 1}`, () => {
 pm.expect(row.id).to.be.a('string');
 pm.expect(row.id).to.match(/^\d+$/);
 
 pm.expect(row.name).to.be.a('string');
 pm.expect(row.name).to.not.be.empty;
 
 pm.expect(row.age).to.be.a('string');
 pm.expect(parseInt(row.age)).to.be.above(18);
 
 pm.expect(row.email).to.be.a('string');
 pm.expect(row.email).to.match(/^[^@\s]+@[^@\s]+\.[^@\s]+$/);
 });
 });
 
 // Дополнительная бизнес-логика
 const totalAge = responseJson.reduce((sum, row) => sum + parseInt(row.age), 0);
 pm.expect(totalAge).to.be.above(70);
 
 // Сохранение важных данных
 pm.environment.set("totalRecords", responseJson.length);
 pm.environment.set("averageAge", totalAge / responseJson.length);
 
 console.log("Все проверки CSV данных пройдены успешно");
 } catch (error) {
 console.error("Ошибка при проверке CSV данных:", error.message);
 pm.expect.fail("Тест не пройден: " + error.message);
 }
});

pm.test("Проверка HTML ответа", function () {
 try {
 // Загружаем HTML
 const $ = cheerio.load(pm.response.text());
 
 // Базовая проверка ответа
 pm.expect(pm.response.code).to.equal(200);
 pm.expect(pm.response.responseTime).to.be.below(1000);
 pm.expect(pm.response.headers.get("Content-Type"))
.to.contain("text/html");
 
 // Проверка наличия основных элементов
 pm.test("Проверка заголовка страницы", () => {
 const title = $('title').text();
 pm.expect(title).to.equal('Главная страница');
 });
 
 pm.test("Проверка навигационного меню", () => {
 const navItems = $('nav ul li').length;
 pm.expect(navItems).to.equal(5);
 });
 
 // Проверка контента
 pm.test("Проверка основного контента", () => {
 const content = $('#main-content').text().trim();
 pm.expect(content).to.contain('Добро пожаловать');
 });
 
 // Проверка форм
 pm.test("Проверка формы входа", () => {
 const form = $('#login-form');
 pm.expect(form).to.exist;
 
 pm.expect(form.find('input[name="username"]')).to.exist;
 pm.expect(form.find('input[name="password"]')).to.exist;
 pm.expect(form.find('button[type="submit"]')).to.exist;
 });
 
 // Проверка атрибутов
 pm.test("Проверка ссылок", () => {
 const links = $('a');
 links.each((index, link) => {
 const href = $(link).attr('href');
 pm.expect(href).to.not.equal('#');
 pm.expect(href).to.match(/^https:\/\//);
 });
 });
 
 // Сохранение важных данных
 const currentUser = $('#user-info .username').text();
 pm.environment.set("currentUser", currentUser);
 
 console.log("Все проверки HTML пройдены успешно");
 } catch (error) {
 console.error("Ошибка при проверке HTML:", error.message);
 pm.expect.fail("Тест не пройден: " + error.message);
 }
});






Комментариев нет:

Отправить комментарий