JMeter5.5入门到实战:HTTP+TCP+响应断言+自定义拓展+返回值获取

news2024/11/26 18:35:25

前言

        众所周知JMeter是业内公认的性能测试工具,功能十分强大且易于拓展,但是入门有一定门槛,需要明白一些基本概念。本文使用了HTTP取样器、TCP取样器、响应断言、JSON提取器等组件,对公司现存的登录流程进行了测试。公司的产品包含了HTTP和TCP接口,对于HTTP可以直接使用JMeter进行测试,但是TCP由于使用了特殊协议,所以需要重写拓展实现自定义协议。

基本概念

  • 测试计划:顶级文件夹,概念类似于java项目
  • 线程组:运行线程的容器,类似于java线程池,可以设置线程数、失败策略、循环次数等参数
  • 取样器:从外部接口获取数据的组件,支持很多访问协议,可以理解为一个接口访问者
  • 响应断言:对接口返回内容进行匹配,从而标记接口是否响应成功
  • 提取器:从接口返回值中提取关键数据到JMeter上下文中,可以在其它地方使用${key}获取
  • 查看结果树:显示接口请求和返回数据
  • 聚合报告:生成测试的报告,包含请求次数、响应时间、失败数量等性能指标
  • 响应时间图:以图表的形式显示响应时间,需要自行设置横纵坐标参数,且不能实时刷新
  • 临界部分控制器:确保线程组中所有接口按序执行

安装

        直接在JMeter官网下载压缩包后解压即可,下载地址apache-jmeter-5.5。注意解压路径不要有中文,解压后打开apache-jmeter-5.5\bin\ApacheJMeter.jar即可运行。请确保本机环境有jdk1.8及以上版本。

基本使用

1.创建线程组

步骤:右击测试计划-》添加-》线程-》线程组

线程数:同时有多少个线程运行,即同时并发多少用户

Ramp-up时间:线程在多少秒内启动完毕,如线程数太多时可以设置时间长一点

循环次数:每个线程循环多少次

2.创建取样器

步骤:右击线程组-》添加-》取样器-》HTTP请求

协议:http或者https

服务器或ip:127.0.0.1

端口:80

路径:/user/login

参数:请求提交的参数,先点击添加后双击列表项,列表值可以使用${key}获取上下文中的变量

其余参数按需填写

3.JSON提取器

步骤:右击HTTP请求-》添加-》后置处理器-》JSON提取器

names of created..:取出变量在JMeter上下文中的名字,也就是后续使用${key}获取时的key

JSON Path..:返回值的提取路径,如:$.data.userId,对应返回json:{data:{userId:123}}

4.其它

        篇幅有限,其余组件不一一列举,使用方法大同小异,如有不懂可以执行搜索。后文会提供完整的项目文件供参考。

自定义TCP取样器

        使用TCP取样器时默认提供的TCPClient太局限,无法满足自定义TCP协议的场景,这里重写官方的TCPClient实现自定义协议,完成TCP测试工作。

1.创建maven项目

        安装idea指引创建默认的maven项目即可,注意配置的groupId和artifactId,这个需要用于在后续JMeter中指定TCPClient。

2.maven依赖

    <dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_core</artifactId>
            <version>5.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_tcp</artifactId>
            <version>5.5</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

3.maven编译

    <build>
        <finalName>test-jmeter-tcp</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

4.代码编写

        JMeter在请求前会调用write方法,其中是String s就是TCP取样器中要发送的文本,在响应后会调用read方法,返回输入流供自定义读取。

        这里在发送请求时先写入请求序号,然后写入请求体的长度,最后再写入请求体。本处的自定义协议规定长度为4字节采用大端在前的方式。

        这里在收到返回值时跳过了前面自定义的24位数据,这些数据在自定义协议里标识了请求信息,这里不做校验,直接读取24位数据之后的响应体并以UTF-8解析。需要注意的是一般来说TCP都是长连接,服务器在请求后不会主动断开链路,这里JMeter无法知道服务器数据响应完成,本处的自定义协议也无法使用固定的EOL字符标记,所以采用了一个较大是数组读取,确保一次性能够读完响应值后直接返回,不然JMeter会一直等待响应知道超时。

package com.test.jmeter;

//引用省略

public class TTcpClientImpl extends AbstractTCPClient {
    //请求序号
    private int req = 1;

    @Override
    public void write(OutputStream outputStream, InputStream inputStream) {
        throw new UnsupportedOperationException(
                "Method not supported for Length-Prefixed data.");
    }

