【问题标题】:JMeter Beanshell Integer ErrorJMeter Beanshell 整数错误
【发布时间】:2017-02-11 10:23:58
【问题描述】:

JMeter Beanshell Sampler/Pre/Post 处理器中的 Integer 存在问题。我有一些值数组,我想使用这个数组的每个值来设置 JMeterProperty 以供下次使用。

GOAL> 有来自查询的 N 行。例如 UPSTREAM 列有差异值,我需要保存它们以备下次使用。因为我将使用它们来调用 CMD.exe 作为“OS Processes Sampler”的参数。

So, if UPSTREAM_1=XXX, UPSTREAM_2=AAA, 
CMD.EXE will looks like: CMD.EXE -upstream_1 -upstream_2, etc.

从 SQL 我得到了值数组

COUNT=31
UPSTREAM_#=31
UPSTREAM_1=XXX
UPSTREAM_2=AAA
....

在我设置的后处理器中:

${__setProperty(COUNT, ${COUNT_1})};

我正在尝试这个脚本:

import java.util.*;
import java.text.*; 
import java.io.*;

int max = Integer.parseInt(vars.get(${COUNT_1})); //--COUNT=31, Integer doesnt work
int n = vars.get(${COUNT_1}); //--COUNT=31, this also doesnt work

for (int i=1;i<=n;i++)
{
   ${__setProperty(UPSTREAM_i, ${UPSTREAM_i})};
}

但是 JMeter 日志说它不知道“INT”

2016/10/03 14:52:13 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval   Sourced file: inline evaluation of: `` import java.util.*; import java.text.*;  import java.io.*;  int max = Integer.p . . . '' : Typed variable declaration : Error in method invocation: Method get( int ) not found in class'org.apache.jmeter.threads.JMeterVariables' 
2016/10/03 14:52:13 WARN  - jmeter.protocol.java.sampler.BeanShellSampler: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: `` import java.util.*; import java.text.*;  import java.io.*;  int max = Integer.p . . . '' : Typed variable declaration : Error in method invocation: Method get( int ) not found in class'org.apache.jmeter.threads.JMeterVariables' 

有人可以帮助我吗?也许我想念一些库或其他东西。我有 JRE/JDK。


UPDATE_1

用户变量全部:

COUNT   ${__property(COUNT)}    Count of Rows from SQL Query

测试计划:

后处理器日志:

SamplerProperties:
variableNames=DATE,DOWNSTREAM,UPSTREAM,COUNT,etc.

JMeterVariables:
COUNT=31
COUNT_#=31
COUNT_1=31
COUNT_2=31
.....
DATE_#=31
DATE_1=04.10.2016
DATE_2=04.10.2016
.....
DOWNSTREAM_#=31
DOWNSTREAM_1=DDD11
DOWNSTREAM_2=DDD11
.....
UPSTREAM_#=31
UPSTREAM_1=XXX
UPSTREAM_2=AAA
....
JMeterProperties:
COUNT= 31
DATE= 04.10.2016
DOWNSTREAM= DDD11
TEST= 1

调试循环日志:

SamplerProperties:
BeanShellSampler.query=import java.util.*;
 import java.text.*; 
 import java.io.*;
 int n = Integer.parseInt(vars.get("COUNT")); 
 for (int i=1;i<=n;i++)
 {
      props.setProperty("UPSTREAM_"+i, vars.get("UPSTREAM_i"));
 }
    JMeterVariables:
    COUNT=31
    COUNT_#=31
    COUNT_1=31
    COUNT_2=31
    .....
    DATE_#=31
    DATE_1=04.10.2016
    DATE_2=04.10.2016
    .....
    DOWNSTREAM_#=31
    DOWNSTREAM_1=DDD11
    DOWNSTREAM_2=DDD11
    .....
    UPSTREAM_#=31
    UPSTREAM_1=XXX
    UPSTREAM_2=AAA
    ....
    JMeterProperties:
    COUNT= 31
    DATE= 04.10.2016
    DOWNSTREAM= DDD11
    TEST= 1

