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

时间:2016-10-17 21:22:09

标签: jmeter performance-testing beanshell

需要在BeanShell断言中将值从String更改为Long以进行验证。

First Apporach

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。

2 个答案:

答案 0 :(得分:1)

  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");
    }
    

    因此,在非String JDBC查询结果的情况下,您将能够在 jmeter.log 文件中看到相关消息

    JMeter variable type

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

答案 1 :(得分:0)

第二个选项

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

它不会返回任何异常。 问题是当未定义变量时,具有空值或非数值。然后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";
}