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";
}
不推荐将 JMeter 变量内联到基于代码的脚本中,因此请选择第二种方法。
你怎么知道 正好 一直从数据库返回字符串?它很容易可以是任何其他对象类型,实际上是 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 文章
需要将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.
错误
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";
}
不推荐将 JMeter 变量内联到基于代码的脚本中,因此请选择第二种方法。
你怎么知道 正好 一直从数据库返回字符串?它很容易可以是任何其他对象类型,实际上是 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 文章