Gatling批量Feed获取单条记录返回错误类型问题排查
Gatling批量读取CSV时获取参数值异常
场景说明
CSV文件内容如下:
requestParam string string2 string3
尝试通过批量方式从CSV读取记录并获取值,代码如下:
ScenarioBuilder scn = scenario("Batch Processing Example") .repeat(1).on( feed(csvFeeder, 10).exec(session -> { for (int i = 0; i < 10; i++) { String requestParam = session.getString("requestParam"); System.out.println(requestParam); // 此处无法正常工作 } return session; }) .exec( //无关代码 ) );
此时输出结果为:[Ljava.lang.Object;@4ebc2694
但不使用批量分割记录的方式时,代码可以正常运行:
ScenarioBuilder scn = scenario("Batch Processing Example") .repeat(1).on( feed(csvFeeder).exec(session -> { String requestParam = session.getString("requestParam"); System.out.println(requestParam); return session; }) .exec( //无关代码 ) );
问题原因及解决方案
当使用feed(csvFeeder, batchSize)这种批量读取模式时,Gatling会将指定批量的CSV记录以数组形式存储在Session中,而不是单个值。此时session.getString("requestParam")拿到的是一个Object数组,直接打印就会输出数组的内存地址(也就是你看到的[Ljava.lang.Object;@4ebc2694)。
正确的处理方式是把获取到的对象转为数组,再遍历取值:
ScenarioBuilder scn = scenario("Batch Processing Example") .repeat(1).on( feed(csvFeeder, 10).exec(session -> { Object[] requestParams = session.get("requestParam"); for (Object param : requestParams) { System.out.println(param.toString()); } return session; }) .exec( //无关代码 ) );
或者更严谨地指定字符串数组类型:
String[] requestParams = session.get("requestParam"); for (String param : requestParams) { System.out.println(param); }
另外需要注意,如果你设置的batchSize(这里是10)大于CSV中的实际记录数,数组长度会等于实际记录数,不会填充空值,遍历的时候无需额外处理边界问题。
内容的提问来源于stack exchange,提问作者Peter S.
相关产品推荐
相关产品推荐

