0

アイテム コレクションを含む注文リクエストがあります - 以下に示します。

各アイテムはデータベース テーブルに単一のレコードとして保存され、特定の注文の OrderId によって結合されます

2つのアイテムでリクエスト

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

DataSource ステップを使用して、クエリを使用してデータベースからデータを取得し、クエリ結果の値をリクエスト要素にマップしました。

ただし、これを行うことで、注文リクエストに追加できるアイテムは 1 つだけです。特定の orderID に対して返される行数に基づいてアイテム コレクションにオブジェクトを動的に追加する方法はありますか?

編集 例として、2 つの注文ステップ 1: DataSource ステップのサンプル値を取得しました。最初の列のカウントは、特定の注文 ID のアイテムの数を定義します。基本的に追加するアイテム コレクションの数

ここに画像の説明を入力

ステップ 2: SOAP リクエスト ステップ - 要素の値は、データソース ステップの列に直接マップされます。ただし、上記のように、特定の注文のアイテム数に基づいてコレクションを追加する必要があります。例: 注文 ID 1 には 2 つのアイテムがあり、注文 ID 2 には 4 つのアイテムがあります。したがって、1 つは 2 項目、もう 1 つは 4 項目の 2 つの要求を行う必要があります。現在、私はそれを直接マッピングしていますが

<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: データソース ループ ステップ - これは基本的に、データソース ステップのすべてのデータに対して上記の 2 つのステップをループします。したがって、そのまま実行すると、それぞれ1つのアイテムで6つのリクエストが行われます

4

1 に答える 1

1

これが私が同じことを達成する方法です:

以下はグルーヴィーなスクリプトです。これは、アイテムのリストを含む任意の 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 に答える