首页 > 解决方案 > SoapUI:在 API 响应中查找属性值并将关联值设置为另一个属性

问题描述

我正在为具有奇怪模式的 API 制作自动化测试套件。在我的 API 响应中,我列出了人们可以订购的商品类型以及一些关于它们的信息,例如价格。每个项目都有一个 ID:

<xml> 
<ItemType ID="Type1">
<Price>5.00</Price>
</ItemType>

<ItemType ID="Type2">
<Price>10.00</Price>
</ItemType>
</xml>

稍后在 API 中有一个实际产品列表。每个都有一个 ItemID,这样您就可以了解它的成本,如下所示:

<Product>
<Name>Product1</Name>
<Description>some stuff</Description>
<ItemRefs>Type1</ItemRefs>
</Product>

我选择了一个产品并将其 ItemRefs 保存为一个属性,以便在下一个 API 中使用。但是,我还需要计算出我选择的产品的价格。我目前总是选择列表中的第一个产品,但这并不总是与第一种类型的项目相关。我还希望将来能够选择多种产品和项目类型进行测试,但我需要找到所有这些产品的价格。

我需要一种方法来在前面的列表中找到我的 ItemRefs 属性并将关联的价格设置为另一个属性。我假设我需要使用 groovy 脚本执行此操作,但我不知道如何操作。任何人都可以帮忙吗?

标签: xmlgroovysoapuiready-api

解决方案


所以我接受了一个名为 NameofTherequest 的请求,并假设您的 XML 被放置在响应中

所以首先我们在holder中得到响应,然后得到你想要的值

所以首先我们得到一个数组中的所有id,然后对应于每个id,我们得到价格并存储在hashmap中。然后无论我们需要什么,我们都可以从 hashmap 中取出

 def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)
 def holder = groovyUtils.getXmlHolder("NameofTherequest#Response")

  // Take out the values of ids and their corresponding price
   def Ids = holder.getNodeValues("//*:ItemType/@ID")
   log.info "The values of all Ids are  = " + Ids.toString()
   def Price = holder.getNodeValues("//*:ItemType/*:Price")
   log.info "The values of prices are  = " + Price.toString()


   // A better logic where we store each Price against its ID value in a      hashmap
    HashMap h=[:]
   for(def var in Ids)
   {
   def Price1 = holder.getNodeValue("//*:ItemType[@ID='${var}']/*:Price")
    h.put(var,Price1)   
    }

    log.info "The values of prices are in hashmap = " + h

  // Now suppose you want to know the price of say Type2
   def str="Type2" // You can get this from property value whose price you want to know

    log.info "The price of $str is " + h[str]

上面代码的输出是

在此处输入图像描述


推荐阅读