手把手教你接口性能测试之JMeter性能测试篇

news2024/9/21 16:26:44

一、Jmeter 简介

Jmeter是由Apache公司开发的一个纯Java开源项目,即可以用于做接口测试也可以用于做性能测试,具备高移植性和扩展性,可以实现跨平台运行,可以实现分布式负载。

采用多线程,允许通过多个线程并发取样或通过独立的线程对不同的功能同时取样。

使用 Jmeter 一般用于以下两种类型的性能测试(基本能覆盖绝大多数的性能测试需求)

负载测试:通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。

压力测试:测试系统能承受的最大负载能力。目的在于发挖掘出目标服务系统可以处理的最大负载。

Jmeter 进行性能测试的基本过程

图片

新增线程组

创建测试线程组,并设置线程数量及线程初始化启动方式。

新增 JMeter 元组

创建各种默认元组及测试元组,填入目标测试静态资源请求和动态资源请求参数及数据。

新增监听器

创建各种形式的结果搜集元组,以便在运行过程及运行结束后搜集监控指标数据。

运行&查看结果

调试运行,分析指标数据,挖掘性能瓶颈、评估系统性能状态。

二、Jmeter进行接口测试

在聊jmeter如何进行性能测试之前,我们先简单介绍一下jmeter如何进行接口测试的

1、获取接口文档

使用Jmeter进行接口测试之前,需要拿到api接口文档,对接口信息进行分析,用于接口脚本的设计准备。

通常我们可以跟项目对应开发同学获取开发接口设计文档(类如Java后端项目使用Swagger进行接口文档维护)

图片

除此之外,我们Web页面可以在开发者选项中获取相应的接口调用信息,移动端可通过Fiddler工具抓包得到相应的接口请求入参和返回信息。

有了接口文档后,我们还需要熟悉接口业务,接口地址,鉴权方式,出参,入参,错误码等...

下面我们以12306网站为例,分别获取Get类型接口和Post接口进行演示

a、在12306的车次查询页面获取Get类型接口

图片

例如上面的接口,我们可以得到的信息如下:

  1. 请求 URL: https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2023-01-24&leftTicketDTO.from_station=SHH&leftTicketDTO.to_station=BJP&purpose_codes=ADULT

  2. 请求方法: GET

  3. 请求头

    1. ...

    2. Connection: keep-alive

    3. Cookie: _uab_collina=******; JSESSIONID=******; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; _jc_save_fromStation=%u4E0A%u6D77%2CSHH; _jc_save_wfdc_flag=dc; RAIL_EXPIRATION=1673539455343; RAIL_DEVICEID=******; BIGipServerpassport=******; _jc_save_toStation=%u5317%u4EAC%2CBJP; _jc_save_toDate=2023-01-10; BIGipServerindex=1104740618.43286.0000; route=6f50b51faa11b987e576cdb301e545c4; BIGipServero******4545.0000; current_captcha_type=C; _jc_save_zwdch_fromStation=%u4E0A%u6D77%2CSHH; _jc_save_zwdch_cxlx=1; fo=fcwi8s6jfgcquajch3UNhkI-pbzTa1PopuXw-4vLSsFwS******JLLAo4MZvmDbZL-yoEDOuNWhUau7y5bnrdhvGOKaoer_Dg3VT8******0pIcw6-5Bjgg; _jc_save_fromDate=2023-01-24

    4. Host: kyfw.12306.cn

    5. ...

b、在12306首页中获取Post类型接口

图片

例如上面的接口,我们可以得到的信息如下:

  1. 请求 URL: https://kyfw.12306.cn/otn/logsdk/getInfo

  2. 请求方法: POST

  3. 请求头

    1. ...

    2. Connection: keep-alive

    3. Content-Type: text/plain;charset=UTF-8

    4. Host: kyfw.12306.cn

    5. ...

POST接口请求参数可在负载中进行查看(Chrome则在载荷中进行查看,不同浏览器查看tab标签名称不一致)

图片

2、配置接口请求

a、添加线程组

图片

图片

b、添加HTTP请求

图片

图片

填充Get接口请求信息

图片

填充Post接口请求信息

图片

c、添加HTTP信息头管理器

图片

图片

维护接口请求头信息

图片

