0

我正在使用带有 XMLSlurper 的 groovy 来验证我在 soap ui pro 中的 Web 服务响应。

我有以下有效的代码(expectedResponse 是存储预期错误代码的 var,例如 E0023)...

if(expectedResponse2 in slurper.Body.createShipmentResponse.integrationFooter.errors.error.errorCode.collect{it.text()})
{
        result = "pass" 
}

但我想用对我可以从 SoapUI Pro 数据源提供的变量的引用替换“integrationFooter.errors.error.errorCode”,因为我并不总是在同一个响应元素上进行验证。即,如果我希望测试通过,我可能想检查状态元素是否填充了“已分配”。如果我希望请求失败,我想验证 errorCode 字段是否填充了正确的 errorCode,例如“E0023”。

如果我在我的 groovyscript 中有一个名为 testElement 的变量,并且我为它分配了元素的路径,例如 integrationFooter.errors.error.errorCode 我如何在我的 XMLSlurper 语句中引用该变量?

我尝试了下面的代码,但它没有工作..

if(expectedResponse2 in slurper.Body.createShipmentResponse."${testElement}".collect{it.text()})
4

1 回答 1

1

您需要自己拆分字符串并依次处理每个属性...

尝试:

def root = slurper.Body.createShipmentResponse
if(expectedResponse2 in testElement.tokenize( '.' ).inject( root ) { v, p ->
                            v?."$p"
                        }?.collect{ it.text() } ) {
    result = "pass" 
}

请参阅使用 [] 在 groovy 中访问对象属性

循环遍历列表[ 'integrationFooter', 'errors', 'error', 'errorCode' ],从 . 开始slurper.Body.createShipmentResponse。所以第一次,注入返回slurper.Body.createShipmentResponse.integrationFooter。然后它调用errors这个对象,依此类推,直到它得到你可以调用的最终结果collect

操作员只是意味着如果?.它达到空值(并返回空值)它将继续运行

注入说明:

给定这样的对象:

def obj = [ prop1:[ prop2:[ prop3: 'tim' ] ] ]

我们可以调用:

assert obj.prop1.prop2.prop3 == 'tim'

但是,如果我们被赋予属性名称以读取为字符串:

def props = 'prop1.prop2.prop3'

那么这将不起作用(因为没有 key 'prop1.prop2.prop3'

assert obj."$props" == 'tim'  // FAILS!

但是我们可以props在句号上拆分以获取属性列表:

def pList = props.tokenize( '.' )
assert pList == [ 'prop1', 'prop2', 'prop3' ]

然后,我们可以处理这个列表,从obj

def result = pList.inject( obj ) { currentObject, property ->
    // Return the property from the currentObject (or null if currentObject is null)
    currentObject?."$property"
}

因此,对于 的每个元素pList,我们执行以下操作:

Step1:
    currentObject == obj
    property   == 'prop1'
    returns obj.prop1 -- [ prop2:[ prop3: 'tim' ] ]

Step2:
    currentObject == [ prop2:[ prop3: 'tim' ] ]
    property   == 'prop2'
    returns currentObj.prop2 -- [ prop3: 'tim' ]

Step3 (final step as pList is at an end now):
    currentObject == [ prop3: 'tim' ]
    property   == 'prop3'
    returns currentObj.prop3 -- 'tim'

所以最终的结果是'tim'

希望这能解释它:-)

于 2014-01-14T15:05:57.137 回答