简短版本:我如何在SoapUI Pro 5中的XQuery中进行嵌套属性扩展,其中outer属性是对前一个测试步骤的ResponseAsXML的引用,而内部属性来自属性文件?
示例:
我的测试步骤如下:
步骤3和4的REST端点如下所示:
POST/GET http://myEndpoint.com/customers/{customerId}/emails
在尝试验证第4步时,我编写了一个XQuery,它循环响应(因为我们无法保证电子邮件在响应中的顺序),以查找在步骤3中添加的电子邮件。在我的XQuery中,如果我在命名空间中对customerId进行硬编码,就像这样工作正常:
for $email in //emails
where $email/id/text()='${AddEmailToCustomer#ResponseAsXml#declare namespace ns1='http://myEndpoint.com/customers/1234/emails'; //ns1:Response[1]/ns1:id[1]}'
但是如果我尝试使用属性文件中的customerId:
for $email in //emails
where $email/id/text()='${AddEmailToCustomer#ResponseAsXml#declare namespace ns1='http://myEndpoint.com/customers/${#EmailProperties#customerId}/emails'; //ns1:Response[1]/ns1:id[1]}'
我收到有关如何找不到预期子节点的错误:
...Exception:org.custommonkey.xmlunit.Diff[different] Expected presence of child nodes to be 'true' but was 'false'...
我怎样才能让它发挥作用?
答案 0 :(得分:0)
您可以将通配符用于命名空间,以大大简化您的XPath:
where $email/id/text()='${AddEmailToCustomer#ResponseAsXml#//*:Response[1]/*:id[1]}'
答案 1 :(得分:0)
由于@SiKing建议您可以使用通配符来命名空间来简化XPath,如果您不关心检查命名空间(这是最常见的行为),这就足够了。但是我认为您将命名空间放在属性中以检查可能的不同命名空间,因为您可以尝试声明您的XQuery Match断言,如下所示:
declare namespace ns1='http://myEndpoint.com/customers/${#EmailProperties#customerId}/emails';
<XQueryResult>
{
for $email in //ns1:emails
where $email/id/text()='${AddEmailToCustomer#Response#//ns1:Response[1]/ns1:id[1]}'
return $email
}
</XQueryResult>
请注意,如果EmailProperties
是属性testStep,那么您必须使用${EmailProperties#customerId}
而不是${#EmailProperties#customerId}
,在这种情况下,我更喜欢使用#Response
而不是{{} 1}}。
希望这有帮助,