JMeter:如何定制Http请求取样器

2024-09-05 15:04

本文主要是介绍JMeter:如何定制Http请求取样器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      一般使用JMeter发送HTTP请求时都会用到HTTP Request取样器,这种取样器大多数时候能够满足压力测试的需要。

图1

       但也有一些场景,可能需要更加强大的取样器,或者需要定制一些功能,这时就需要自己手动编写取样器。幸好JMeter为我们提供了这样的扩展点,也就是下面将要介绍的java Requset取样器。

图2

      通过java Requset取样器扩展功能,需要用到如下接口或抽象类:

接口:

org.apache.jmeter.protocol.java.sampler.JavaSamplerClient

抽象类:

org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient

  需要引入JMeter的如下的包。当然,如果用到其它第三方组件,它们的包也是要引入的

		<dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>5.6.3</version></dependency><dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_java</artifactId><version>5.6.3</version></dependency>

下面提供一个简单的例子:

package com.jmeter.client;import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Iterator;import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.ContentType;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class HttpPerfTester extends AbstractJavaSamplerClient {private static final Logger log = LoggerFactory.getLogger(HttpPerfTester.class);private CloseableHttpClient httpClient;@Overridepublic void setupTest(JavaSamplerContext context) {super.setupTest(context);httpClient = HttpClients.createDefault();}@Overridepublic SampleResult runTest(JavaSamplerContext ctx) {String url = ctx.getParameter("cfg.url");String reqtBodyFilePath = ctx.getParameter("cfg.reqtBodyFile");Iterator<String> paramNameItr = ctx.getParameterNamesIterator();HttpPost httpPost = new HttpPost(url);SampleResult sampleResult = new SampleResult();sampleResult.setSampleLabel("httpClientPerfTest");sampleResult.sampleStart();try {byte[] reqtBodyBuf = Files.readAllBytes(Paths.get(reqtBodyFilePath));ByteArrayEntity reqtEntity = new ByteArrayEntity(reqtBodyBuf, ContentType.APPLICATION_JSON);httpPost.setEntity(reqtEntity);httpPost.addHeader("Content-Type", "application/json");while (paramNameItr.hasNext()) {String headerName = paramNameItr.next();String headerValue = ctx.getParameter(headerName);if (headerName.startsWith("httpHeader.")) {headerName = headerName.substring(headerName.indexOf("." + 1));log.info(headerName + ":" + headerValue);httpPost.addHeader(headerName, headerValue);}}CloseableHttpResponse httpResponse = httpClient.execute(httpPost);if (httpResponse != null) {int statusCode = httpResponse.getStatusLine().getStatusCode();HttpEntity respEntity = httpResponse.getEntity();byte[] respBodyBuf = EntityUtils.toByteArray(respEntity);EntityUtils.consume(reqtEntity);EntityUtils.consume(respEntity);String reqtHeaderStr = "";for (Header header : httpPost.getAllHeaders()) {reqtHeaderStr += header.getName() + ":" + header.getValue() + "\n";}sampleResult.setRequestHeaders(reqtHeaderStr);sampleResult.setSamplerData(new String(reqtBodyBuf, "UTF-8"));sampleResult.setDataType(SampleResult.TEXT);sampleResult.setResponseData(new String(respBodyBuf, "UTF-8"), "UTF-8");sampleResult.setResponseCode("" + statusCode);sampleResult.setResponseMessage("" + statusCode);String respHeaderStr = "";for (Header header : httpResponse.getAllHeaders()) {respHeaderStr += header.getName() + ":" + header.getValue() + "\n";}sampleResult.setResponseHeaders(respHeaderStr);sampleResult.setSuccessful(true);} else {sampleResult.setSuccessful(false);}} catch (Exception e) {log.error("runTest error", e);sampleResult.setSuccessful(false);sampleResult.setResponseMessage(e.toString());} finally {sampleResult.sampleEnd();}return sampleResult;}@Overridepublic Arguments getDefaultParameters() {Arguments args = new Arguments();args.addArgument("cfg.url", "http://15.66.247.19:15050/PASS/8761");args.addArgument("cfg.reqtBodyFile", "D:/Temp/8761_reqt.txt");args.addArgument("httpHeader.src-service", "APTranditionalService");return args;}@Overridepublic void teardownTest(JavaSamplerContext context) {super.teardownTest(context);if (httpClient != null) {try {httpClient.close();} catch (IOException e) {e.printStackTrace();}}}
}

      编译后打包,比如打的包名:perf.jar,然后将它放到${jmeter_home}/lib/ext目录下,重启JMeter后,就能在java Request中看到图2中的结果。

     当执行压力测试后,就可以在View Result Tree中看到测试结果:

图3

这篇关于JMeter:如何定制Http请求取样器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139290

相关文章

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

PDFQFZ高效定制:印章位置、大小随心所欲

前言 在科技编织的快节奏时代,我们不仅追求速度,更追求质量,让每一分努力都转化为生活的甜蜜果实——正是在这样的背景下,一款名为PDFQFZ-PDF的实用软件应运而生,它以其独特的功能和高效的处理能力,在PDF文档处理领域脱颖而出。 它的开发,源自于对现代办公效率提升的迫切需求。在数字化办公日益普及的今天,PDF作为一种跨平台、不易被篡改的文档格式,被广泛应用于合同签署、报告提交、证书打印等各个

构建高性能WEB之HTTP首部优化

0x00 前言 在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识。 0x01 到底发生什么了? 当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

Java http请求示例

使用HttpURLConnection public static String httpGet(String host) {HttpURLConnection connection = null;try {URL url = new URL(host);connection = (HttpURLConnection) url.openConnection();connection.setReq

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

10 Source-Get-Post-JsonP 网络请求

划重点 使用vue-resource.js库 进行网络请求操作POST : this.$http.post ( … )GET : this.$http.get ( … ) 小鸡炖蘑菇 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-w