Как мне заблокировать отправку неопределенных переменных в Postman?

#javascript #json #postman

#javascript #json #postman

Вопрос:

Я использую Postman для запуска теста на API, используя CSV-файл в качестве внешних данных файла. В файле CSV имеется несколько наборов данных с разным объемом данных, некоторые с данными, а некоторые без. Когда я запускаю collection runner и он запускает первый набор данных, происходит сбой, потому что есть переменные, которые не были определены, и API выдает ошибку данных.

В CSV

  1. Набор данных 1

    • заказ, идентификатор клиента, штрих-код 1, количество 1, цена единицы 1
  2. Набор данных 2

    • заказ, идентификатор клиента, штрих-код 1, количество 1, цена единицы 1, штрих-код 2, количество 2, цена единицы 2
  3. Набор данных 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}} в качестве переменной в теле.

Вы можете сослаться на скриншот, если есть какая-либо путаница. необработанное тело json

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

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-файлом, но отлично работает, когда среды уже установлены