使用 PostProcessor 将响应保存到 JMeter 中的文件

Save responses to a file in JMeter with PostProcessor

我尝试在 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 相同的文件夹中创建,但它在执行后不存在。我在一个线程中执行测试。

不要在 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();    
}

ensure the script does not use any variable using ${varName} as caching would take only first value of ${varName}. Instead use : vars.get("varName")

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

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

而且你根本不需要这一行

String res="${response}";  

改为使用以下内容:

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

详见JSR223 Sampler documentation,相关引用:

JMeter processes function and variable references before passing the script field to the interpreter, so the references will only be resolved once. Variable and function references in script files will be passed verbatim to the interpreter, which is likely to cause a syntax error.


一般来说,你的方向是错误的,如果你运行你的测试有> 1个线程,你可能会运行进入race condition,当2个线程正在写入时进入同一个文件,如果不是更糟的话,会导致垃圾。

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

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