0

我有一个包含项目集合的订单请求 - 如下所示

每个项目都保存为数据库表中的单个记录,这些记录由特定订单的 OrderId 绑定在一起

请求两个项目

<orderRequest>         
            <orderTimestamp>                      
            <!--1 or more repetitions:-->
             <items>
               <item>
                  </itemName>
                  </quantity>
                  </unitPrice>  
               </item>
               <item>
                  </itemName>
                  </quantity>
                  </unitPrice>     
               </item>
            </items>         
      </orderRequest>     

我正在使用 DataSource 步骤使用 Query 从数据库中提取数据,并将查询结果中的值映射到请求元素上。

但是,通过这样做,我只能将一项添加到订单请求中。有没有一种方法可以根据为特定 orderID 返回的行数将对象动态添加到项目集合中?

编辑 出于示例目的,我为两个顺序步骤 1:数据源步骤获取了示例值。第一列中的计数定义给定订单 ID 的项目数。本质上是要添加的项目集合的数量

在此处输入图像描述

步骤 2:SOAP 请求步骤 - 元素值直接映射到数据源步骤的列。但是,如上所述,我们需要根据给定订单的商品数量添加集合 例如:订单 ID 1 有 2 件商品,订单 ID 2 有 4 件商品。所以必须提出两个请求,一个有 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 个请求,每个请求一个项目

4

1 回答 1

1

以下是我将如何实现相同的目标:

以下是 groovy 脚本。这假设使用带有项目列表的任意 jdbc 测试步骤结果集,并从 jdbc 结果构建动态 xml 片段。

/**
* 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> 

当您点击 Web 服务请求时,将根据需要替换值。

为了快速测试,脚本的核心部分在这里可用,所以点击链接查看结果。

希望这可以帮助。

于 2016-06-06T17:29:53.883 回答