#javascript #json #postman
#javascript #json #postman
Вопрос:
Я использую Postman для запуска теста на API, используя CSV-файл в качестве внешних данных файла. В файле CSV имеется несколько наборов данных с разным объемом данных, некоторые с данными, а некоторые без. Когда я запускаю collection runner и он запускает первый набор данных, происходит сбой, потому что есть переменные, которые не были определены, и API выдает ошибку данных.
В CSV
-
Набор данных 1
- заказ, идентификатор клиента, штрих-код 1, количество 1, цена единицы 1
-
Набор данных 2
- заказ, идентификатор клиента, штрих-код 1, количество 1, цена единицы 1, штрих-код 2, количество 2, цена единицы 2
-
Набор данных 3
- заказ, идентификатор клиента, штрих-код 1, количество 1, цена единицы 1, штрих-код 2, количество 2, цена единицы 2, штрих-код 3, количество 3, цена единицы 3
In the body I've added that extra variables in case it is available in a data set.
{
"order" : "{{orderId}}",
"clientId" : "{{clientId}}",
"skus" : [
{
"barcode": {{barcode1}},
"quantity": {{quantity1}},
"unitPrice": {{price1}}
},
{
"barcode": {{barcode2}},
"quantity": {{quantity2}},
"unitPrice": {{price2}}
},
{
"barcode": {{barcode3}},
"quantity": {{quantity3}},
"unitPrice": {{price3}}
}
]
}
Это ответ:
{
"order" : "1000305408",
"clientId" : "30",
"skus" : [
{
"barcode": 123123123,
"quantity": 1,
"unitPrice": 100
},
{
"barcode": {{barcode2}},
"quantity": {{quantity2}},
"unitPrice": {{price2}}
}
]
}
Есть ли способ заблокировать эти неопределенные переменные key и data, сохраняя их в теле, на случай, если новый набор данных содержит переменную?
Комментарии:
1. Этот вопрос лучше, чем 99,9% вопросов, размещенных здесь.
2. ха-ха, спасибо за редактирование!
Ответ №1:
Мы можем динамически определять количество наборов, которые присутствуют, используя загруженный файл CSV.
Я просто проверяю, сколько существует наборов штрих-кодов, и, используя это, я готовлю a setCount
, который будет использоваться для перебора данных и создания skus
элементов.
Сценарий предварительного запроса:
_ = require('lodash');
// Here we'll know how many unit counts we have, I am checking barcode only.
let setCount = _.chain(data) // data is the actual iteration data from the csv file, don't worry just run the script.
.keys()
.countBy((item) => item.includes('barcode'))
.value()
.true,
skus = [];
for(var i = 1; i <= setCount; i ) {
skus.push({
barcode: data[`barcode${i}`],
quantity: data[`quantity${i}`],
unitPrice: data[`unitprice${i}`]
});
}
let requestBody = {
order: data["orderId"],
clientId: data["clientId"],
skus: skus
};
pm.variables.set('requestBody', JSON.stringify(requestBody));
На вкладке тела вашего запроса выполните следующие действия:
Установите для тела значение raw с помощью JSON и добавьте {{requestBody}}
в качестве переменной в теле.
Вы можете сослаться на скриншот, если есть какая-либо путаница.
Комментарии:
1. Я пробовал это, но для пустых переменных он все равно будет проходить, потому что он отправляет значение null и выдает ошибку данных. {«skus»:[{«barcode»:5702015989480,»quantity»:1},{«barcode»:5702015989480,»quantity»:1},{«barcode»:null,»quantity»:null},{«barcode»:null,»quantity»:null}]}
2. Хорошо, я добавил штрих-код if else только для нулевой проблемы, и это работает! 🙂
for(var i = 1; i <= setCount; i ) { if (data[
штрих-код ${i}]){ skus.push({ barcode: data[
штрих-код ${i}], quantity: data[
количество${i}], unitPrice: data[
цена за единицу$ {i}] }); } }
Ответ №2:
Вам нужно будет использовать сценарий предварительного запроса для динамического создания вашего JSON.
По сути, это было бы необходимо:
var body = {
order : pm.environment.get('orderId'),
clientId : pm.environment.get('clientId'),
skus : []
};
for (var i = 1; i <= 3; i ) {
var barcode = pm.environment.get('barcode' i);
if (barcode) {
var quantity = pm.environment.get('quantity' i);
var price = pm.environment.get('price' i);
var obj = {
barcode : barcode,
quantity : quantity,
unitPrice : price
}
body.skus.push(obj);
}
}
pm.environment.set('dynamic_json', JSON.stringify(body));
Затем на вкладке Body, где вы обычно размещаете фиксированный JSON, используйте только это:
{{dynamic_json}}
Комментарии:
1. Это не работает с runner и CSV-файлом, но отлично работает, когда среды уже установлены