现在在 Jmeter 日志中:

2016/10/03 17:12:24 ERROR - jmeter.util.BeanShellInterpreter: Error invoking bsh method: eval   Sourced file: inline evaluation of: ``import java.util.*;  import java.text.*;   import java.io.*;  int n = Integer.pa . . . '' : Method Invocation props.setProperty 
2016/10/03 17:12:24 WARN  - jmeter.protocol.java.sampler.BeanShellSampler: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import java.util.*;  import java.text.*;   import java.io.*;  int n = Integer.pa . . . '' : Method Invocation props.setProperty 

UPDATE_2

UBIK LOAD PACK 的解决方案有效 :),GOAL 已更新。

【问题讨论】:

    标签: java loops integer jmeter beanshell


    【解决方案1】:

    您的 Beanshell 脚本有很多错误:

     import java.util.*;
     import java.text.*; 
     import java.io.*;
     int n = Integer.parseInt(vars.get("COUNT")); 
     for (int i=1;i<=n;i++)
     {
          props.setProperty("UPSTREAM_"+i, vars.get("UPSTREAM_"+i));
     }
    

    注意你所做的是在 props (global) 中设置你从 vars (特定于每个用户) 获得的内容,所以这可能是错误的。

    阅读:

    【讨论】:

    • Beanshell 示例仍有一些问题.. 响应代码:500 响应消息:org.apache.jorphan.util.JMeterException:调用 bsh 方法时出错:eval 源文件:内联评估:` `导入 java.util.*;导入java.text.*;导入java.io.*; int n = 整数.pa 。 . . '':类型变量声明:方法调用 Integer.parseInt
    • 你确定 COUNT 真的被定义为一个变量吗?你能展示你的测试计划吗?在 Beanshell PostProcessor 之前添加一个 DebugPostProcessor 并显示输出 ?thx
    • no COUNT 也来自 SQL。但是当我在用户定义变量COUNT = ${__property(COUNT)} 中设置 GLOBAL VAR 时,它会返回另一个错误int n = Integer.pa . . . '' : Method Invocation props.setProperty
    • 我在上面的脚本中修正了一个小错字。你能重试看看是否解决了第二个问题。第一个(缺少 COUNT)来自不可用的 var COUNT
    • 我会试试看.. 对原作做一些更新
    【解决方案2】:

    我不知道您要达到什么目的,您的方法存在多个问题。

    1. ${__setProperty(COUNT, ${COUNT_1})};

                            ^ here you set an extra space before the value
      

      还要完全清楚,varsprops 是不同的野兽,它们没有任何共同点。如果您通过__setProperty 函数设置属性,您将无法通过vars.get() 访问它,您必须改用props.get()

    2. vars.get(${COUNT_1}) 不起作用,您应该将其更改为以下之一:

      • `vars.get("COUNT_1");
      • `${COUNT_1}

      一般来说,不建议将 JMeter 函数和变量内联到 Beanshell(和其他)脚本中,因为它们可能会根据它们的值进行不同的解释。

    3. 关于

      在类'org.apache.jmeter.threads.JMeterVariables'中找不到方法get(int)

      我不知道您是如何将整数放入 JMeter 变量中的,但如果您这样做了,您应该通过 vars.getObject() 之类的函数访问它

      int n = vars.getObject("COUNT");
      
    4. 疑难解答提示:将您的代码用try block 括起来,您将能够在 jmeter.log 文件中获得更多信息性错误消息,例如:

      try {
          //your code here
      }
      catch (Throwable ex) {
          log.error("something wrong", ex);
          throw ex;
      }
      

    我还建议您熟悉 Debugging JDBC Sampler Results in JMeter 指南

    【讨论】:

    • 谢谢,我刚刚更新了问题开头的目标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多