    @Override
    public void write(OutputStream outputStream, String s) throws IOException {
        byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
        //req
        outputStream.write(req);
        req++;
        req = req > 0xff ? 1 : req;
        //length
        int length = bytes.length;
        outputStream.write((byte)(length >> 24));
        outputStream.write((byte)(length >> 16));
        outputStream.write((byte)(length >> 8));
        outputStream.write((byte)length);
        outputStream.write(bytes);
        outputStream.flush();
    }

    /**
     * @param inputStream
     * @deprecated
     */
    @Override
    public String read(InputStream inputStream) throws ReadException {
        //使用一个足够大的缓冲,避免TCP连接一直无响应到超时
        //协议无法使用固定的结尾进行分割(EOL),所以这里用大缓存一次读完
        byte[] bytes = new byte[4096];
        StringBuilder sb = new StringBuilder(4096);
        SampleResult sampleResult = new SampleResult();
        try {
            //自定义读取开始
            inputStream.skip(24);
            inputStream.read(bytes);
            //自定义读取结束
            sampleResult.latencyEnd();
            sb.append(new String(bytes, StandardCharsets.UTF_8));
        } catch (SocketTimeoutException e) {
            if (useEolByte) {
                throw new ReadException("Socket timed out while looking for EOM", e,
                        sb.toString());
            }
        } catch (IOException e) {
            throw new ReadException("Problems while trying to read", e, sb.toString());
        }
        return sb.toString();
    }
}

5.编译使用

        直接使用maven的package进行打包,会生成一个名为test-jmeter-tcp.jar的文件,将这个文件放到apache-jmeter-5.5\lib\ext目录,然后重启JMeter。

        在TCP取样器中的TCPClient classname中填入我们的class路径即可使用自定义的client,这里我们填入com.test.jmeter.TTcpClientImpl。

最终效果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中hashmap底层Hash冲突是什么?以及如何解决Hash冲突 【杭州多测师_王sir】【杭州多测师】...

一、hashMap的底层实现hashmap的底层结构在jdk1.7之前是数组链表&#xff0c;但是在jdk1.8以后&#xff0c;其变成了数组链表红黑树&#xff0c;这个操作会加快在链表时候的查询速度。当链表的长度大于8 的时候&#xff0c;链表就会变为红黑树&#xff0c;而当长度小于6的时候&…

培训机构的存在对 IT 行业产生了哪些影响

这个标题我一看&#xff0c;应该就会引发一波口水、键盘要遭罪啦。。。做为从业十余年&#xff0c;培训行业从事也已经快7年了。 在正厚软件从一开始到今天。从讲师到教学和团队的协作、校区运营&#xff0c;从行业小白到对整体机构的运营和团队&#xff0c;有些许经验谈下个人…

测试4年裸辞失业,面试17k的测试岗被按在地上摩擦,结局让我崩溃大哭....

作为IT行业的大热岗位——软件测试&#xff0c;只要你付出了&#xff0c;就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的&#xff0c;但放眼望去&#xff0c;哪个工作不是这样的呢&#xff1f;会有哪家公司愿意养一些闲人呢&#xff1f;…

FKM规范在非焊接构件中的静强度评估方法介绍(上篇)

导读&#xff1a;FKM &#xff08;《Analytical Strength Assessment of Components in Mechanical Engineering》&#xff09;规范是德国机械工程研究委员会根据机械产品在实际工程中的应用情况&#xff0c;统计出的针对由钢、铸铁及铝材料制成构件的静强度及疲劳强度的评估规…

C++模板(第二版)笔记之第六章:移动语义和 enable_if

文章目录一、完美转发&#xff08;Perfect Forwarding&#xff09;二、特殊成员函数模板&#xff1a;构造函数三、 通过 std::enable_if<>禁用模板四、 使用 enable_if<>1.不能通过使用 enable_if<>来禁用 copy/move 构造函数以及赋值构造函数五、使用 conce…

0124 双指针 Day13

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 输入一个整数数组&#xff0c;实现一个函数来调整该数组中数字的顺序&#xff0c;使得所有奇数在数组的前半部分&#xff0c;所有偶数在数组的后半部分。 示例&#xff1a; 输入&#xff1a;nums [1,2,3,4] 输出&#xff1a…

net基于asp.net的计算机网络课程题库系统-计算机毕业设计

项目介绍 计算机网络课程题库系统是针对目前计算机网络课程试题的实际需求,从实际工作出发,对过去的计算机网络课程试题平台存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结…

操作系统_线程安全问题

文章目录1.线程安全问题举例2.为什么会有线程安全问题3.如何解决线程安全问题1.从原子性入手解决线程安全问题2.synchronized的使用方法3.java标准库中的线程安全类4.死锁问题举例2.死锁的必要条件1.线程安全问题举例 看代码: class Count {int i 0;public void add(){i;} }…

