我如何根据我的偏好对SoapUI的响应中的项目进行排序

时间:2017-05-03 11:53:38

标签: rest api testing functional-programming soapui

enter image description here

我想根据逻辑“首先是数字,然后是大写字母然后是小写字母”对“名称”部分进行排序。我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

更多信息会很好。乍一看,看起来你正在寻找XQuery断言。这不会对响应进行排序或修改,但它会转换断言中的响应,使其与具有您控制的顺序的集合相匹配。

何时使用?如果您不确定实体的顺序,并且希望将这些动态排序的项目与固定集合匹配。

可在此处找到一个示例:http://readyapi.smartbear.com/structure/assertions/property/xpath/xquery/example

我将尝试编写一个示例项目,其中包含一些示例作为参考。

但有一件事:不要停留在SoapUI网站的示例中。你可以疯了。您可以使用XPath检索的所有内容都可以在XQuery中使用。

示例:假设有一个xml来自this source(这里有用的东西,请注意) - 示例下的XQuery

<?xml version="1.0"?>
<?xml-stylesheet href="catalog.xsl" type="text/xsl"?>
<!DOCTYPE catalog SYSTEM "catalog.dtd">
<catalog>
   <product description="Cardigan Sweater" product_image="cardigan.jpg">
      <catalog_item gender="Men's">
         <item_number>QWZ5671</item_number>
         <price>39.95</price>
         <size description="Medium">
             <color_swatch image="red_cardigan.jpg">Red</color_swatch>
             <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
         </size>
         <size description="Large">
             <color_swatch image="red_cardigan.jpg">Red</color_swatch>
             <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
         </size>
     </catalog_item>
     <catalog_item gender="Women's">
         <item_number>RRX9856</item_number>
         <price>42.50</price>
         <size description="Small">
             <color_swatch image="red_cardigan.jpg">Red</color_swatch>
             <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
             <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
         </size>
         <size description="Medium">
             <color_swatch image="red_cardigan.jpg">Red</color_swatch>
             <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
             <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
             <color_swatch image="black_cardigan.jpg">Black</color_swatch>
         </size>
         <size description="Large">
             <color_swatch image="navy_cardigan.jpg">Navy</color_swatch>
             <color_swatch image="black_cardigan.jpg">Black</color_swatch>
         </size>
         <size description="Extra Large">
             <color_swatch image="burgundy_cardigan.jpg">Burgundy</color_swatch>
             <color_swatch image="black_cardigan.jpg">Black</color_swatch>
         </size>
     </catalog_item>
 </product>
</catalog>

现在假设你不知道这些东西到达的顺序。您确实知道测试数据本身非常稳定。这可能意味着此查询检索的项目编号很可能是相同的。为了我们的缘故,假设你想要测试价格是预期的价格。

然后你有两个选择: 1.为您期望的每个项目创建单独的XPath 2.使用XQuery创建可验证的查询(您可以在断言下找到)

XQuery示例:

<results>
    {
        for $item in //catalog/product/catalog_item
        let $id := $item/item_number
        let $price := $item/price
        order by $id
        return
            <price itemId='{data($id)}'>{data($price)}</price>
    }
</results>

此查询的结果如下:

<results>
     <price itemId='QWZ5671'>39.95</price>
     <price itemId='RRX9856'>42.50</price>
 </results>

使用行for $item in //catalog/product/catalog_item,我告诉XQuery使用该地址迭代所有元素。变量 $item可以进一步使用。这看起来似乎没有用处,但在更复杂的情况下,模块化是你的朋友。接下来我定义了更多的变量。你不必,但我喜欢更冗长,而不是看不到我后来做了什么(我是一个功能测试员)。要分配变量,请使用语句let $id := $item/item_number。正如您所看到的,当我深入研究XML时,我重用了我迭代的父级。

执行某些功能时,我们需要使用“边界”{}来定义功能。注意:检索实际数据的函数是{data(variable with path or path here)}

从本质上讲,您甚至不需要包含项目ID。您可以在返回的输出中对值进行排序,而不将其包括在内。我个人喜欢将它们放在我的设置中以验证以后的差异。

首先是数字,然后是资本,然后是小额,我不知道你是否正在使用正确的工具来完成工作。我确信这是可能的。但是鉴于你可以相信SoapUI每次都以相同的方式对XQuery进行排序,因为它每次都会使用相同的XQuery引擎,我无法想象实际拥有数字然后是大数据,然后是大数据是很重要的。小帽子。目标是验证从响应中获取的一致排序集。

基本上,要校准断言,您将使用模拟提供预期输出的示例XML。然后,在断言配置屏幕中,您可以选择使用您设计的Xquery从响应xml获取预期输出。

如果真正重要的是按照你的描述排序,那么请详细说明。

XQuery的来源:

庞大,仍然不完整,但可能是您问题核心的解决方案:使用SoapUI原生的断言验证一致排序的响应。