Вводные
- Написан API для Битрикс (заготовка описана в статье //infostart.ru/1c/articles/1185983/)
- Добавлен блок обновления остатков PUT /product_remains_by_stock с массивом остатков
- Программистам Битрикс поставлена задача изменять активность торгового предложения при обновлении остатков исходя из наличия на складе.
- Нужно проверить доработку
Проблема
Тестирование заключается в
- Нажали кнопку выгрузить в 1С
- Проверили на витрине
- Если на витрине не нашли, то проверили в админ панели
Тестирование только ручное.
Схема компонентов
Вариант решения
- Доработать API для получения информации о элементе торгового предложения
- Создать коллекцию в Postman описав в ней тесты
Материалы требуемые для работы
- Варианты проверок, перевод //infostart.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);
Порядок проверки остатков
- проверяю что есть массив остатков
- очищаю, проверяю на пустой массив и отсутствие активности
- устанавливаю остаток по складу, проверяю остаток и активность
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, разобраться с переменными и выражениями для проверки.
В результате получаем удобный инструмент который можно передать заказчику и уменьшить количество вопросов связанных с обменом.
Благодарю за внимание.