SoapUI中的嵌套属性扩展

时间:2014-06-17 22:04:35

标签: xquery soapui

简短版本:我如何在SoapUI Pro 5中的XQuery中进行嵌套属性扩展,其中outer属性是对前一个测试步骤的ResponseAsXML的引用,而内部属性来自属性文件?

示例:

我的测试步骤如下:

  1. 调用AddCustomer,它还会添加一个电子邮件地址,并返回customerId。
  2. 使用属性转移将customerId存储在名为EmailProperties的属性文件中。
  3. 调用AddEmailToCustomer,向同一客户添加第二封电子邮件并返回新的emailId。
  4. 调用GetEmailsForCustomer,它会为客户返回两封电子邮件。
  5. 步骤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'...
    

    我怎样才能让它发挥作用?

2 个答案:

答案 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}}。

希望这有帮助,