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

时间:2017-04-21 11:37:34

标签: xml groovy compare soapui

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

使用:SoapUI 4.6.1

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

我想过"断言"在请求中,但是"预期结果"是字符串,我无法从另一个请求输入数据。

所以,确保你把一切都做对了: 这是一个请求(内部数据是我们需要的)哪些响应包含我们不需要的数据。然后再提出另一个请求,然后请求响应(内部数据是我们需要的)

<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响应中的所有值xxx,yyy,zzz,aaaN,bbbN and cccN进行比较!如果它们不相等 - 弹出一个断言或错误。

1 个答案:

答案 0 :(得分:0)

这是一个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顺序,以确保它可以按任何顺序处理元素列表。