怎么使用JMeter前置处理器

610 阅读5分钟

当使用JMeter进行性能测试时,前置处理器是一种非常有用的工具,可以用于准备测试数据、设置会话状态和创建登录凭证等操作。在这篇文章中,我们将介绍如何使用JMeter中的前置处理器来优化性能测试。

  1. 前置处理器的作用

前置处理器是JMeter中的一个组件,它可以在执行测试之前对请求进行修改和处理。前置处理器可以在测试计划中的每个HTTP请求之前执行,因此可以用于设置请求头、设置cookie、创建登录凭证等操作。前置处理器可以在测试用例执行之前,先设置好环境变量,提前准备好测试数据,这样可以提高测试用例的执行效率和准确性。

  1. 前置处理器的使用方法

在JMeter中,前置处理器可以通过添加"HTTP Request Defaults"或"HTTP Request"的前置处理器来使用。

a. 添加HTTP Request Defaults前置处理器

HTTP Request Defaults前置处理器是一个全局的前置处理器,可以为测试计划中的所有HTTP请求设置一些共同的属性。例如,可以设置请求头、请求参数、cookie等信息。当添加HTTP Request Defaults前置处理器后,后续的HTTP请求将会继承这些设置,从而避免了在每个HTTP请求中都设置相同的属性。

b. 添加HTTP Request前置处理器

HTTP Request前置处理器是一个局部的前置处理器,可以为某个特定的HTTP请求设置一些属性。例如,可以为某个HTTP请求设置请求头、请求参数、cookie等信息。在添加HTTP Request前置处理器后,它所关联的HTTP请求将会继承这些设置。

  1. 使用前置处理器的注意事项

在使用前置处理器时,需要注意以下几点:

a. 前置处理器的顺序:JMeter会按照添加前置处理器的顺序执行它们。如果需要保证前置处理器按照一定的顺序执行,则需要调整它们的顺序。

b. 前置处理器的有效范围:HTTP Request Defaults前置处理器的作用范围是全局的,而HTTP Request前置处理器的作用范围是局部的。因此,在选择前置处理器时需要注意它们的作用范围,以避免不必要的重复设置。

c. 前置处理器的参数化:前置处理器的参数可以通过变量的方式设置,从而实现参数化。这样可以为每个HTTP请求动态地设置不同的参数,从而更加灵活地进行性能测试。

前置处理器的Java例子: 当我们使用Java语言编写JMeter的前置处理器时,我们可以利用Java提供的各种功能和第三方Jar包来完成数据准备和处理工作。以下是一个使用Java语言编写的前置处理器的示例,该前置处理器可以引入第三方Jar包: import java.io.IOException; import java.util.List; import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult; import org.apache.jmeter.protocol.http.util.HTTPConstants; import org.apache.jmeter.protocol.http.util.HTTPFileArg; import org.apache.jmeter.protocol.http.util.SlowHttpClientSocketFactory; import org.apache.jmeter.protocol.http.util.accesslog.TCLogParser; import org.apache.jmeter.protocol.http.util.accesslog.TCLogSampler; import org.apache.jmeter.protocol.http.util.accesslog.TCLogParser.ReportData; import org.apache.jmeter.protocol.http.util.accesslog.TCLogParser.Tokenizer;

public class MyCustomPreProcessor extends AbstractPreProcessor {

private String logFile;
private String delimiter;
private String regex;

private TCLogSampler sampler;
private TCLogParser parser;

@Override
public void process() {
    try {
        List<HTTPFileArg> files = sampler.getFileUploads();
        HTTPSampleResult res = new HTTPSampleResult();
        res.setSuccessful(true);
        res.setResponseCodeOK();
        res.setResponseMessage("OK");

        //TODO: process the log file with the configured delimiter and regex

        HTTPConstants.PROTOCOL_HTTPS.equalsIgnoreCase(getThreadContext().getProtocol()) 
            ? SlowHttpClientSocketFactory.setupSSLSocketFactory(res) 
            : res.setResponseData("The protocol is not HTTPS");

        HTTPConstants.HEADER_CONTENT_TYPE.equals(getThreadContext().getCurrentSampler().getPropertyAsString(HTTPConstants.HEADER_CONTENT_TYPE)) 
            ? files.forEach(HTTPFileArg::setMimeType) 
            : res.setResponseData("The content type header is not present or is invalid");

    } catch (IOException e) {
        getLogger().error("Failed to process log file: " + e.getMessage(), e);
    }
}

public void setLogFile(String logFile) {
    this.logFile = logFile;
}

public void setDelimiter(String delimiter) {
    this.delimiter = delimiter;
}

public void setRegex(String regex) {
    this.regex = regex;
}

@Override
public void setup() {
    super.setup();

    sampler = new TCLogSampler();
    parser = new TCLogParser();
    parser.setDelimiter(delimiter);
    parser.setRegex(regex);

    try {
        sampler.setParser(parser);
        sampler.setFileName(logFile);
        sampler.setThreadContext(getThreadContext());
        sampler.testStarted();
    } catch (Exception e) {
        getLogger().error("Failed to setup log sampler: " + e.getMessage(), e);
    }
}

@Override
public void teardownTest(JavaSamplerContext context) {
    try {
        ReportData report = parser.generateReport();
        getLogger().info("Processed " + report.getRequests() + " requests from log file");
    } catch (Exception e) {
        getLogger().error("Failed to generate report: " + e.getMessage(), e);
    } finally {
        sampler.testEnded();
    }
}

}

这个前置处理器用于处理一个访问日志文件,并从中读取HTTP请求数据,然后将它们转换为JMeter的HTTP请求。该前置处理器引入了JMeter的HTTP协议库,并使用了许多库中定义的常量和类。 总之,前置处理器是JMeter中非常有用的工具,可以帮助我们准备测试数据、设置会话状态和创建登录凭证等操作,从而提高性能测试的效率和准确性。合理地使用前置处理器,可以在性能测试中取得更好的效果。 此外,该前置处理器还引入了第三方Jar包org.apache.jmeter.protocol.http.util.accesslog中的TCLogParserTCLogSampler类,这两个类用于解析和采样访问日志文件中的请求数据。我们可以在前置处理器中设置日志文件路径、分隔符和正则表达式等参数,然后使用TCLogSampler来读取日志文件并生成HTTPSampleResult对象。

process()方法中,我们可以根据需要对读取的请求数据进行处理,然后通过HTTPSampleResult对象返回处理结果。在此示例中,我们对文件上传时的文件类型和HTTPS协议进行了检查。

setup()方法中,我们对TCLogSamplerTCLogParser进行了初始化,并在teardownTest()方法中生成了处理结果的报告。

需要注意的是,Java语言编写的前置处理器需要继承AbstractPreProcessor类,并实现其中的process()setup()teardownTest()方法。此外,为了在JMeter中使用该前置处理器,我们需要将编写好的Java类编译为.jar文件,并将该文件放置在JMeter的lib/ext目录中。最后,在JMeter的测试计划中,我们可以通过添加一个Java Request元素,并指定使用我们编写的前置处理器类来使用它。