You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMeter中Groovy脚本处理List类型自定义变量返回空值问题

JMeter多值列表匹配返回空值问题排查与解决

问题原因

你的代码中使用了every方法来判断匹配逻辑,这是导致多值列表返回空的核心原因:

  • studyNameNeedToExcludeFromDeletion.every { keywords -> studyName.contains(keywords) }这行代码要求当前name必须包含列表中的所有关键词才会被保留。
  • 当自定义变量是多值列表时,几乎没有name能同时命中所有关键词,因此最终筛选结果为空。
  • 而排除场景下用!studyName.contains(keywords)时,实际是排除掉包含所有关键词的条目,这类条目数量少,剩余条目多,所以看起来正常,但这并不是你需要的「匹配任意关键词」的逻辑。

解决方案

如果你需要筛选出包含列表中任意一个关键词的条目,只需把every替换为any即可。any方法的逻辑是:只要name包含列表中的任意一个关键词,就会被纳入筛选结果。

修正后的代码(保留原有流程)

import groovy.json.JsonSlurper;

def completeFetchedStudyNameFromResponse = []; 
1.upto(vars.get('allStudyNameFetched_matchNr') as int, {
  index ->
  completeFetchedStudyNameFromResponse.add(vars.get('allStudyNameFetched_' + index));
});

String tempToBeExcludedStudyName = vars.get('excludeStudyName');

def studyNameNeedToExcludeFromDeletion = new JsonSlurper().parseText(tempToBeExcludedStudyName);

// 把every替换为any
def filteredStudyName = completeFetchedStudyNameFromResponse.findAll {
  studyName ->
    studyNameNeedToExcludeFromDeletion.any {
      keywords ->
         studyName.contains(keywords);
    }
}

def bdConverter = new JsonSlurper();
def responseBDTemp = prev.getResponseDataAsString();
def responseBD = bdConverter.parseText(responseBDTemp);
def resultStudyUUIDCollector = [];

filteredStudyName.each { studyNameFew ->
  resultStudyUUIDCollector.add(responseBD.accounts.find { account -> account.name == studyNameFew }.uuid)  
}

vars.putObject("myList", resultStudyUUIDCollector); 

更简洁的优化版本(推荐)

直接解析响应JSON完成筛选,省去JSON Extractor提取name的步骤,减少中间环节:

import groovy.json.JsonSlurper

// 解析自定义变量的目标关键词列表
def targetKeywords = new JsonSlurper().parseText(vars.get('excludeStudyName'))

// 直接解析接口响应
def responseJson = new JsonSlurper().parseText(prev.getResponseDataAsString())

// 筛选name包含任意关键词的条目,并提取uuid
def resultUUIDs = responseJson.accounts.findAll { account ->
    targetKeywords.any { keyword -> account.name.contains(keyword) }
}.collect { it.uuid }

// 将结果存入JMeter变量
vars.putObject("myList", resultUUIDs)

补充说明

  • 如果你的需求确实是匹配所有关键词(极少场景会用到),那需要检查你的自定义变量和响应中的name是否真的存在同时包含所有关键词的条目,否则结果为空是正常的。
  • 优化版本的代码更高效,避免了多次解析和中间变量的维护,推荐使用。

内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:07:41