jmeter 创建100个现场组,每个线程组里面有1个http请求,http接口内容为读取CSV文件
思路:先读取csv文件,将数据放到list数组里;再创建线程组和接口并填写数据
import org.apache.jmeter.control.LoopController import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy import org.apache.jmeter.testelement.TestPlan import org.apache.jmeter.threads.ThreadGroup import org.apache.jorphan.collections.HashTree import org.apache.jmeter.save.SaveService import org.apache.jmeter.testelement.TestElement import java.io.FileOutputStream import java.nio.file.Files import java.nio.file.Paths import java.util.stream.Collectors def filePath = Paths.get("C:/Users/yxchun/Desktop/imedia/imedia.csv") List<String> csvLines = [] if (Files.exists(filePath)) { // 使用Java 8 Stream API读取 csvLines = Files.lines(filePath) .filter { line -> line.trim() && !line.trim().startsWith("#") } .map { line -> line.trim() } .collect(Collectors.toList()) log.info("使用NIO读取CSV文件,共 ${csvLines.size()} 行数据") } else { log.error("CSV文件不存在") } // 显示统计信息 log.info("数据统计:") log.info("总行数: ${csvLines.size()}") if (!csvLines.isEmpty()) { log.info("第一行: ${csvLines[0]}") log.info("最后一行: ${csvLines[-1]}") } try { log.info("开始创建符合规范的JMX文件...") log.info("使用: ${csvLines[0]}") // 初始化SaveService SaveService.loadProperties() // 创建测试计划 - 使用JMeter的标准方式 def testPlan = new TestPlan("标准测试计划") testPlan.setEnabled(true) testPlan.setProperty(TestElement.GUI_CLASS, "TestPlanGui") testPlan.setProperty(TestElement.TEST_CLASS, "TestPlan") def testPlanTree = new HashTree() testPlanTree.add(testPlan) def threadGroupsTree = new HashTree() // 创建3个线程组,如果创建100个,将3写成100 (1..3).each { i -> // 创建循环控制器 def loopController = new LoopController() loopController.setEnabled(true) loopController.setName("Loop Controller") loopController.setLoops(1) loopController.setContinueForever(false) loopController.setProperty(TestElement.GUI_CLASS, "LoopControlPanel") loopController.setProperty(TestElement.TEST_CLASS, "LoopController") // 创建线程组 def threadGroup = new ThreadGroup() threadGroup.setEnabled(true) threadGroup.setName("线程组-${i}") threadGroup.setNumThreads(1) threadGroup.setRampUp(1) threadGroup.setScheduler(false) threadGroup.setProperty(TestElement.GUI_CLASS, "ThreadGroupGui") threadGroup.setProperty(TestElement.TEST_CLASS, "ThreadGroup") threadGroup.setProperty("ThreadGroup.on_sample_error", "continue") threadGroup.setSamplerController(loopController) // 创建HTTP请求 def httpSampler = new HTTPSamplerProxy() httpSampler.setEnabled(true) httpSampler.setName("HTTP请求-${i}") httpSampler.setDomain("example.com") httpSampler.setPort(443) httpSampler.setProtocol("https") // 使用${csvLines[i]}拿到内容 httpSampler.setPath("${csvLines[i]}") httpSampler.setMethod("POST") httpSampler.setFollowRedirects(true) httpSampler.setUseKeepAlive(true) httpSampler.setProperty(TestElement.GUI_CLASS, "HttpTestSampleGui") httpSampler.setProperty(TestElement.TEST_CLASS, "HTTPSamplerProxy") // 构建正确的树结构 def loopTree = new HashTree() loopTree.add(httpSampler) def tgTree = new HashTree() tgTree.add(loopController, loopTree) threadGroupsTree.add(threadGroup, tgTree) log.info("创建线程组-${i}") } testPlanTree.add(threadGroupsTree) // 保存文件 def outputFile = new File("1_standard_test_plan.jmx") FileOutputStream fos = new FileOutputStream(outputFile) SaveService.saveTree(testPlanTree, fos) fos.close() def result = "✅ 标准JMX文件创建成功: ${outputFile.absolutePath}" log.info(result) SampleResult.responseData = result SampleResult.successful = true } catch (Exception e) { def error = "❌ 创建失败: ${e.message}" log.error(error, e) SampleResult.responseData = error SampleResult.successful = false }
浙公网安备 33010602011771号