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();