如何在针对 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>
,不存在。
如果用户想对 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>
,不存在。