如果用户想要对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中),无论它们是否被返回?
答案 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>
,不存在。