如何在 Soapui 中比较来自一个响应和另一个请求的数据

How to compare data from one response and another request in Soapui

那么,大家好。这是我第一次来这里,我很想听听你的回答。

工作于:SoapUI 4.6.1

我有带请求的 WSDL,我正在进行功能测试。 在我的 TestCase 中,我需要来自一个请求和不同响应的值进行比较和相等。我在哪里可以这样做以及如何做?

我在请求中考虑过 "assertions",但 "Expected Result" 是字符串,我无法从另一个请求中输入数据。

所以,为了确保你做对了一切: 这是一个请求(里面的数据是我们需要的),它用一些我们不需要的数据来响应。然后是另一个请求,然后是带有响应的请求(里面的数据是我们需要的)

<soapenv:Envelope .....(there xmlns and scheme links)>
<soapenv:Header/>
<soapenv:Body>
<ban:transactions>
<sessionid>xxx</sessionid>
<scheme_id>yyy</scheme_id>
<scheme_type>zzz</scheme_type>
 <field_list>

  <scheme_field>
   <field_id>aaa1</field_id>
   <type>bbb1</type>
   <value>ccc1</value>
  </scheme_field>

  <scheme_field>
   <field_id>aaa2</field_id>
   <type>bbb2</type>
   <value>ccc2</value>
  </scheme_field>

  <scheme_field>
   <field_id>aaa3</field_id>
   <type>bbb3</type>
   <value>ccc3</value>
  </scheme_field>
        ...
  <scheme_field>
   <field_id>aaaN</field_id>
   <type>bbbN</type>
   <value>cccN</value>
  </scheme_field>
</field_list>
</ban:transactions>
</soapenv:Body>
</soapenv:Envelope>

这是另一个请求(!)的响应:

<soapenv:Envelope .....(there xmlns and scheme links)>
    <soapenv:Header/>
    <soapenv:Body>
    <data>
    <repeat>
    <next_scheme>
    <sessionid>xxx</sessionid>
    <scheme_id>yyy</scheme_id>
    <scheme_type>zzz</scheme_type>
     <field_list>

      <scheme_field>
       <field_id>aaa1</field_id>
       <type>bbb1</type>
       <value>ccc1</value>
      </scheme_field>

      <scheme_field>
       <field_id>aaa2</field_id>
       <type>bbb2</type>
       <value>ccc2</value>
      </scheme_field>

      <scheme_field>
       <field_id>aaa3</field_id>
       <type>bbb3</type>
       <value>ccc3</value>
      </scheme_field>
            ...
      <scheme_field>
       <field_id>aaaN</field_id>
       <type>bbbN</type>
       <value>cccN</value>
      </scheme_field>
    </field_list>
    </next_scheme>
    </repeat>
    </data>
    </soapenv:Body>
    </soapenv:Envelope>

我想比较所有这些值 - 第一个请求xxx,yyy,zzz,aaaN,bbbN and cccN响应[=31]的所有这些值xxx,yyy,zzz,aaaN,bbbN and cccN =]!如果它们不相等 - 弹出断言或错误。

这里是 groovy 脚本,它提取以下各项并对它们进行排序,然后比较数据。

  • sessionid
  • scheme_id
  • scheme_type
  • scheme_field

Groovy 脚本

//Pass the xml string for xml1 and xml2 
//Does not matter which xml you pass to which variable
//Not assigned here in the below to save the space.

def xml1 = 
def xml2 = 

//Closure to get the element data
def getData = { data, element -> data.'**'.findAll{it.name() == element} }

//Closure to sort criteria for scheme_field
def criteria = {a, b -> a.field_id.text() <=> b.field_id.text() ?: a.type.text() <=> b.type.text() ?: a.value.text() <=> b.value.text()}

def pXml1 = new XmlSlurper().parseText(xml1)
def pXml2 = new XmlSlurper().parseText(xml2)

//Extract the data from both xml element wise and sort data
def sessions1 = getData(pXml1, 'sessionid').sort()
def sessions2 = getData(pXml2, 'sessionid').sort()

def schemeIds1 = getData(pXml1, 'scheme_id').sort()
def schemeIds2 = getData(pXml2, 'scheme_id').sort()

def schemeTypes1 = getData(pXml1, 'scheme_type').sort()
def schemeTypes2 = getData(pXml2, 'scheme_type').sort()

def schemeFields1 = getData(pXml1, 'scheme_field').sort(criteria)
println schemeFields1
def schemeFields2 = getData(pXml2, 'scheme_field').sort(criteria)
println schemeFields2

//Now do the assertion of both xml data
assert sessions1 == sessions2
assert schemeIds1 == schemeIds2
assert schemeTypes1 == schemeTypes2
assert schemeFields1 == schemeFields2

您可以快速在线试用Demo。另请注意,scheme_field 此演示中的顺序已更改,以确保它可以按任何顺序处理元素列表。