Thursday, December 22, 2011

Для чего нам нужен Foreach

Постановка задачи.
Ответ (response, он же респонс - мильпардон за слэнг) одного из запросов (request, он же реквест) возвращает несколько числовых значений одновременно, из которых потом нужно сформировать строку определённого вида ("[1,2,3,4,5]") и засунуть её в переменную для дальнейшего использования в качестве параметра в другом запросе.

Для описанного ниже регулярного выражения, запрос возвращал респонс, состоящий из нескольких элементов (с разными значениями, естественно).

"335817" : {
"name" : "Price",
"id" : 335817,
"type" : "price",
"source" : "UTP",
"mId" : 335816
}
На выходе мне нужно было получить строку, которая бы содержала все id в виде ['<'id1'>','<'id2'>',...,'<'idn'>']

Шаг первый - дёргаем группы.
Делается это элементарно. К первому респонсу (что возвращает, в том числе, и искомые числовые значения), добавляем как child (дочерний элемент) Regular Expression Extractor c такими параметрами:


Где
Name ставите произвольное.
Apply to - где будете искать. Мне нужно искать в основном семпле (не в дочерних запросах).
Response field to check - в каком месте запроса искать нужное. Мне нужно искать в самом теле запроса.
Reference Name - имя "переменной", по которой мы будем обращаться к наденному фрагменту(ам).
Regular Expression - само регулярное выражение. Я проверяю его с помощью очень удобного фришного инструмента - Rad Software Regular Expression Designer.
Template - какую порядковую группу из найденных мы используем (если ищем несколько, можем и искать несколько). У меня единственная, она же первая группа.
Match No - тут поступаем так:
Если нужно использовать любое из найденных, ставим 0.
Если нужно использовать какое-то n-ное вхождение, ставим целое положительное n. (Например, 1 будет нам находить первое вхождение из группы).
Чтобы выгрести все - используем отрицательное значение (именно поэтому у меня стоит -1).
Default Value - исходное значение, которое будет подставляться, если искомый фрагмент(ы) не найден.


Шаг второй. Используем ForEach контроллер.

После запроса, из которого мы дёрнули группу, добавляем ForEach контроллер с такими параметрами:

Где
Name ставите произвольное.
Input variable prefix - то самое Reference Name из предыдушего запроса, по которому мы будем обращаться к выделенной группе.
Output variable name - куда мы будем складывать полученное значение.


Шаг третий. Слепляем элементы группы в одну строчку.
К нашему Foreach контроллеру как дочерний элемент добавляем BeanShell Sampler, в коде которого мы пишем, как именно мы хотим видеть строчку.

Я написала так:
String y=vars.get("mIds");

if (y.length() != 0)
{
     y=y.substring(0,y.length()-2);
     y+=",";
}
else
{
     y+="[";
}

y+=String.valueOf("${
meterval}");
y+="]";
vars.put("
mIds",y);


Где переменная mIds была описана в User Defined Variables с пустым значением.

На выходе из ForEach мы получим переменную mIds, которую в дальнейшем можно использовать где угодно. Значением этой переменной и будет искомая строчка.


ПыСы. При отладке запроса, использующего нашу переменную (mIds), не забываем enabl'ить шаги, с помощью которых мы эту переменную получаем :))))
ПыПыСы. Программист из меня тот ещё... Только что дошло, как убрать 4й шаг :)
Потому апдейтим скрипт.

No comments:

Post a Comment