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()
检索两个值,将它们与相应的集合 FailureMessage
和 Failure
进行比较。
注意:两个 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
(或任何其他预定义的变量)!
我有一个 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()
检索两个值,将它们与相应的集合 FailureMessage
和 Failure
进行比较。
注意:两个 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
(或任何其他预定义的变量)!