使用PostProcessor

时间:2019-03-07 13:58:34

标签: groovy jmeter jsr223

我尝试在JSR223 PostProcessor中使用以下代码在每次迭代中保存对CSV文件的响应。

if(${__groovy(ctx.getPreviousResult().getResponseCode(),)} == "200"){
    vars.put("response", prev.getResponseDataAsString());

    String res="${response}";
    FileWriter fstream = new FileWriter("logresult.csv",true);
    fstream.write(res+"\n");
    fstream.close();    
}

我假设csv文件应与jmx放在同一文件夹中创建,但执行后不存在。我在一个线程中执行测试。

2 个答案:

答案 0 :(得分:1)

请勿在JSR223脚本中使用${}语法作为JMeter best practices的一部分

if(prev.getResponseCode() == "200"){
    String res=prev.getResponseDataAsString();
    vars.put("response", res);
    FileWriter fstream = new FileWriter("logresult.csv",true);
    fstream.write(res+"\n");
    fstream.close();    
}
  

确保脚本不使用${varName}使用任何变量,因为缓存将仅使用${varName}的第一个值。而是使用:   vars.get("varName")

答案 1 :(得分:1)

您的语法不正确,您需要将第一行修改为:

if(prev.getResponseCode().equals('200')){

您也根本不需要此行

String res="${response}";  

请使用以下内容:

fstream.write(vars.get('response')+"\n");

有关全面的解释,请参见JSR223 Sampler documentation,相关引用:

  

JMeter在将脚本字段传递给解释器之前先处理函数和变量引用,因此这些引用将只解析一次。脚本文件中的变量和函数引用将逐字传递给解释器,这可能会导致语法错误。


通常,您会走错方向,以防万一如果您使用> 1个线程运行测试,则可能会遇到race condition的情况,因为有2个线程将写入同一文件。

如果您必须将响应存储到单独的文件中,我建议:

  1. 使用Regular Expression Extractor
  2. 将整个响应提取到JMeter变量中
  3. 定义Sample Variable属性以保留此值
  4. 使用Flexible File Writer
  5. 将值写入文件