Каталог решений - Тестирование API с помощью Postman

Тестирование API с помощью Postman

Тестирование API с помощью Postman

В наличии

В статье опишу создании коллекции Postman с тестами для её пакетного запуска.

Категория:

Описание

Вводные

  • Написан API для Битрикс (заготовка описана в статье //sale.itcity.ru/1c/articles/1185983/)
  • Добавлен блок обновления остатков PUT /product_remains_by_stock с массивом остатков
  • Программистам Битрикс поставлена задача изменять активность торгового предложения при обновлении остатков исходя из наличия на складе.
  • Нужно проверить доработку

Проблема

Тестирование заключается в 

  • Нажали кнопку выгрузить в 1С
  • Проверили на витрине
  • Если на витрине не нашли, то проверили в админ панели

Тестирование только ручное.

Схема компонентов

 

 

Вариант решения

  • Доработать API для получения информации о элементе торгового предложения
  • Создать коллекцию в Postman описав в ней тесты

Материалы требуемые для работы

  • Варианты проверок, перевод //sale.itcity.ru/1c/articles/1545930/
  • Организация последовательности тестирования (без папок) ссылка
  • Работа с переменными ссылка, на данный момент для меня оптимально использовать "collectionVariables"

Тестовый сайт прикрыт basic аутентификацией, поэтому в блоке подготовки (pre-request Script) на уровне коллекции описываем формирование заголовка.

  var CryptoJS = require('crypto-js');
  
  if (pm.collectionVariables.get("basic_username")) {
      var rawStr = CryptoJS.enc.Utf8.parse(pm.collectionVariables.get("basic_username") + ":" + pm.collectionVariables.get("basic_password"));
      var base64 = CryptoJS.enc.Base64.stringify(rawStr);
  
      pm.request.headers.add({ 
          disabled: false,
          description:{
              content: "Basic Auth",
              type: "text/plain"
          },
          key: 'Authorization', 
          name: 'Authorization', 
          value: 'Basic ' + base64
      });
  };

 

Порядок тестирования

1. Проверить доступность API

через GET /ping, проверяем на код ответа 200, если отличается, то прерываем тест

  pm.test("Код ответа 200", function () {
      pm.response.to.have.status(200);
  });
  
  if (pm.response.code != 200) {
      postman.setNextRequest(null);
  }

 

2. Получить список складов

GET /references/stocks, сохранить в переменные, будут нужны для дальнейшей состыковки

  const responseJson = pm.response.json();
  
  pm.test("Код ответа 200", function () {
      pm.response.to.have.status(200);
  });
  
  pm.test("Массив складов не пустой", function () {
      
      pm.expect(responseJson).to.be.an('array').not.to.be.empty;
  });
  
  pm.test("Первый элемент содержит id, xml_id", function () {
      pm.expect(responseJson[0]).have.property('id');
      pm.expect(responseJson[0]).have.property('xml_id');
  });
  
  pm.collectionVariables.set("stock_id", responseJson[0]['id']);
  pm.collectionVariables.set("stock_xml_id", responseJson[0]['xml_id']);
  
  pm.collectionVariables.set("stocks", JSON.stringify(responseJson));

 

3. Получить элемент торгового предложения

GET /references/offers/?limit=1, преобразовать в uri для запроса, получить отдельно id товара.

  const responseJson = pm.response.json();
  
  pm.test("Код ответа 200", function () {
      pm.response.to.have.status(200);
  });
  
  pm.test("Массив торговых предложений из одного эдемента", function () {
      pm.expect(responseJson).to.be.an('array').to.have.lengthOf(1);
  });
  
  pm.test("Первый элемент содержит id, xml_id", function () {
      pm.expect(responseJson[0]).have.property('id');
      pm.expect(responseJson[0]).have.property('xml_id');
  });
  
  arrXMLId = responseJson[0]['xml_id'].split("#");
  
  pm.test("xml_id из двух подстрок", function () {
      pm.expect(arrXMLId).to.have.lengthOf(2);
  });
  
  pm.collectionVariables.set("product_xml_id", arrXMLId[0]);
  pm.collectionVariables.set("offer_xml_id", arrXMLId[1]);
  
  pm.collectionVariables.set("offer_xml_uri", responseJson[0]['xml_id'].replace("#","_"));
  
  pm.collectionVariables.set("testing_stage", 1);

 

Порядок проверки остатков

  1. проверяю что есть массив остатков
  2. очищаю, проверяю на пустой массив и отсутствие активности
  3. устанавливаю остаток по складу, проверяю остаток и активность

 

4. Проверка

сделана через GET /references/offers/{{offer_xml_uri}}/ в ней же устанавливаю параметры для изменения остатков

  const responseJson = pm.response.json();
  stocks = JSON.parse(pm.collectionVariables.get("stocks"));
  testing_stage = parseInt(pm.collectionVariables.get("testing_stage"));
  remains = 100;
  
  pm.test("Код ответа 200", function () {
      pm.response.to.have.status(200);
  });
  
  if (testing_stage ==  1) {
  pm.test("Часть" + testing_stage +", Есть массив остатков", function () {
      pm.expect(responseJson).to.have.property('store').to.be.an('array');
  });
  }
  
  if (testing_stage ==  2) {
      pm.test("Часть" + testing_stage +", Массив остатков пустой", function () {
          pm.expect(responseJson['store']).to.be.empty;
      });
      pm.test("Часть" + testing_stage +", Торговое предложение не активно", function () {
          pm.expect(responseJson).to.have.property('active').to.equal(false);
      });
  }
  
  if (testing_stage ==  3) {
  
      pm.test("Часть" + testing_stage +", Остаток совпадает", function () {
          store_obj = {store: parseInt(pm.collectionVariables.get("stock_id")), amount: remains};
          pm.expect(responseJson['store']).to.deep.include(store_obj);
      });
  
      pm.test("Часть" + testing_stage +", Торговое предложение активно", function () {
          pm.expect(responseJson).to.have.property('active').to.equal(true);
      });
  
  }
  
  if (testing_stage == 1 || testing_stage == 3) {
      remains_by_stock = responseJson['store'].map((item)=> {
          return {
          product: pm.collectionVariables.get("product_xml_id"),
          offer: pm.collectionVariables.get("offer_xml_id"),
          stock: getStockXMLIdById(item['store']),
          remains: 0
          }
      });    
  } else if (testing_stage == 2) {
     
          remains_by_stock = [{
          product: pm.collectionVariables.get("product_xml_id"),
          offer: pm.collectionVariables.get("offer_xml_id"),
          stock: pm.collectionVariables.get("stock_xml_id"),
          remains: remains
          }] 
  }
  
  pm.collectionVariables.set("remains_by_stock", JSON.stringify(remains_by_stock));
  pm.collectionVariables.set("testing_stage", testing_stage + 1);
  
  function getStockXMLIdById(stock_id) {
      stock = stocks.find( item => {
          return item['id'] == stock_id});
      return stock['xml_id'];   
  }

 

5. Обновляю остаток

через PUT /references/product_remains_by_stock/by_xml_id/, проверяю на код ответа, возвращаю на проверку

  pm.test("Код состояния 204", function () {
      pm.response.to.have.status(204);
  });
  
  testing_stage = parseInt(pm.collectionVariables.get("testing_stage"));
  
  if (testing_stage == 2 || testing_stage == 3) {
      postman.setNextRequest("Проверить остатки");
  }

 

Запуск коллекции

 

 

 

Получаю одну ошибку, потому что функционал смены активности не реализован.

 

 

Итог

Для написания тестов под Postman нужно базово освоить JavaScript, разобраться с переменными и выражениями для проверки.

В результате получаем удобный инструмент который можно передать заказчику и уменьшить количество вопросов связанных  с обменом.

 

Благодарю за внимание.

has been added to your cart:
Оформление заказа