JMeter BeanShell后处理器尝试将字符串视为字节[]
我有一个JMeter BeanShell后处理器尝试将字符串视为字节[],jmeter,beanshell,Jmeter,Beanshell,我有一个BeanShell后处理器,它的开头是: result = ctx.getPreviousResult(); String data = result.getResponseDataAsString(); 在LoopController的第二个循环上,它将在日志中给出: ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: set Variable assignment: data: Can't
BeanShell
后处理器
,它的开头是:
result = ctx.getPreviousResult();
String data = result.getResponseDataAsString();
在LoopController
的第二个循环上,它将在日志中给出:
ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: set Variable assignment: data: Can't assign byte [] to java.lang.String
WARN - jmeter.extractor.BeanShellPostProcessor: Problem in BeanShell script org.apache.jorphan.util.JMeterException: Error invoking bsh method: set Variable assignment: data: Can't assign byte [] to java.lang.String
但是,如果我删除字符串
声明,我不会得到警告(因此使用它来解决问题)。。。i、 e.对类型不明确):
如果我在此行之前打印result.getResponseDataAsString().getClass().getName()
,我会得到java.lang.String
在JMeter中使用BeanShell相当新,但很有信心这一行就是问题所在
同时,如果在String data=…
赋值之前有log.info
语句,它们将不会在第二次循环迭代中打印,这使我对该评估产生疑问
我如何理解/更正尝试的字节[]
分配
供参考:以下是我的测试计划:
基本上,每个采样器都使用result.getResponseDataAsString()
来获取响应主体,执行一些操作来“规范化”它,然后通过vars.put()
设置一个值。BeanShell断言
使用vars.get()
检索这两个值,比较它们,并相应地设置FailureMessage
和Failure
注意:两个后处理器都有相同的问题
注2:stringdata=新字符串(result.getResponseData())代码>同样有问题(即相同的错误)。。。并不是说我会主张从字节[]
创建字符串,而不明确编码/字符集。我创建了一个小型.jmx
,并成功地重新创建了这个问题
我在JMeter代码(JMeter 3.0,org.apache.JMeter.extractor.BeanShellPostProcessor:63)中找到了一行特定的代码:
bshInterpreter.set("data", prev.getResponseData());//$NON-NLS-1$
这给了我提示…我在上面的后处理器中有一个名为data
的变量
再次查看@JMeter UI,果然,data
是一个预定义的脚本变量,按byte[]
键入(按上行)
我假设BeanShell管理了字节[]字符串
的强制转换,而我的var不是用字符串
声明的。使用严格的字符串
声明,会造成类型混淆
通过将我的脚本变量重命名为:
String localResponseData = result.getResponseDataAsString();
经验教训:不要将Bean Shell变量命名为data
(或任何其他预定义变量)!我尝试了您的代码,但没有得到任何错误。尽管您不需要ctx
来实现它,但您可以使用prev.getresponsedatastring()
直接。因此,要么您的响应是真正的二进制响应,要么……尝试以下操作:使用代码创建一个BeanShell采样器:SampleResult.setResponseData(“你好”);
并将您的后处理器放在该采样器下。它是否返回相同的错误?如果不是,它肯定意味着与您的特定数据有关。如果是,您需要查看您的环境…感谢关于prev
的提示。此外,我使用了您的BeanShell采样器想法来构建我在回答中提到的小型.JMX。您的指导非常有用我花了30分钟试图弄明白为什么我的JMeter后期处理任务不能使用数据变量名。当然,如果我们都注意UI上定义的变量名列表,就可以省去很多麻烦了:-\
String localResponseData = result.getResponseDataAsString();