SOAPUI PRO - Как динамически создавать запрос мыла, добавляя объекты коллекции на основе данных, доступных в базе данных
У меня есть запрос заказа, который содержит коллекции предметов - показано ниже
Каждый элемент сохраняется как отдельная запись в таблице базы данных, которые связаны вместе OrderId для определенного заказа
Запрос с двумя предметами
<orderRequest>
<orderTimestamp>
<!--1 or more repetitions:-->
<items>
<item>
</itemName>
</quantity>
</unitPrice>
</item>
<item>
</itemName>
</quantity>
</unitPrice>
</item>
</items>
</orderRequest>
Я использую шаг DataSource для извлечения данных из базы данных с помощью запроса и сопоставил значения из результатов запроса с элементами запроса.
Однако, делая это, я могу добавить только один элемент в запрос заказа. Есть ли способ, которым я могу динамически добавлять объекты в коллекцию элементов на основе количества строк, возвращаемых для определенного orderID?
Для целей примера я взял примерные значения для двух порядков Шаг 1: Шаг источника данных. Количество в первом столбце определяет номер элемента для данного идентификатора заказа. По сути, количество предметов коллекции, которые будут добавлены
Шаг 2: Шаг запроса SOAP - Значение элементов напрямую отображается в столбец шага источника данных. Однако, как указано выше, нам нужно будет добавить коллекцию на основе количества элементов для данного заказа. Например: идентификатор заказа 1 имеет 2 элемента, идентификатор заказа 2 имеет 4 элемента. Таким образом, необходимо сделать два запроса: один с двумя предметами, а второй с четырьмя. В настоящее время, хотя я сопоставил это непосредственно
<orderRequest>
<orderTimestamp>${OrderData#orderTimestamp}</orderTimestamp>
<!--1 or more repetitions:-->
<items>
<item>
<itemName>${OrderData#itemName}</itemName>
<quantity>${OrderData#quantity}</quantity>
<unitPrice>${OrderData#unitPrice}</unitPrice>
</item>
</items>
</orderRequest>
Шаг 3: шаг зацикливания источника данных. По сути, это повторяет два вышеупомянутых шага для всех данных на шаге источника данных. Так что, если я буду работать как есть, он сделает 6 запросов с одним элементом каждый
1 ответ
Вот как я бы достиг того же:
Ниже приводится отличный сценарий. Это предполагает произвольный набор результатов шага теста jdbc со списком элементов и построение динамического фрагмента xml из результата jdbc.
/**
* Below is the groovy script which builds data from jdbc result set
* list of data into xml snippet
* and set xml snippet as test case property
**/
import groovy.xml.*
//For testing using the fixed jdbc result
def xml = '''<?xml version="1.0" encoding="utf-8"?>
<Results>
<ResultSet fetchSize="100">
<Row rowNumber="1">
<ITEMNAME>item1</ITEMNAME>
<QUANTITY>1</QUANTITY>
<UNITPRICE>12</UNITPRICE>
</Row>
<Row rowNumber="2">
<ITEMNAME>item2</ITEMNAME>
<QUANTITY>1</QUANTITY>
<UNITPRICE>120</UNITPRICE>
</Row>
<Row rowNumber="3">
<ITEMNAME>item3</ITEMNAME>
<QUANTITY>10</QUANTITY>
<UNITPRICE>112</UNITPRICE>
</Row>
</ResultSet>
</Results>'''
//if you want to pass the dynamic jdbc response instead of above fixed xml, then
//use below statements by uncommenting below one and replace value for JDBC_TEST_STEP_NAME and
//comment above xml statement
/**
def xml = context.expand('${JDBC_TEST_STEP_NAME#Response}')
**/
//parse the jdbc results
def results = new XmlSlurper().parseText(xml)
def writer = new StringWriter()
def userItems = new MarkupBuilder(writer)
//build items element
userItems.items {
//loop thru each Row of the result set
results.ResultSet.Row.each { row ->
//building the item dynamically with data from jdbc result set
item {
//add value for elements
itemName(row.ITEMNAME)
quantity(row.QUANTITY)
unitPrice(row.UNITPRICE)
}
}
}
log.info writer.toString()
//set xml snippet to the test case custom property
context.testCase.setPropertyValue('DYNAMIC_ITEMS', writer.toString())
К настоящему времени построено динамическое <items>
будет частью свойства уровня теста DYNAMIC_ITEMS
,
В вашем запросе используйте расширение свойства, т. Е. Там, где вам нужен динамический список значений, просто используйте, как показано ниже:
<orderRequest>
<orderTimestamp>
<!--1 or more repetitions:-->
${#TestCase#DYNAMIC_ITEMS}
</orderRequest>
Когда вы нажмете на запрос веб-службы, значение будет заменено, как вам нужно.
Для быстрого тестирования, основная часть скрипта доступна здесь, поэтому нажмите на ссылку и посмотрите результат.
Надеюсь это поможет.