在 JMeter 中使用 Beanshell Sampler 将变量写入 txt/csv 文件

Writing Variables using Beanshell Sampler in JMeter into a txt/csv file

我的要求是使用在不同步骤中使用的 2 个 Beanshell 采样器在一行中写入两个值,并用逗号分隔 但是第二个变量写在一个新行

我在不同的步骤有两个不同的 Beanshell 采样器。 第一个捕获变量 1 并将其写入文件 第二个捕获变量 2 并将其写入文件

第一个代码:

String path= FileServer.getFileServer().getBaseDir() + "//P_IssuePolicy.txt";
SubmissionNum= vars.get("CP_SubmissionNumber");
EMailID= vars.get("P_emailID");
f = new FileOutputStream(path, true);
p = new PrintStream(f);
this.interpreter.setOut(p); 
p.println(EMailID+","+SubmissionNum);
f.close();

第二个代码:

String path= FileServer.getFileServer().getBaseDir() + "//P_IssuePolicy.txt";
Policynumber= vars.get("CP_Policynumber");
f = new FileOutputStream(path, true); 
p = new PrintStream(f);
this.interpreter.setOut(p);
p.println(","+Policynumber);
f.close();

预期结果:

 abc@email.com,12345601,12345602

实际结果:

 abc@email.com,12345601

 ,12345602
String path= FileServer.getFileServer().getBaseDir() + "//P_IssuePolicy.txt";
SubmissionNum= vars.get("CP_SubmissionNumber");
EMailID= vars.get("P_emailID");
Policynumber= vars.get("CP_Policynumber");
f = new FileOutputStream(path, true);
p = new PrintStream(f);
this.interpreter.setOut(p);
p.println(EMailID+","+SubmissionNum+","+Policynumber);
f.close();

试试上面的方法。

而不是添加新行的 println 使用 print

 p.print(EMailID+","+SubmissionNum);

首先,你知道Sample Variables property and Flexible File Writer? If you run your script with multiple virtual users most probably you will suffer from a form of a race condition什么时候多个线程会同时写入同一个文件导致垃圾数据吗


Since JMeter 3.1 it's recommended to use JSR223 Test Elements and Groovy language 对于任何脚本任务,原因在:

  1. Groovy 与现代 Java 版本兼容,而使用 Beanshell 时你会停留在 Java 5 语言级别
  2. Groovy 比 Beanshell
  3. 性能好很多
  4. Groovy 有很多 enhancements 让您的生活更轻松

例如您的代码可以缩短为:

  • 第一个:

    def file = new File(org.apache.jmeter.services.FileServer.getFileServer().getBaseDir() + "//P_IssuePolicy.txt")
    file << vars.get("P_emailID") << "," << vars.get("CP_SubmissionNumber") << ","
    
  • 第二个:

    def file = new File(org.apache.jmeter.services.FileServer.getFileServer().getBaseDir() + "//P_IssuePolicy.txt")
    file << vars.get("CP_Policynumber") << System.getProperty("line.separator")