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

How to save id using groovy from response?

在soapui我的项目是:

Project
   |__Datasource
   |__request
   |__groovy_code
   |__DatasourceLoop

当我 运行 我的项目时,它执行了 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 loopdatasource 中找到一个元素时,它会将流程发送到请求步骤,因此请求和 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)