【问题标题】:Save responses to a file in JMeter with PostProcessor使用 PostProcessor 将响应保存到 JMeter 中的文件
【发布时间】:2019-03-08 16:36:18
【问题描述】:

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

【问题讨论】:

    标签: groovy jmeter jsr223


    【解决方案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")

    【讨论】:

    • 首先 csv 文件没有用变量值更新。每次迭代都会更新值。是否可以将采样器结果选项卡也添加到文件中?
    【解决方案2】:

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

    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 将整个响应提取到 JMeter 变量中
    2. 定义Sample Variable 属性以保存该值
    3. 使用Flexible File Writer将值写入文件

    【讨论】:

    • 它什么也不写。我尝试将 FileWriter 与 FileServer.getFileServer().getBaseDir()+"\\logresult.csv" 一起使用,但效果相同,文件未更新。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多