jMeter BeanShell 后处理器同步



我在jMeter中进行了一些性能测试,在一个HTTP请求中,我有BeanShell PostProcessor。它应该在CSV文件的顶部写下用户电子邮件地址(最新的在顶部)。对该文件进行排序非常重要。

import org.apache.commons.io.FilenameUtils;
import org.apache.jmeter.services.FileServer;
import java.text.*;
import java.io.*;
import java.util.*;
try {
    String email = vars.get("emailPrefix") + "+" + vars.get("environment") + "-jm-" + vars.get("randomEmailNumber")+"@someEmail.com";
    log.info(email);
    String separator = System.getProperty("file.separator");
    File mFile = new File(FileServer.getFileServer().getBaseDir() + separator + "investors_" + vars.get("environment") + ".csv");
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(mFile), "UTF8"));
    String result = "";
    String line = "";
    while((line = br.readLine()) != null){
        result = result + "n" + line; 
    }
    result = email + "," + result;
    FileOutputStream fos = new FileOutputStream(mFile);
    fos.write(result.getBytes());
    fos.flush();
} catch(Exception e) {
    System.out.println("Exception in 2 1 4 /getContactInformation::Email writer:" + e.toString());
    throw e;
}

但是当我尝试一次运行 100 个线程时,有时会发生并非所有电子邮件都被记录,或者 CSV 文件以空结尾(内容在运行过程中被删除)。

我的问题可以通过从最后读取这个CSV文件来解决,但是jMeter不能做到这一点。

有没有简单的方法,如何同步这个后处理器,或者如何重写它?

你的测试似乎设计得很糟糕,不建议并发写入同一个文件,你应该有ReadWriteLock实现或使用JMeter的关键部分控制器来确保一次只有一个线程将某些内容写入文件。

另一个选项是在尝试读取行之前运行 CSV 文件创建逻辑。

第三个(恕我直言)最好的解决方案是删除文件,将所有内容写入 JMeter 变量或属性,并在需要时从内存中读取值。我还建议考虑切换到JSR223 PostProcessor和Groovy语言,因为对于您的场景,Groovy将提供比使用Beanshell更好的性能,有关详细信息,请参阅Groovy Is the New Black文章。

最新更新