Sklearn机器学习与Plotly可视化强强联合

在学习sklearn(机器学习)过程中&#xff0c;模型原理可谓是枯燥无味&#xff0c;加上大多数模型训练过程也是不可见的&#xff0c;这使得很多小伙伴们望而却步&#xff0c;当然也有很多学者试图通过各种方式以可视化模型学习及预测过程&#xff0c;但大多数是复杂且不美观的。 …

Windows后台运行并启动Frpc客户端界面

Windows后台运行并启动Frpc客户端界面 frp搭建内网穿透可以看我另外一篇 1.frps服务端配置 [common] bind_port 3000 vhost_http_port 4000 vhost_https_port 5000authentication_method token authenticate_new_work_conns true token 5ae9394f-32d8-4a58-b6ed-e9f36…

【微服务技术05】Ribbon负载均衡

【微服务技术05】Ribbon负载均衡 案例代码&#xff1a;https://gitee.com/pikachu2333/spring-cloud-hexuan 之前配置好了eureka注册中心&#xff0c;使用RestTemplate调用地址为&#xff1a;http://eureka-user-service/user/1&#xff0c;配置了LoadBalanced负载均衡注解 但…

使用RTP包荷载AAC码流数据

目录 一. 前言 二. RTP协议介绍 三. AAC介绍 1. AAC格式 2. ADTS 四. RTP与AAC的结合 五. 代码实战 六. 效果展示 一. 前言 音视频通话中我们通常使用 RTP 协议包荷载音视频码率数据&#xff0c;例如麦克风采集输入数据后编码成帧&#xff0c;再将帧数据放入 RTP 协议包…

B站:以SLO为核心的可用性观测与质量运营

UGeek大咖说是优维科技为技术爱好者研讨云原生技术演进趋势而创办的系列活动&#xff0c;邀请一线互联网大厂的核心骨干主讲&#xff0c;分享原厂实践。本年度主题为可观测&#xff0c;我们希望通过一场场有趣、有料、有深度的活动&#xff0c;让运维圈的小伙伴聚集在一起&…

Java知识点--反射(上)

Java知识点--反射&#xff08;上&#xff09;&#x1f356;一、为什么需要反射1️⃣在特定情境中传统方法的不足2️⃣为了不修改原码引出反射&#x1f357;二、反射机制1️⃣Java反射机制2️⃣Java 反射机制原理示意图3️⃣Java 反射机制可以完成4️⃣反射相关的主要类5️⃣反射…

java计算机毕业设计ssm在线学习资源管理系统t4ko5(附源码、数据库)

java计算机毕业设计ssm在线学习资源管理系统t4ko5&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java丹徒高级中学校车预约9poqj

大四计算机专业的同学们即将面临大学4年的最后一次考验--毕业设计。通过完成毕业设计来对过去4年的大学学习生活做一个总结&#xff0c;也是检验我们学习成果的一种方式&#xff0c;毕业设计作品也是我们将来面试找工作的一个敲门砖。 选题前先看看自己掌握哪些技术点、擅长哪…

Denoising Diffusion Probabilistic Models

目录概要前向过程nice property逆向过程参数推导简化参考资料概要 Denoising Diffusion Probabilistic Model(DDPM)是一个生成模型&#xff0c;给定一个目标分布&#xff0c;学习模型以便可以从目标分布中采样。 使用马尔科夫链建模。输入是噪声&#xff0c;通过神经网络逐步去…

伟大的缝纫师—typedef

伟大的缝纫师—typedef一.历史的误会—也许应该是typerename二.typedef和#define的区别一.历史的误会—也许应该是typerename 为什么这样说呢&#xff1f;因为typedf其实就是一个重命名关键字&#xff0c;看示例 这里我觉得unsigned int太长了&#xff0c;我将它改名为u_int&am…

bat批处理文件的注释,和常用简单命令

参考&#xff1a;https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/windows-commands&#xff0c;https://blog.csdn.net/wuhenyouyuyouyu/article/details/120736519? 当前路径&#xff1a;%~dp0 这个参数只能在bat文件中在正常使用&…

Unity脚本(2) --- 脚本生命周期以及脚本的控制台调试

1.什么是脚本生命周期&#xff1f; 首先什么是脚本 --- 脚本的本质其实就是类&#xff0c;而脚本生命周期其实就是脚本对应的那个类从开始工作到最后销毁这么一个周期 &#xff08;或者说是Unity脚本从唤醒到销毁的过程&#xff09; &#xff08;消息&#xff0c;必然事件&am…