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> 

Когда вы нажмете на запрос веб-службы, значение будет заменено, как вам нужно.

Для быстрого тестирования, основная часть скрипта доступна здесь, поэтому нажмите на ссылку и посмотрите результат.

Надеюсь это поможет.

Другие вопросы по тегам