在我的测试案例中,我有两个测试步骤来生成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++
}
答案 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上所有值的有效方法。您甚至可以在各个节点级别进行比较。
答案 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
}