如何使用 groovy 从响应中保存 id?
How to save id using groovy from response?
在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)
感谢您的帮助
我从不使用 SOAPUI PRO,我无法访问 datasource testStep
甚至 datasource loop
。
然而,根据您展示的项目结构,我想每次 datasource loop
在 datasource
中找到一个元素时,它会将流程发送到请求步骤,因此请求和 groovy每次迭代都会执行步骤;因此,我认为问题在于您的 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)
在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)
感谢您的帮助
我从不使用 SOAPUI PRO,我无法访问 datasource testStep
甚至 datasource loop
。
然而,根据您展示的项目结构,我想每次 datasource loop
在 datasource
中找到一个元素时,它会将流程发送到请求步骤,因此请求和 groovy每次迭代都会执行步骤;因此,我认为问题在于您的 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)