如何使用groovy从响应中保存id?

时间:2016-03-01 18:08:17

标签: groovy soapui

在soapui中我的项目是:

Project
   |__Datasource
   |__request
   |__groovy_code
   |__DatasourceLoop
  • 我的数据源包含100行,每行是一个具有不同参数的请求。
  • 我的groovy_code会保存请求响应中的ID。

当我运行我的项目时,它会执行100个请求而不会出错。 groovy_code只保存第一个id。

我想要的是为每个请求保存id,所以在项目级别的不同变量中有100个ID

这是我的groovy_code:

import groovy.json.JsonSlurper
def response = context.expand( '${login#Response#declare namespace ns1=\'https://elsian/ns/20110518\'; //ns1:login_resp[1]/ns1:item[1]/ns1:response[1]}' )
def slurper = new JsonSlurper()
def result = slurper.parseText(response)
log.info result.data.id
testRunner.testCase.testSuite.project.setPropertyValue("token_id", result.data.id)

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

我从不使用SOAPUI PRO,但我无法访问datasource testStep甚至datasource loop

然而,基于您展示的项目结构,我认为每次datasource loopdatasource中创建一个元素时,它会将流发送到请求步骤,因此每次迭代都会执行请求和常规步骤;由于这个原因,我认为问题在于每次使用新值时,你的groovy代码都会覆盖相同的属性。

然后要解决此问题,您可以尝试在属性名称中添加一些变量后缀,以避免每次属性值都重写。例如,您可以将token_id字符串添加到计数器,某些uuid,当前ms等

例如,您可以使用计数器作为后缀。要保留计数器值,您需要将其保存在context变量中,这样在当前执行中的测试之间共享此属性:

import groovy.json.JsonSlurper

// create a suffix function to generate
// the suffixs for your property names based on a count
def getSuffixNameProperty = {
    // check if already exists 
    if(context['count']){
        // if exists simply add 1
        context['count']++
    }else{
        // if not exists initialize the counter
        context['count'] = 1
    }
    return context['count']
}

def propertyName = "token_id" + getSuffixNameProperty();

def response = context.expand( '${login#Response#declare namespace ns1=\'https://elsian/ns/20110518\'; //ns1:login_resp[1]/ns1:item[1]/ns1:response[1]}' )
def slurper = new JsonSlurper()
def result = slurper.parseText(response)
testRunner.testCase.testSuite.project.setPropertyValue(propertyName, result.data.id)