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

How to Test for None Existing Data Elements in SoapUI's Response Against JDBC Request's

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

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

在这种情况下,数据库中的行没有 <ProdCat> (NULL) 的值。 SoapUI 无法在 JDBC 请求步骤中抑制此 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 步骤 returns 同一记录的值已更新 (<ProdCat>),则默认 Content Match <ProductCategory> 的断言会失败,即

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 响应中接受的模式中)的断言,而不管它们是否被返回?

由于实际的表达式节点不存在 (//.../Product[1]/ProductCategory[1]/text()),但预期的表达式 (${JDBC Request Product#ResponseAsXML#//Results[1]/Row[1]/ProdCat[1]}) returns 是一个空字符串(例如 <ProdCat/> -- this作为 JDBC 步骤输出),我们必须确保两个表达式的计算结果相同。为此,我们可以做到以下几点:

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

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

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