JMeter中如何使用vars.put传递数组对象?脚本问题求助
在JMeter中传递数组/集合对象的解决方案
问题背景
你的场景是:父文件夹C:\Downloads\RANDOMDICOMIMAGES\下有SMALL、MEDIUM、LARGE三个主文件夹,每个主文件夹下有若干子文件夹,子文件夹里是单张或多张图片。目标是随机选一个主文件夹,再随机选其子文件夹,统计图片数量并获取所有图片的完整路径。但用Groovy写JSR223前置处理器时,vars.put()只能存String类型,没法直接传递存储路径的ArrayList,报错提示类型不兼容。
两种可行解决方法
方法1:用vars.putObject()存储对象
JMeter的vars对象自带putObject()方法,专门用来存储非String类型的Java对象,ArrayList、HashMap这类集合都能直接存。之后在其他JSR223元件里,用vars.getObject()就能取回原对象直接使用。
示例代码:
// 假设已经获取到图片路径的ArrayList def imagePaths = new ArrayList<String>() // 这里写填充路径的业务逻辑... // 将数组存储到JMeter变量 vars.putObject("IMAGE_PATHS", imagePaths) // 在其他JSR223元件中取回使用 def retrievedPaths = vars.getObject("IMAGE_PATHS") retrievedPaths.each { path -> log.info("图片路径:${path}") }
方法2:转成字符串存储,用时拆分还原
如果需要兼容不支持getObject()的元件(比如部分非Groovy脚本元件),可以把ArrayList转成用特定分隔符分隔的字符串,存到变量后,后续通过拆分字符串还原数组。注意选的分隔符别在图片路径中出现,比如分号;或竖线|。
示例代码:
// 假设已经获取到图片路径的ArrayList def imagePaths = new ArrayList<String>() // 填充路径逻辑... // 转成分号分隔的字符串 def pathsStr = imagePaths.join(";") vars.put("IMAGE_PATHS_STR", pathsStr) // 在其他元件中还原数组 def pathsStr = vars.get("IMAGE_PATHS_STR") def retrievedPaths = pathsStr.split(";") as ArrayList retrievedPaths.each { path -> log.info("图片路径:${path}") }
适配你业务场景的完整脚本
以下是适配需求的完整Groovy脚本(可直接放到JSR223前置处理器中):
// 父文件夹路径 def parentDir = new File("C:\\Downloads\\RANDOMDICOMIMAGES\\") // 筛选存在的主文件夹 def mainFolders = ["SMALL", "MEDIUM", "LARGE"] .collect { new File(parentDir, it) } .findAll { it.exists() && it.isDirectory() } // 随机选取一个主文件夹 def randomMainFolder = mainFolders.get(new Random().nextInt(mainFolders.size())) // 获取主文件夹下的所有子文件夹 def subFolders = randomMainFolder.listFiles()?.findAll { it.isDirectory() } ?: [] // 随机选取一个子文件夹 def randomSubFolder = subFolders.get(new Random().nextInt(subFolders.size())) // 获取子文件夹内的所有图片(可根据实际扩展名调整,比如.dcm/.jpg) def imageFiles = randomSubFolder.listFiles()?.findAll { it.isFile() && (it.name.endsWith(".dcm") || it.name.endsWith(".jpg")) } ?: [] // 统计图片数量并存入变量 vars.put("IMAGE_COUNT", imageFiles.size().toString()) // 方法1:存储路径数组对象 def imagePaths = imageFiles.collect { it.getAbsolutePath() } vars.putObject("IMAGE_PATHS", imagePaths) // 可选方法2:存储为分隔字符串 vars.put("IMAGE_PATHS_STR", imagePaths.join(";"))
内容的提问来源于stack exchange,提问作者Jyoti Prakash Mallick
相关产品推荐
相关产品推荐

