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

Xml 如何在Soapui中比较来自一个响应和另一个请求的数据,xml,groovy,compare,soapui,Xml,Groovy,Compare,Soapui,大家好。这是我第一次来这里,我很想听到你的回答 工作环境:SoapUI 4.6.1 我有WSDL和请求,我正在做功能测试。 在我的测试用例中,我需要一个请求和不同响应的值进行比较并相等。我在哪里可以做,怎么做 我考虑过请求中的“断言”,但“预期结果”是字符串,我不能从另一个请求中输入数据 所以,为了确保一切都正确: 这是一个请求(里面的数据就是我们所需要的)它的响应包含一些我们不需要的数据。然后是另一些请求,然后是请求和响应(里面的数据是我们需要的) xxx yyy zzz aaa1 bbb1

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

工作环境:SoapUI 4.6.1

我有WSDL和请求,我正在做功能测试。 在我的测试用例中,我需要一个请求和不同响应的值进行比较并相等。我在哪里可以做,怎么做

我考虑过请求中的“断言”,但“预期结果”是字符串,我不能从另一个请求中输入数据

所以,为了确保一切都正确: 这是一个请求(里面的数据就是我们所需要的)它的响应包含一些我们不需要的数据。然后是另一些请求,然后是请求和响应(里面的数据是我们需要的)


xxx
yyy
zzz
aaa1
bbb1
ccc1
aaa2
bbb2
ccc2
aaa3
bbb3
ccc3
...
安
bbbN
中国有线电视网
这是另一个请求的响应(!):


xxx
yyy
zzz
aaa1
bbb1
ccc1
aaa2
bbb2
ccc2
aaa3
bbb3
ccc3
...
安
bbbN
中国有线电视网

我想将第一个请求中的所有这些值-
xxx,yyy,zzz,aaaN,bbbN和cccN
响应中的所有这些值
xxx,yyy,zzz,aaaN,bbbN和cccN
进行比较!如果它们不相等,则弹出一个断言或错误。

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

  • 会话ID
  • 方案编号
  • 方案类型
  • 方案(u)场
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
//传递xml1和xml2的xml字符串
//将哪个xml传递给哪个变量并不重要
//未在下面的此处指定以节省空间。
def xml1=
def xml2=
//闭包以获取元素数据
def getData={data,element->data.'**'.findAll{it.name()==element}
//方案\字段排序标准的闭包
定义条件={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)
//从xml元素和排序数据中提取数据
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 schemefelds1=getData(pXml1,“scheme_字段”).sort(标准)
println schemeFields1
def schemefelds2=getData(pXml2,“scheme_字段”).sort(标准)
println schemeFields2
//现在执行两个xml数据的断言
断言会话1==会话2
断言schemeIds1==schemeIds2
断言schemeTypes1==schemeTypes2
断言schemeFields1==schemeFields2

你可以在线快速尝试。请注意,在此演示中,
scheme\u字段
顺序已更改,以确保它可以以任何顺序处理元素列表。

Nikita,您的意思是说测试用例中有测试步骤,您希望比较来自同一请求的响应中的值?还是别的什么要求?它们都在同一个测试用例中吗?顺便问一下,它包含所有的数据吗?或者你放在那里的经过修剪的数据?你有机会尝试解决方案吗?谢谢Rao,我会尝试你的方法。在我创建了这篇文章之后,我在一个网站上发现了一个方法:
defxxx=context.expand('${Creation}request}//scheme#id}')defyy=context.expand('${Repeat}response}//scheme#id})assert xxx==yyyy,testRunner.fail(“scheme#id不相等”)
这个方法工作得很好,但我不知道——这个方法将来会不会影响错误?在这里创建和重复是测试步骤。如果schem_字段的顺序发生更改或未按排序顺序进行,则上述处理。是的,在重复中,它类似于自动排序或其他操作,我知道哪个scheme_字段[1],scheme_字段[2]。。。etc值为。您是否尝试过上述解决方案?如果这有帮助,那么see可能听起来很愚蠢,但是://传递xm1和xml2的xml字符串是这样的吗。。。。??因为我尝试了'def xml1=${create/request}',我在我的“try”中使用了它,但这不起作用。。。
<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>
//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