JMeter中JSR223采样器SampleResult函数异常问题咨询
解决JMeter JSR223采样器(Java)中SampleStart调用两次的错误
嘿,这个问题我前不久帮同事排查过,太熟悉了!咱们一步步来解决:
问题根源
JMeter的JSR223采样器默认会自动帮你调用SampleResult.sampleStart()和SampleResult.sampleEnd()——脚本执行前自动启动计时,脚本结束后自动停止。如果你在自己的代码里又手动调用了这两个方法,就会触发“sampleStart called twice”的错误,相当于重复启动了采样计时。
针对性解决方案
根据你的需求,分两种情况处理:
情况1:不需要手动控制采样计时
直接删除脚本中所有手动调用的SampleResult.sampleStart()和SampleResult.sampleEnd()代码,让JMeter自动处理采样的开始和结束就好。这样既不会报错,也能正常生成采样结果。
情况2:必须手动控制采样时机(比如只计时某段核心代码)
如果你的脚本里需要只对某部分逻辑计时(比如初始化driver之后的业务操作),那得先告诉JMeter不要自动管理采样结果,再手动控制:
// 第一步:禁用JMeter自动的采样管理 SampleResult.setIgnore(true); // 第二步:重置并手动启动采样计时 SampleResult.reset(); SampleResult.sampleStart(); // 你的核心业务代码(比如driver操作页面) // ... // 第三步:停止计时并标记采样状态 SampleResult.sampleEnd(); SampleResult.setSuccessful(true); // 如果执行出错就设为false
额外提醒:脚本里的静态变量坑
看你的代码里用了public static WebDriver driver这种静态变量,在JMeter多线程压测时,静态变量会被所有线程共享,很容易出现多个线程抢用同一个driver的混乱情况。建议改用JMeter的线程局部变量vars来存储:
// 从线程变量里取driver,不存在就初始化 WebDriver driver = (WebDriver) vars.getObject("driver"); if (driver == null) { DesiredCapabilities desCapabilities = DesiredCapabilities.chrome(); driver = new ChromeDriver(desCapabilities); vars.putObject("driver", driver); // 存到线程变量里,仅当前线程可见 }
这样既能解决当前的采样错误,也能避免后续的线程安全问题~
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

