将响应属性与Soapui和groovy的数据进行比较

时间:2014-07-09 00:45:32

标签: groovy soapui

我正在尝试将一组代码与我在Soapui中的响应中获得的代码进行比较。 我能够将一个数组添加到一个groovy脚本中,其中包含我在excel中的条目,所以基本上就像

def MAX_SIZE = 31
def myArray = new Object[MAX_SIZE]

// Code array
myArray[0] = "EU1234qSP"
myArray[1] = "ES1234qSPwe"
myArray[2] = "EF1234qSPde"
myArray[3] = "EW1234qSPpt"

然后,我从Web服务响应中扩展了属性Xpath,该响应返回数据库中的代码。 e.g:

def OfferCode1 = context.expand( '${QuerySubsPlanList - Request 1#Response#declare namespace ns=\'http://com.ztesoft.zsmart/xsd\'; //ns:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto[1]/SubsPlanCode[1]}' )
def OfferCode2 = context.expand( '${QuerySubsPlanList - Request 1#Response#declare namespace ns=\'http://com.ztesoft.zsmart/xsd\'; //ns:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto[2]/SubsPlanCode[1]}' )
def OfferCode3 = context.expand( '${QuerySubsPlanList - Request 1#Response#declare namespace ns=\'http://com.ztesoft.zsmart/xsd\'; //ns:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto[3]/SubsPlanCode[1]}' )
def OfferCode4 = context.expand( '${QuerySubsPlanList - Request 1#Response#declare namespace ns=\'http://com.ztesoft.zsmart/xsd\'; //ns:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto[4]/SubsPlanCode[1]}' )

比较它们并在日志中打印出匹配或失败的最佳方法是什么? 一个循环?也许像是

for (item in myArray ) {



    for (offerCode in offerCodesArray) {}


    if (item == offerCode) {
        store the finding
        go to next item in myArray
    }
    }
}


}

如何将扩展属性输入到数组中呢?从来没有这样做过 还是初学者,有人可以帮忙吗?

干杯 阿迪

更新:数据库中的更改比我想象的更频繁,所以我确实需要节点计数才能工作。 响应的结构如下

xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns:QuerySubsPlanListResponse xmlns:ns="http://com.ztesoft.zsmart/xsd">
         <SubsPlanDtoList>
            <SubsPlanDto>
               <SubsPlanCode>TEST1</SubsPlanCode>
               <ServType>M</ServType>
               <CustTypeList>B2B</CustTypeList>
               <Price>0.0000</Price>
            </SubsPlanDto>
            <SubsPlanDto>
               <SubsPlanCode>TEST2 </SubsPlanCode>
               <ServType>M</ServType>
               <CustTypeList>B2C|B2B</CustTypeList>
               <Price>0.0000</Price>
            </SubsPlanDto> 

谁能告诉我如何计算节点?上面的最后一个建议没有用。感谢

1 个答案:

答案 0 :(得分:1)

您可以使用groovy-jdk中的java.util.Collection而不是数组,然后您可以使用intersectplus(用于联合)等来处理此集合比赛并失败。我给你一个源样本:

def myCollection = ["1","2","3","4"]
def myCollection2 = ["1","a","3","d"]
def matches = myCollection.intersect(myCollection2)
def fails = myCollection.plus(myCollection2)
fails.removeAll(matches)

log.info matches // --> [1,3] matches
log.info fails // --> [2,4,a,d] not match

使用此代码,您可以打印匹配并失败,并且您还可以按照自己的喜好收集匹配。

关于在集合中输入扩展属性:如果您想在答案中循环思考<SubsPlanDto>,您可以使用XPath计算此元素的实例数,然后再添加一个循环集合的元素(请注意,您可以使用通配符*作为命名空间来保持XPath的简化),请参阅下面的代码:

def numElements = context.expand( '${QuerySubsPlanList - Request 1#Response#//count(*:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto)}')
def collection2 = [];
for ( i in 1..numElements.toInteger()) {
    collection2.add(context.expand( '${QuerySubsPlanList - Request 1#Response#//*:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto['+ i + ']/SubsPlanCode[1]}'))
}

最后,您可以一起完成所有工作:

// you collection definition...
def collection = ["1","2","3","4"]

// get num repetitions of <SubsPlanDto> with Xpath count
def numElements = context.expand( '${QuerySubsPlanList - Request 1#Response#//count(*:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto)}')
def collection2 = [];
// iterate and add the values to a collection
for ( i in 1..numElements.toInteger()) {
    collection2.add(context.expand( '${QuerySubsPlanList - Request 1#Response#//*:QuerySubsPlanListResponse[1]/SubsPlanDtoList[1]/SubsPlanDto['+ i + ']/SubsPlanCode[1]}'))
}

// get the matches and differences
def matches = collection.intersect(collection2)
def fails = collection.plus(collection2)
fails.removeAll(matches)

log.info matches
log.info fails

希望这有帮助,