【问题标题】:Set a JMter variable with an groovy collection (JSR223 PostProcessor)使用 groovy 集合设置 JMter 变量(JSR223 PostProcessor)
【发布时间】:2019-10-11 13:16:04
【问题描述】:

我正在尝试使用我在 JSR223 处理器 (Groovy) 中的列表中的值在 JMter 中设置一个变量。为此,我使用vars.putObject 方法,但是当我尝试在 ForEach 控制器中使用此变量时,循环不会执行。

我的后处理器有以下流程:

  • 获取由Regular Expression Extractor 生成的字符串列表
  • 为测试创建一个包含有效值的列表(过滤一些值)
  • 将结果添加到 JMter 变量 vars.putObject

导入 org.apache.jmeter.services.FileServer

int requestAssetsCount = vars.get("CatalogAssetIds_matchNr").toInteger()
int maxAssetsNumbers = vars.get("NumberAssets").toInteger()
List<String> validAssets = new ArrayList<String>()

def assetsBlackListCsv = FileServer.getFileServer().getBaseDir() + "\\\assets-blacklist.csv"
File assetsBlackListFile = new File(assetsBlackListCsv)
List<String> assetsBlackList = new ArrayList<String>()

log.info("Loading assets black list. File: ${assetsBlackListCsv}")
if (assetsBlackListFile.exists()) {
    assetsBlackListFile.eachLine { line ->
        assetsBlackList.add(line)
    }
}
else {
    log.info("Black list file doesn't exist. File: ${assetsBlackListCsv}")
}

log.info("Verifying valid assets")
for (def i = 1; i < requestAssetsCount; i++) {
    def assetId = vars.get("CatalogAssetIds_${i}_g1")
    if (!assetsBlackList.contains(assetId)) {
        validAssets.add(assetId)
    }
    else {  
        log.info("Found a blacklisted asset. Skipping it. Asset ID: ${assetId}")    
    }
    if (validAssets.size() >= maxAssetsNumbers) {
        break
    }
}

我试过了(就像普通的提取器一样):

log.info("Storing valid assets list")
vars.putObject("ValidCatalogAssetIds_matchNr",validAssets.size())
for(def i = 0; i < validAssets.size(); i++) {
    vars.putObject("ValidAssetIds_${i+1}_g",1)
    vars.putObject("ValidAssetIds_${i+1}_g0","\"id\":\"${validAssets[i]}\"")
    vars.putObject("ValidAssetIds_${i+1}_g1",validAssets[i])
}

我试过了(设置列表值):

log.info("Storing valid assets list")
vars.putObject("ValidAssetIds",validAssets)

【问题讨论】:

  • 您能否展示一下您是如何做到这一点的:when I try to use this variable in a Loop Controller the loop doesn't execute.
  • 在每个控制器(字段Input variable prefix)我输入ValidAssetIds。我在vars.putObject使用的名字

标签: groovy jmeter


【解决方案1】:

将字符串连接为"+ (i+1) + "

vars.putObject("ValidCatalogAssetIds_"+ (i+1) + "_g",1) 
vars.putObject("ValidAssetIds_"+ (i+1) + "_g0","\"id\":\"${validAssets[i]}\"")

vars.putObject("ValiAssetIds_"+ (i+1) + "_g1",validAssets[i])

不要在 JSR223 脚本中使用 ${} 语法,因为它会在脚本执行之前初始化值,而不是像预期的那样

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多