SoapUI比较两个XML响应非常慢

时间:2019-01-22 12:45:51

标签: xml groovy soapui ready-api

在我的测试案例中,我有两个测试步骤来生成XML响应。 XML结构彼此稍有不同,但是数据相同并且顺序相同。

我创建了一个Groovy脚本测试步骤,该步骤将从两个XML中读取数据迭代并断言它们相等。这些XML响应中的行数可以超过500行。

测试用例循环349次。

当我运行测试用例时,它滞后于第一个循环的groovy脚本断言-完成时间超过5分钟。我正在尝试找出一种改进当前脚本的方法,或者是一种比较两个XML响应的更好方法。

JDBC响应:

<Results>
   <ResultSet fetchSize="128">
      <Row rowNumber="1">
         <id>1540107</id>
         <name>10C/Ar1</name>
         <code>10C/Ar1</code>
         <subjectId>349176</subjectId>
      </Row>
      <Row rowNumber="2">
         <id>1540108</id>
         <name>11A/Ar1</name>
         <code>11A/Ar1</code>
         <subjectId>349177</subjectId>
      </Row>
      ...

REST响应:

<Response>
   <e>
      <id>1540107</id>
      <name>10C/Ar1</name>
      <code>10C/Ar1</code>
      <subjectId>349176</subjectId>
   </e>
   <e>
      <id>1540108</id>
      <name>11A/Ar1</name>
      <code>11A/Ar1</code>
      <subjectId>349177</subjectId>
   </e>
   ...

Groovy脚本:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);

//API Response
def HolderA = groovyUtils.getXmlHolder(context.expand('${01_Test_Step_05#ResponseAsXml}'))
def CountA = HolderA.getNodeValues("//e").size();
log.info CountA

//Database Query Response
def HolderB = groovyUtils.getXmlHolder(context.expand('${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]}'))
def CountB = HolderB.getNodeValues("//Row").size();
log.info CountB

//Asser Response Sizes
assert CountA == CountB : 'Response Counts Dont Equal'

def i = 1

while(i < (CountA + 1)) {
    //API Response Elements
    def id_A = context.expand( '${01_Test_Step_05#ResponseAsXml#//e[' + i + ']/id}' )
    def name_A = context.expand( '${01_Test_Step_05[GET]#ResponseAsXml#//e[' + i + ']/name}' )
    def code_A = context.expand( '${01_Test_Step_05[GET]#ResponseAsXml#//e[' + i + ']/code}' )
    def subjectId_A = context.expand( '${01_Test_Step_05[GET]#ResponseAsXml#//e[' + i + ']/subjectId}' )

    //Database Query Response Elements
    def id_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/id}' )
    def name_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/name}' )
    def code_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/code}' )
    def subjectId_B = context.expand( '${01_Test_Step_04#ResponseAsXml#//Results[1]/ResultSet[1]/Row[' + i + ']/subjectId}' )

    //Assert API Response Elements & Database Query Response Elements
    assert id_A == id_B : 'Mismatching IDs'
    assert name_A == name_B : 'Mismatching Names'
    assert code_A == code_B : 'Mismatching Codes'
    assert subjectId_A == subjectId_B : 'Mismatching Subject IDs'

    i++
}

2 个答案:

答案 0 :(得分:1)

有一个简单的方法可以实现,但是这种方法不会突出显示2个XML之间不匹配的内容。它肯定会告诉您不匹配的内容

   <ResultSet fetchSize="128">
      <Row rowNumber="1">
         <id>1540107</id>
         <name>10C/Ar1</name>
         <code>10C/Ar1</code>
         <subjectId>349176</subjectId>
      </Row>
      <Row rowNumber="2">
         <id>1540108</id>
         <name>11A/Ar1</name>
         <code>11A/Ar1</code>
         <subjectId>349177</subjectId>
      </Row>

        </ResultSet>
            </Results>
      '''

def xml2='''<Response>
   <e>
      <id>1540107</id>
      <name>10C/Ar1</name>
      <code>10C/Ar1</code>
      <subjectId>349176</subjectId>
   </e>
   <e>
      <id>1540108</id>
      <name>11A/Ar1</name>
      <code>11A/Ar1</code>
      <subjectId>349177</subjectId>
   </e>
   </Response>'''

def groovyUtils=new com.eviware.soapui.support.GroovyUtils(context)
def x1=   groovyUtils.getXmlHolder(xml1)
def x2=   groovyUtils.getXmlHolder(xml2)

def a1=x1.getNodeValues("//*:Row/*")
def a2=x2.getNodeValues("//*:e/*")

if(a1.toString()==a2.toString())
{
    log.info "Values matched in both XML for values"
}
else
{
    log.error "Values did not matched in both XML for values"
}


尽管很难对失败进行调试,但这是一种比较XML上所有值的有效方法。您甚至可以在各个节点级别进行比较。

XMLParser 相比,它更易于理解 enter image description here

答案 1 :(得分:0)

我相信您的很多情况。扩展是昂贵的部分。

我将使用XmlSlurper,然后简单地循环遍历行。

我假设这些行以相同的方式排序。

您将需要调整第3行和第4行以满足您的需要,以正确获取XML。为了进行测试,我只添加了两个小的Groovy脚本,它们返回了测试所需的XML。

def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context);

def request1 = testRunner.testCase.getTestStepByName("Xml1").getPropertyValue("result")
def request2 = testRunner.testCase.getTestStepByName("Xml2").getPropertyValue("result")

def slurper = new XmlSlurper()
def req1 = slurper.parseText(request1)
def req2 = slurper.parseText(request2)

def size1 = req1.ResultSet.Row.size()
def size2 = req2.e.Row.size()
assert size1 == size2 : 'Response Counts Dont Equal'

for (def x=0 ; x<size1 ; x++) {
    assert req1.ResultSet.Row[x].id == req2.e.Row[x].id : 'Mismatching IDs in row ' + x + " values " +  req1.ResultSet.Row[x].id + " / " + req2.e.Row[x].id
    assert req1.ResultSet.Row[x].name == req2.e.Row[x].name : 'Mismatching Names in row ' + x + " values " +  req1.ResultSet.Row[x].name + " / " + req2.e.Row[x].name
    assert req1.ResultSet.Row[x].code == req2.e.Row[x].code : 'Mismatching Codes in row ' + x + " values " +  req1.ResultSet.Row[x].code + " / " + req2.e.Row[x].code
    assert req1.ResultSet.Row[x].subjectId == req2.e.Row[x].subjectId : 'Mismatching SubjectIds in row ' + x + " values " +  req1.ResultSet.Row[x].subjectId + " / " + req2.e.Row[x].subjectId
}