如何在SoapUI对JDBC请求的响应中测试无现有数据元素

时间:2015-01-30 21:35:29

标签: xml xpath jdbc soapui

如果用户想要对SoapUI中的JDBC步骤返回的结果集进行数据验证,但Soap Response不包含相应的数据元素,那么SoapUI不提供在Soap Response中为此类元素创建断言的默认方式,即假设JDBC步骤在执行SQL查询时返回以下内容:

<Results>
   <ResultSet fetchSize="10">
       <Row rowNumber="1">
           <ProdName>Prod Name</ProdName>
           <ProdId>#2332</ProdId>
           <ProdCat/>
       </Row>
   </ResultSet>
<Results>

在这种情况下,数据库中的行没有<ProdCat>NULL)的值。 SoapUI无法在JDBC Request步骤中抑制此XML元素(<ProdCat>)的生成。

如果是Soap Response,假设Web服务提供者生成以下内容(忽略名称空间以简化):

<soap:Envelope xmlns:soap="http://www.w3.org/2033/05/soap-envelope">
   <soap:Body>
       ...
       <Product>
           <ProductName>Prod Name</ProductName>
           <ProductId>#2332</ProductId>
       </Product>
   </soap:Body>
</soap:Envelope>

(请注意<Product>的所有子元素都是可选。)SoapUI显然会缺少数据元素<ProductCategory>。如果我们尝试为此数据元素创建一个断言,以防下一次JDBC步骤返回同一记录的值,该值已更新(<ProdCat>),Content Match的默认<ProductCategory>断言1}}会失败,即

XPath Expression (actual)
//.../Product[1]/ProductCategory[1]/text()

XPath Expected Result (expected)
${JDBC Request Product#ResponseAsXML#//Results[1]/Row[1]/ProdCat[1]}

执行此断言会出现以下错误:

[//.../Product[1]/ProductCategory[1]/text()]: Exception:Missing content for xpath [//.../Product[1]/ProductCategory[1]/text()] in Response

问题是,如何创建一个适用于所有元素的断言(在Soap响应中接受的Schema中),无论它们是否被返回?

1 个答案:

答案 0 :(得分:1)

由于实际的表达式节点不存在(//.../Product[1]/ProductCategory[1]/text()),但是期望的表达式(${JDBC Request Product#ResponseAsXML#//Results[1]/Row[1]/ProdCat[1]})返回一个空字符串(例如<ProdCat/> - 这是JDBC步骤输出) ,我们必须确保两个表达式都评估为相同的值。为此,我们可以执行以下操作:

concat(//.../Product[1]/ProductCategory[1]/text(), '')

${JDBC Request Product#ResponseAsXML#concat(//Results[1]/Row[1]/ProdCat[1], '')}

通过这样做,数据元素是否存在于Soap Response中和/或包含空字符串(数据库中的列可能包含空字符串而不仅仅是NULL),内容匹配断言在这种情况下总能奏效;即使记录更新为稍后包含<ProdCat>元素的实际值。如果<ProductCategory>的父元素,例如, <Product>,不存在。