5年经验之谈 —— 手把手教你接口性能测试之JMeter性能测试篇!

news/2024/5/18 21:45:35/文章来源:https://blog.csdn.net/m0_58026506/article/details/133998595

本文是我们手把手教你接口性能测试系列文章中的完结篇,介绍如何使用JMeter工具进行接口测试和并发测试。


一、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、添加观察结果树

图片

图片

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

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工具作了简单的介绍,且分别从接口测试以及接口并发测试的层面进行了图文介绍。

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

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

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

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

针对遗留系统采取的不同演化策略

1. 改造策略 高水平、高价值区,即遗留系统的技术含量较高,本身还有极大的生命力。系统具有较高的业务价值,基本上能够满足企业业务运作和决策支持的需要。这种系统可能建成的时间还很短,对这种遗留系统的演化策略为改造。改造包括…

考过PMP之后,要不要继续学CSPM?

在7年前拿下了PMP证书,但又在今年报名了CSPM中级的学习,身边很多人都疑问,为什么还要继续花钱考一个新出的证书?是不是闲的没事干?下面跟大家说下我的想法,仅作参考。 1)了解项目管理行业的新动…

如何制作自己的数字人

如何制作自己的数字人呢?不用担心平台的使用授权,也不用担心哪一天自己自媒体被号被无故封杀,那么SadTalker将是你的首选,他是完全开源的数字人软件,现已达到Apache2的授权,完全自由的开源软件。作者自己试…

二进制明文字符串加密:还原与反还原

背景 上一篇文章中介绍了xorstr的原理和最小化验证概念的代码,这篇文章来看下这种已经被广泛应用于各恶意样本以及安全组件中的技术如何还原,如果还没看上篇建议先看下了解其实现后再看本篇文章 xorstr的现状 随着相关技术的应用越来越广,…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持多实例自定义条件的流程流转

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 1、前端代码,主要修改下面这个文件,如下: 说明几点: 1.1 …

Python Opencv实践 - 车辆统计(2)检测线绘制,车辆数量计数和显示

针对我所使用的视频,对上一节的代码进行了修改,增加了更多参数。 Python Opencv实践 - 车辆统计(1)读取视频,移除背景,做预处理_亦枫Leonlew的博客-CSDN博客示例中的图像的腐蚀、膨胀和闭运算等需要根据具…

微机原理与接口技术-第七章输入输出接口

文章目录 I/O接口概述I/O接口的典型结构基本功能 I/O端口的编址独立编址统一编址 输入输出指令I/O寻址方式I/O数据传输量I/O保护 16位DOS应用程序DOS平台的源程序框架DOS功能调用 无条件传送和查询传送无条件传送三态缓冲器锁存器接口电路 查询传送查询输入端口查询输出端口 中…

err -110 while initial SD card failed enmmm否系解决方案

1.情况表述 之前把 sd卡从小容量换成了大容量 且运行正常 过了一两个月 发现启动失败 报错:mmc0: error -110 whilst initialising SD card 给出报错图片 2.相关解决方案 给出链接 讲的很有道理,但是 我在bash中没有找到对应内核的驱动文件 SD卡…

【JavaScript】JavaScript基础详解(文末送书)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

Java 线程池调度周期性任务“异常“探究

背景 在做性能监控需求的过程中,会存在很多监控任务需要定时执行。比如在卡顿监控的实现中,我们需要每50ms 执行一次主线程调用栈的任务,此时由于任务本身可能存在一些耗时,可能需要对任务下次调度的时间做一些调整,避…

有没有人声和背景音乐分离的神器?

做视频剪辑,二次创作的朋友,需要去除视频中的背景音乐,保留人声;或者去除人声,保留背景音乐。随着用户需求的增多,科技的发展,让我们能通过智能的人声分离软件来实现,下面就来看看如…

XPS的锂电池表征技巧-科学指南针

XPS作为一种表面表征手段,这是它一个很大的限制,同时也是它一个很大的优势,正所谓“其术专则其艺必精”。限于笔者专业背景,此次主要讲述XPS在锂离子电池中的应用。 而由于XPS测试是一种表面分析手段,故其在锂离子电池…

Qt中QFile、QByteArray QDataStream和QTextStream区别及示例

在Qt中,QFile、QByteArray、QDataStream和QTextStream是常用的文件和数据处理类。 主要功能和区别 QFile: QFile是用于读写文本和二进制文件以及资源的I/O设备。可以单独使用QFile,或者更方便地与QTextStream或QDataStream一起使用。 通常在…

最新2023版完美可用的聚合支付系统源码,全开源无后门,适合二开

最新2023版完美可用的聚合易支付系统源码,全开源无后门,真正安全可用。 更新日志: 1.新增微信公众号消息提醒功能 2.重构转账付款功能,支持通过插件扩展 3.商户后台新增代付功能 4.后台新增付款记录列表 5.支付宝插件新增预…

嵌入式养成计划-46----QT--简易版网络聊天室实现--QT如何连接数据库

一百一十九、简易版网络聊天室实现 119.1 QT实现连接TCP协议 119.1.1 基于TCP的通信流程 119.1.2 QT中实现服务器过程 使用QTcpServer实例化一个服务器对象设置监听状态,通过listen()函数,可以监听特定的主机,也可以监听所有客户端&#x…

C++23:多维视图(std::mdspan)

C23:多维视图(std::mdspan) 介绍 在 C23 中,std::mdspan 是一个非拥有的多维视图,用于表示连续对象序列。这个连续对象序列可以是一个简单的 C 数组、带有大小的指针、std::array、std::vector 或 std::string。 这…

外汇天眼:如何快速玩转外汇市场?这个技巧你必须知道!

在外汇市场中,决定交易成功与否的关键在于投资者的技能和知识扎不扎实,这对投资者获取利润至关重要。然而对于投资者来说,外汇交易市场又是一个复杂且多变的市场,要在外汇市场中获得成功并不容易,需要深入地了解、不断…

部署Vue项目到githubPage中

上传Vue项目到githubPage 例如: 看我发布的地址 前提条件 1. github上有一个仓库并且仓库下有两个分支(main 和 gh-pages) 1.1 main分支保存你的vue项目源码(react或者其他框架的都行) 1.2 gh-pages分支保存的是你项目打包之后的代码(如Vue项目打包完之后是个dist包,…

【Javascrpt】比较,逻辑运算符

目录 比较运算符 逻辑运算符 &&(与) ||(或) 两真(||左侧为真,||右侧为真) 两假(||左侧为假,右侧为假) 一真一假(||一侧为假,另一侧为…

数据集的特征提取

1、 特征提取 1.1、 将任意数据(如文本或图像)转换为可用于机器学习的数字特征 注:特征值化是为了计算机更好的去理解数据 字典特征提取(特征离散化)文本特征提取图像特征提取(深度学习将介绍) 2 特征提取API sklear…