JMeter BeanShell PostProcessor 尝试将 String 视为 byte[]

JMeter BeanShell PostProcessor Attempts to treat a String as byte[]

我有一个 BeanShell PostProcessor 开头为:

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 

但是,如果我删除 String 声明,我不会收到警告(因此使用它来解决)......即对类型不明确):

    data = result.getResponseDataAsString();

如果我在此行之前打印 result.getResponseDataAsString().getClass().getName(),我会得到 java.lang.String

BeanShell 在 JMeter 中的使用相当陌生,但非常确信那一行就是问题所在。

同时,如果我在 String data = ... 赋值之前有 log.info 语句,它们将不会在第二次循环迭代时打印——这让我质疑该评估。

我如何理解/更正尝试的 byte[] 分配?

供参考:这是我的测试计划:

基本上,每个采样器使用 result.getResponseDataAsString() 获取响应主体,对 "normalize" 进行一些操作,然后通过 vars.put() 设置一个值。 BeanShell Assertion 使用 vars.get() 检索两个值,将它们与相应的集合 FailureMessageFailure 进行比较。

注意:两个 PostProcessor 都有同样的问题。

注意 2:String data = new String( result.getResponseData() ); 同样有问题(即同样的错误)...并不是说我 ever 提倡从byte[] 没有明确说明编码/字符集。

我创建了一个小 .jmx 并成功重现了问题。

我追踪到 JMeter 代码中的特定行(JMeter 3.0,org.apache.jmeter.extractor.BeanShellPostProcessor:63

bshInterpreter.set("data", prev.getResponseData());//$NON-NLS-1$

这让我失望了...我在上面的 post-processor.

中有一个名为 data 的变量

再次查看@JMeter UI 并且......果然,data 是一个预定义的脚本变量,(按照上面的行)输入为 byte[].

我假设当我的 var 没有用 String 声明时,BeanShell 管理了 byte[] <--> String 转换。使用严格的 String 声明,造成了类型混淆。

通过将我的脚本 var 重命名为:

解决了
String localResponseData = result.getResponseDataAsString();

经验教训:不要将 Bean Shell 变量命名为 data(或任何其他预定义的变量)!