JMeter BeanShell 断言:将 String 转换为 Long 时出错

JMeter BeanShell Assertion: Getting error when convert String to Long

需要将BeanShell Assertion中的值从String改成Long来做校验

第一站

long balance_after_credit = Long.parseLong(String.valueOf("${balance_after_credit_from_db}"));   

第二种方法

long balance_after_credit = Long.parseLong(vars.get("balance_after_credit_from_db"));

例如,假设我正在为变量 balance_after_credit_from_db.

获取一个值“743432545”

错误

org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval    Sourced file: inline evaluation of: ``long token_balance_after_credit = Long.parseLong(vars.get("token_balance_after_c . . . '' : Typed variable declaration : Method Invocation Long.parseLong

有时候奇怪的是,我没有收到错误,脚本正在通过。 谁能指出我在哪里做错了。 TIA.

第二个选项

long balance_after_credit = Long.parseLong(vars.get("balance_after_credit_from_db"));

应该可以工作,前提是您有一个有效的数字变量值。例如尝试 运行 这样的事情:

vars.put("x", "743432545");
long balance_after_credit = Long.parseLong(vars.get("x"));

它不会return任何异常。 问题是变量未定义,具有空值或非数字值。然后 Long.parseLong 将抛出一个 NumberFormatException,你应该抓住并利用它(将其视为断言失败):

String rawValue = vars.get("balance_after_credit_from_db");

long balance_after_credit = Long.MAX_VALUE; // initialize with some unrealistic value

try {
    balance_after_credit = Long.parseLong(rawValue);
}
catch(NumberFormatException e) {
    Failure = true;
    FailureMessage = "Variable does not contain a valid long. It was " + rawValue + " instead";
}
  1. 不推荐将 JMeter 变量内联到基于代码的脚本中,因此请选择第二种方法。

  2. 你怎么知道 正好 一直从数据库返回字符串?它很容易可以是任何其他对象类型,实际上是 Mapping SQL and Java Types 文章中描述的任何对象类型。更安全的方法是这样的:

    if (vars.getObject("balance_after_credit_from_db") instanceof String) {
        long balance_after_credit = Long.parseLong(vars.get("balance_after_credit_from_db"));
    } 
    else {
        log.error("Unexpected \balance_after_credit_from_db\" variable type");
        log.error("Expected: String, Actual: " + vars.getObject("balance_after_credit_from_db").getClass().getName());
        throw new Exception("Unexpected variable type");
    }
    

    所以如果是非字符串 JDBC 查询结果,您将能够在 jmeter.log 文件

    中看到相关消息

有关在 JMeter 测试中使用来自数据库的实体的更多信息,请参阅 Debugging JDBC Sampler Results in JMeter 文章