d、添加观察结果树

图片

图片

3、进行接口测试

a、执行接口请求

图片

b、查看接口返回信息

图片

4、进行接口返回信息验证

JMeter以及Postman等接口测试工具,他们都是基于协议进行工作的,使用这些工具进行发送请求,当请求发送成功的时候(即协议发送成功),在查看结果树中请求样本显示绿色。比如协议状态码是200就是成功,也是仅仅代表协议发送成功,但是业务不一定成功。有可能是协议发送成功了,但是业务没有成功,但是JMeter默认不做判断。

图片

那么想要校验业务成功还是失败,就得需要进行断言,断言根据接口的响应进行断言,一般主要断言业务状态码以及messege等信息。

a、添加响应断言,并设置要校验的字段信息

图片

图片

b、添加JSON断言,并设置要校验的字段信息

图片

c、添加断言结果

图片

d、查看验证返回信息

     断言结果中只会展示错误的断言信息

    若请求的接口正常返回值,且返回信息中的字段断言信息符合期望值,则不会展示断言信息

图片

    若请求的接口返回信息中的字段断言信息有误,断言结果中会输出对应的验证结果信息

图片

查看结果树中也可在对应的接口请求下查看错误的断言信息

图片

5、Jmeter也支持文件上传/下载接口测试

这部分我们后续单独进行介绍(挖坑)

图片

6、常见的接口依赖、接口公共参数配置、参数化等,在另外的章节中展开介绍(持续挖坑...)

三、Jmeter并发测试

上面我们简单介绍了Jmeter如何进行接口测试的,下面我们更进一步,在接口功能测试完善的基础上,开展接口的另外一个层面的性能测试工作。

线程组设置

图片

图片

线程组概念

    通俗的讲,一个线程组可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户。

    多个用户同时去执行相同的一批次任务。每个线程之间都是隔离的,互不影响的。

    一个线程的执行过程中,操作的变量,不会影响其他线程的变量值。

线程数:

线程数也就是并发数,每个线程将会完全独立的运行测试计划,互不干扰。多个线程用于模仿对服务器的并发访问。

设置ramp-up:

ramp-up 用于设置启动所有线程所需要的时间。(有人称之为启动时间,有人说是准备时长,看个人喜好)

如果选择了10个线程,并且ramp-up 是100秒,那么JMeter将在100秒内使10个线程启动并运行。

每个线程将在前一个线程启动后10(100/10)秒后启动。

当这个值设置的很小、线程数又设置的很大时,在刚开始执行时会对服务器产生很大的负荷。

设置循环次数:

该项设置线程组在结束前每个线程循环的次数,如果次数设置为1,那么JMeter在停止前只执行测试计划一次。

假设

线程数:n

Ramp-Up:T

循环次数:a  

若每个循环运行时间是 t

当时间到 S = (T- T/n)时,最后一个线程启动,若要使所有线程同时运作,则需要在最后一个线程启动的时候第一个线程仍未关闭,为达到这个要求,需满足 a·t > S及a > S/t

每一个线程运行时间既是R = a·t(此处的a是大于S/t的某一值),则第一个线程在时间点为R 的时候停止,整个测试理论运行时间则是 :S + R = (1-1/n)·T + a·t

总结:

    测试中变量是 线程数 n ,每个循环时间 t 是个实践值,循环次数 a 只是为了延长单个线程的运行时间,从而保证当最后一个线程启动时,所有线程都在运行中,达到压测效果。

举个大栗子:

模拟50个用户,每人在抢票时不停的刷新了100次页面查看余票信息

1、设置线程数为50 ,我们的并发用户量就是50个用户同时登录

图片

