XPath 结果 returns 一个数组
XPath result returns an array
我最近升级到 SoapUI Pro (ReadyAPI),但遇到了以下问题。我有一个像这样的 XPath 断言:
declare namespace ns2='http://some.schema.tld/foo/bar/1.0';//ns2:GenerateOrResetPasswordFault//faultCode
它与我在 faultCode
元素中获得的特定值相匹配。然而,我在同一个父级中得到了其中两个,所以响应包含类似
的内容
//..
<GenerateOrResetPasswordFault>
<faultCode>123</faultCode>
<faultCode>456</faultCode>
</GenerateOrResetPasswordFault>
//...
我之前有两个断言,一个与 123
匹配,另一个相同的 XPath 与 456
匹配并且它有效。现在切换后断言失败,因为 XPath 实际上 returns [123,456]
作为结果。
请问最好的处理方法是什么?
这是实现相同目的的脚本断言。这样,您也不需要有多个 xpath 断言。
脚本断言:关注行内评论
//Check if the response is ok
assert context.response, 'Response is empty or null'
//Define your expected fault codes
def expectedCodes = [123, 456]
def actualCodes = []
if (context.response.contains('faultCode')) {
//Get the actual fault codes from xml response by parse and find
actualCodes = new XmlSlurper().parseText(context.response).'**'.findAll {it.name() == 'faultCode' }*.text() as Integer[]
log.info "Actual fault codes are : ${actualCodes}"
//Check both expected and actual are matching
assert expectedCodes.sort() == actualCodes.sort()
} else {
throw new Error('Response does not contain faultCode elements')
}
您可以快速在线 demo 尝试给定的 xml 数据。
我最近升级到 SoapUI Pro (ReadyAPI),但遇到了以下问题。我有一个像这样的 XPath 断言:
declare namespace ns2='http://some.schema.tld/foo/bar/1.0';//ns2:GenerateOrResetPasswordFault//faultCode
它与我在 faultCode
元素中获得的特定值相匹配。然而,我在同一个父级中得到了其中两个,所以响应包含类似
//..
<GenerateOrResetPasswordFault>
<faultCode>123</faultCode>
<faultCode>456</faultCode>
</GenerateOrResetPasswordFault>
//...
我之前有两个断言,一个与 123
匹配,另一个相同的 XPath 与 456
匹配并且它有效。现在切换后断言失败,因为 XPath 实际上 returns [123,456]
作为结果。
请问最好的处理方法是什么?
这是实现相同目的的脚本断言。这样,您也不需要有多个 xpath 断言。
脚本断言:关注行内评论
//Check if the response is ok
assert context.response, 'Response is empty or null'
//Define your expected fault codes
def expectedCodes = [123, 456]
def actualCodes = []
if (context.response.contains('faultCode')) {
//Get the actual fault codes from xml response by parse and find
actualCodes = new XmlSlurper().parseText(context.response).'**'.findAll {it.name() == 'faultCode' }*.text() as Integer[]
log.info "Actual fault codes are : ${actualCodes}"
//Check both expected and actual are matching
assert expectedCodes.sort() == actualCodes.sort()
} else {
throw new Error('Response does not contain faultCode elements')
}
您可以快速在线 demo 尝试给定的 xml 数据。