2、添加定时器(同步定时器(Synchronizing Timer)-->用来设置集合点,其作用是:阻塞线程,直到指定的线程数量到达后,再一起释放,可以瞬间产生很大的压力

图片

3、设置集合点,当用户数量达到20个的时候再同时请求进行登录操作

图片

(1)模拟用户的数量:即指定同时释放的线程数数量,若设置为0,等于设置为线程组中的线程数量;

(2)超时时间:即超时多少毫秒后同时释放指定的线程数;如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。如果大于0,那么如果超过超时时间中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。

4、添加聚合报告

图片

5、执行脚本

图片

6、查看压测结果

聚合报告即压测过程结束时对每次请求及对整体请求的一次总结报告

图片

聚合报告中参数释意

Label:HTTP Request name属性值。

样本:测试的过程中一共发出了多少个请求即总线程数,(如果模拟50个用户,每个用户迭代100次,这里就显示5000),对应图形报表中的样本数目。

平均值:单个Request的平均响应时间,计算方法是总运行时间除以发送到服务器的总请求数,对应图形报表中的平均值。

中位数:50%用户的响应时间。

90%百分数:90%用户的响应时间。

最小值:服务器响应的最短时间。

最大值:服务器响应的最长时间。

异常%:本次测试中出错率,请求的数量/请求的总数。

吞吐量:默认情况下表示每秒完成的请求数。

接受KB/Sec:每秒从服务器接收到的数据量,即每秒钟请求的字节数,时间单位均为ms。

7、其他结果展示元件

a、响应时间图

图片

b、图形结果

图片

总结

      在本篇中,我们对JMeter工具作了简单的介绍,且分别从接口测试以及接口并发测试的层面进行了图文介绍。

    对于接口性能测试方面,应当还涉及到相应的服务器性能监控,以及性能监控时需要观测的性能点,

    尤其是在开展性能测试之前需要进行性能测试的需求分析、制定测试计划、编写和调试测试脚本、收集测试结果、分析测试数据整合性能测试报告,诸多流程中涉及到很多细节,

    都是我们需要去通过不断地学习和实践的。

 这是我整理的《2024最新jmeter接口测试和jmeter接口自动化测试全套教程附带性能测试》,以及配套的接口文档/项目实战【网盘资源】,需要的朋友可以下方视频的置顶评论获取。肯定会给你带来帮助和方向。

b站最新最全的jmeter接口测试和jmeter接口自动化测试,jmeter性能测试保姆级全套教程!

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

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

相关文章

【c++】 C语言的输入与输出C++的IO流STL空间配置器

主页:醋溜马桶圈-CSDN博客 专栏:c_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.C语言的输入与输出 2.流是什么 3.CIO流 3.1 C标准IO流 3.2 C文件IO流 4.stringstream的简单介绍 5.什么是空间配置器 6.为什么需要…

RAG系统优化思路

图片来源:https://huggingface.co/learn/cookbook/zh-CN/rag_evaluation 该图展示了可以从哪些部分去优化RAG。 先摘录一些比较好的思路: https://zhuanlan.zhihu.com/p/681421145 https://www.zhihu.com/question/643138720/answer/3495870046 http…

Spring-data-redis

一、spring-data-redis 介绍 spring-data-jpa spring-data-jdbc spring-data-redis 说明: 在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要…

vue前后端交互学习问题记录2

1.在使用定时任务时报如下错误:No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration. 看报错是ThreadContext未绑定Secur…

Java调用Python的简单运用

这里提供两种调用方法: 1、通过Jython来实现Java调用Python (目前只支持Python2) 2、通过ProcessBuilder来实现Java执行Python脚本(既支持Python2也支持Python3) 通过Jython来实现Java调用Python Jython目前只支持Python2 一、准备好Pytho…

如何高效记录并整理编程学习笔记

目录 1.概述 1.1. 选择合适的工具 1.2. 分类整理 1.3. 制定标准格式 1.4. 定期复习和更新 1.5. 利用图形和视觉辅助 1.6. 记录问题和解决过程 1.7. 使用版本控制 1.8. 与他人分享和讨论 2.笔记工具选择 2.1. 印象笔记 2.2. 语雀 2.3. 有道云笔记 2.4. 腾讯文档 …

基于Spring Boot的企业员工薪酬关系系统的设计

TOC springboot229基于Spring Boot的企业员工薪酬关系系统的设计 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性&#…

Spring好坑!为什么代理对象的属性没有值?

先看代码: Service Transactional public class ZhouyuService {private String name "zhouyu";public final void test() {System.out.println(name);} }关键点: 加了Transactional,所以ZhouyuService会生成代理对象作为Bean对…

HAProxy理论+实验

目录 一、基于cookie的会话保持 1、配置选项 2、配置示例 3、验证cookie信息 二、IP透传 1、layer4 与 layer7 (1)四层:IPPORT转发 (2)七层:协议内容交换 三、haproxy的ACL应用 1、ACL配置选项 (1&#xf…

应用案例:劳易测传感器助力宝马集团莱比锡工厂锂电池生产

位于德国萨克森州的宝马集团莱比锡工厂,是全球领先的汽车制造基地之一,不仅生产燃油车,也致力于电动汽车的生产。随着电动汽车及混合动力车辆的普及,锂电池的需求日益增长,宝马集团在莱比锡工厂内部设立了锂电池生产线…

Python之简单了解pylab绘图工具和汇编语言

《Python入门经典以解决计算问题为导向的Python编程实践》89-93页的笔记。 用pylab对数据绘图最小的通用计算 用pylab对数据绘图 PyLab是Matplotlib面向对象绘图库的过程界面。Matplotlib是整个软件包; matplotlib.pyplot是Matplotlib中的一个模块;而P…

能够清理浮毛的宠物空气净化器哪家好用?希喂、安德迈测评分享

虽然已经立秋了,但是现在这个天气还是很热,尤其是还处在南方城市就更加了,天气热空气中的水含量还高,这就代表着即使下雨天能降温但身体还是会有黏黏的感觉。家里养有猫和狗,大汗淋漓的到家,一进门就被我家…

17位著名妈妈和女儿在电影中合作 包括斯特里普、黛米摩尔、安吉丽娜朱莉等

好莱坞母女二人组正在占领大银幕。如今,你不会只在头条新闻中看到她们的名字。这些强大的女性正在联手,创造电影奇迹,并为她们家喻户晓的名字增添更多的明星影响力。 虽然像戈尔迪霍恩和凯特哈德森这样的母女组合更喜欢分开工作,…

Python进阶之3D图形

Python进阶之3D图形 在数据可视化中,2D图形通常可以满足大多数需求。然而,对于一些复杂的数据或分析,3D图形可以提供更多的视角和洞察。在Python中,使用 Matplotlib 和 Plotly 等库可以轻松创建各种3D图形。本文将介绍如何使用这…

C++第一讲:开篇

C第一讲:开篇 1.C历史背景1.1C创世主--本贾尼1.2C版本更新1.3C的重要性1.4C书籍推荐 2.C的第一个程序3.命名空间3.1namespace是什么3.2namespace的使用3.3namespace使用注意事项3.4命名空间的使用 4.C输入和输出5.缺省参数6.函数重载7.引用7.1什么是引用7.2引用的定…

点餐系统软件源码入门教程:从零开始构建你的餐饮系统

随着餐饮行业的数字化转型,点餐系统已经成为餐厅运营不可或缺的一部分。无论是新手开发者还是有经验的程序员,学习如何从零开始构建一个点餐系统,都是一项具有挑战性但又非常有意义的任务。本文将带你逐步了解如何使用基本的技术和代码&#…

E. Lucky Queries

https://codeforces.com/contest/145/problem/E 元素值只有4,7转换成01序列,操作一区间反转,操作二询问类LIS 我们先考虑操作二 应该维护什么量呢 线段树维护量,是通过左子树和右子树的信息合并来维护的 大致有两种情况 可以发现可以通过Leftcnt0Righ…

45.跳跃游戏

:双层for。复杂度n*n n class Solution {public int jump(int[] nums) {// 找到所有的条约方法,返回其中的最小次数// 从后向前,依次记录到最后的次数int n nums.length;if(n 1) return 0;// int[] temp new int[n];// temp[n-1] 0;fo…

Redis远程字典服务器(5) —— hash类型详解

目录 一,hash基本情况 二,hash常用命令详解 2.1 hset,hget,hexists,hdel 2.2 hexists,hdel 2.3 hkeys,hvals 2.4 hgetall,hmget 2.5 hlen,hsetnx 2.6 hincrby&am…

Android逆向题解 攻防世界难度4- Android2.0

Jeb打开apk 关键代码在Native函数getResult IDA 打开 so 发现代码比较简单,可以直接静态分析。 输出字符串也就是flag 长度是15,然后分成三段,第一段是可以整除3,第二段是除3取余1,第三段是除3取余等于2&#xff1…