Jmeter入门

news2024/10/7 6:49:06

性能测试:模拟多个用户的操作对服务器硬件性能的影响
TPS:Transaction per Second,每秒事务处理能力
RT:Response Time,响应时间

安装

由于本人只有window系统,故只讲解win下的安装

安装JDK

下载地址:https://www.oracle.com/java/technologies/downloads/archive/#JavaSE
根据系统选择安装包
在这里插入图片描述

在这里插入图片描述
下载成功后,直接双击,一直下一步即可,安装好之后,配置环境变量
JAVA_HOME:jdk安装路径
PATH:%JAVA_HOME%\bin
在这里插入图片描述
配置好之后,打开cmd,输入:java -version
能正常打印java版本,表示安装完成
在这里插入图片描述

安装Jmeter

下载地址:https://jmeter.apache.org/download_jmeter.cgi
在这里插入图片描述
下载后,解压缩即可

简单示例

在Jmeter解压缩的bin目录下,找到jmeter的windows批处理文件,双击,会打开一个cmd窗口(不要关)和Jmeter界面
在这里插入图片描述
在这里插入图片描述
先来一个比较简单的示范:

配置Thread Group

界面默认展示一个Test Plan,在测试计划下添加一个线程组。JMeter是由Java实现的,并且使用一个线程来模拟一个用户,所以线程组(Thread Group)可以理解为一组用户
操作路径:右键 Test Plan > Add > Threads(Users) > Thread Group
在这里插入图片描述
在这里插入图片描述

在Thread Group中,重点关注线程属性Thread Properties:

Number of Threads(users):线程数,也可理解为虚拟用户数,默认为1;
Ramp-up period(seconds):启动所有线程的时间。如果Ramp-up period设置为T秒,线程数Number of Threads为N个,则Jemeter将每隔T/N秒建立一个线程;比如线程数为10,线程时间为100,则表示要在100秒内启动并运行10个线程,每个线程会在上一个线程启动后10秒(100秒/10个)启动;为0时表示并发
Loop Count:循环次数,每个线程执行的次数。比如线程数Number of Threads为10,Loop Count为3,则表示每个线程都要执行3次,即共发送10*3个请求。如果选中了“Infinite”(永远),则除非强制停止,否则会一直循环执行。

Jmeter创建线程数量除了受Number of Threads和Ramp-up period影响外,还受本地设备性能的影响,比如本地只能1秒启动10个线程,而我们如果设置了1秒启动20个线程,设备做不到,就只能延迟创建了,而且如果设置的太大,Jmeter判断内存无法在规定时间内启动符合预期的线程数,就会直接报错。

配置HTTP Request和View Results Tree

确定好用户执行情况后,就需要安排用户的执行内容:
Jmeter用来测试服务器性能,服务器一般是提供接口来提供数据,所以以https的请求作为例子进行讲解:
接口信息:

请求方式:Get
URL:https://httpbin.org/get
说明:该接口的响应报文默认返回请求报文的请求头、URL、请求的IP和上传的参数,上传的参数存放在键为args下

在这里插入图片描述

添加HTTP Request组件路径:右键 Thread Group> Add > Sampler > HTTP Request
在这里插入图片描述
在这里插入图片描述
HTTP Request配置OK后,即可运行
在这里插入图片描述
运行时可能会让你保存,点击保存即可,点击绿色三角形后,会置灰不可点,执行完后会恢复为绿色,旁边的STOP按钮在执行时会显示红色,执行完成再恢复成灰色

执行后,并没有看到什么执行结果或日志之类的,是因为刚安装的JMeter还没设置,我们可以先打开日志查看执行进度
操作路径:Options > Log Viewer,将Log Viewer勾选
在这里插入图片描述
Log Viewer勾选后,在主界面的右下方会有个窗口打印日志
在这里插入图片描述
日志只能查看执行进度,无法查看执行情况,如果确实想查看执行结果,需要配置监听器View Results Tree
操作路径:右击Thread Group > Add > Listener > View Results Tree
在这里插入图片描述
添加View Results Tree成功后,再次执行(点击绿色三角形),执行完成后,可以在View Results Tree组件查看执行结果
在这里插入图片描述
如果请求执行和校验(校验的部分在章节后面)没有异常,则会绿色图标显示,如果有异常,则红色图标显示。从红框中可以看出,一共发送了6次请求(线程组设置了Number of Threads为3,Loop Count为2,所以请求次数总数为3*2=6),点击相关的请求,可以查看请求数据和响应数据

配置Response Assertion和Assetion Results

虽然从View Results Tree可以看到请求执行成功了,但是无法确定响应报文是否符合预期的,所以如果要校验数据是否符合预期,可以配置断言组件,本示例简单处理,配置响应报文断言组件Response Assertion,对响应报文中的age和name进行校验
操作路径:右击 Http Request(该例子中的httpbin测试) > Add > Assertions > Response Assertion
在这里插入图片描述
在这里插入图片描述
关于部分字段介绍:

  • Apply to:默认Main Sample only,主要的取样器,一般很少改
  • Field to Test:默认Text Response,即根据响应报文去断言,其他的有Response Code响应码、Response Message响应消息(比如OK)、Response Headers响应头
  • Pattern Matching Rules:模式匹配规则
    • Contains:如果被校验内容包含给定的正则表达式模式或字符串,则为true
    • Matches:如果整个被校验内容匹配给定的正则表达式模式,则为true
    • Equals:如果整个被校验内容等于给定的正则表达式模式,则为true
    • Substring:如果被校验内容包含给定的字符串,则为true
    • Not:匹配非给定模式
    • Or:或,对Patterns to Test的内容进行“或”运算

Field to Test选择Text Response,Pattern Matching Rules选择Substring,Patterns to Test输入要匹配的字符串,配置好响应报文断言后,还需要配置Assetion Results来查看断言结果
操作路径:右击 Thread Group > Add > Listener > Assetion Results
在这里插入图片描述
添加成功后,再次执行线程组内容,执行结果如下图,如果断言成功,则Assetion Results的请求数据展示中,右侧界面为空
在这里插入图片描述

如果断言失败,则Assetion Results的请求数据展示中,右侧界面展示失败描述
为了模拟断言失败的情况,将Response Assertion的Patterns to Test第一个改成:"age": "19"
执行线程组,查看Assetion Results
在这里插入图片描述
在界面右侧展示校验失败的具体情况
在这里插入图片描述

配置User Defined Variables

配置HTTP Request和View Results Tree配置Response Assertion和Assetion Results 章节中我们可以看到,响应报文中的age和name是跟请求参数保持一致的,如果我们修改了请求参数,则响应报文的字段校验也需要同步修改,为了解决这个问题,我们需要定义用户变量,HTTP Request组件和Response Assertion使用用户变量,这样需要修改参数的时候,只需要修改用户变量对应的值
User Defined Variables 可以在Thread Group或Http Request下添加
操作路径:右键 Thread Group或Http Request > Add > Config Elemen > User Defined Variables
在这里插入图片描述
添加后,配置变量,点击窗口下方的 Add 按钮,name一列输入变量名称,Value列输入对应变量的值,可以在Description列对变量的使用进行说明
在这里插入图片描述
User Defined Variables配置变量完成后,在相关位置使用变量,本示例只有HTTP Request和Response Assertion这2个地方需要用到,故只需修改这2个组件对应内容,变量的使用格式为:${变量名}
在这里插入图片描述
在这里插入图片描述
执行后,查看结果:
从Assetion Results的结果来看,校验失败了,并没有包含"name": "温小八"这个字符串,所以我们先去查看响应报文是不是没有包含
在这里插入图片描述
从View Results Tree的Response data中,可以看到,name字段并不是显示"温小八",而是Unicode字符串(\u开头就是Unicode编码字符串),将"\u6e29\u5c0f\u516b"转成中文,即为“温小八”
在这里插入图片描述

在这里插入图片描述
响应报文是被测服务器(即接口)返回的,要对响应报文的Unicode字符串做处理,我们可以添加后置处理器,专门对响应报文中的Unicode进行处理进行处理
操作路径:右键 Thread Group > Add > Post Processors > BeanShell PostProcessor
在这里插入图片描述
在这里插入图片描述

BeanShell PostProcessor的脚本内容如下:

String s = new String(prev.getResponseData(), "ISO-8859-1");// ISO-8859-1是Jmeter默认的编码,需要保持跟Jmeter安装目录下bin\jmeter.properties文件中的sampleresult.default.encoding的值一致
char aChar;
int len = s.length();
StringBuffer outBuffer = new StringBuffer(len);
for (int x = 0; x < len;) {
    aChar = s.charAt(x++);
    if (aChar == '\\') {
        aChar = s.charAt(x++);
        if (aChar == 'u') {
            int value = 0;
            for (int i = 0; i < 4; i++) {
                aChar = s.charAt(x++);
                switch (aChar) {
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                        value = (value << 4) + aChar - '0';
                        break;
                    case 'a':
                    case 'b':
                    case 'c':
                    case 'd':
                    case 'e':
                    case 'f':
                        value = (value << 4) + 10 + aChar - 'a';
                        break;
                    case 'A':
                    case 'B':
                    case 'C':
                    case 'D':
                    case 'E':
                    case 'F':
                        value = (value << 4) + 10 + aChar - 'A';
                        break;
                    default:
                        throw new IllegalArgumentException(
                            "Malformed   \\uxxxx  encoding.");
                }
            }
            outBuffer.append((char) value);
        } else {
            if (aChar == 't')
                aChar = '\t';
            else if (aChar == 'r')
                aChar = '\r';
            else if (aChar == 'n')
                aChar = '\n';
            else if (aChar == 'f')
                aChar = '\f';
            outBuffer.append(aChar);
        }
    } else
        outBuffer.append(aChar);
}
prev.setResponseData(outBuffer.toString());

再次执行,校验成功
在这里插入图片描述
在View Results Tree的Response data中也可以看到,响应报文中的Unicode字符串被处理成了中文
在这里插入图片描述
中文处理问题,参考了该篇博客:JMeter中响应数据Unicode编码转换成中文

关联

在测试过程中,我们经常会遇到说后续的请求跟前一个请求的响应报文内容有关的,比如想要取消关注,则需要先登录、关注了,才能取消关注,即后面的请求依赖于前一个请求。

以下以深圳图书馆搜索图书为例,想要获取某本书的具体信息,需要先根据书名进行搜索,然后再进入书的详情页面:

  • 搜索图书:https://www.szlib.org.cn/opac/

    • 对应接口:https://szlib.org.cn/api/opacservice/getQueryResult?v_index=title&v_value=${书名}+&library=all&v_tablearray=bibliosm,serbibm,apabibibm,mmbibm,&sortfield=ptitle&sorttype=desc&pageNum=1&v_page=1
    • 说明:从接口中分析,v_value为对应的搜索内容
  • 书本详情页面:https://szlib.org.cn/opac/searchDetail?tablename=bibliosm&recordid=686065

    • 对应接口:https://szlib.org.cn/api/opacservice/getBookDetail?metaTable=bibliosm&metaId=${recordid}
    • 说明:接口中的${recordid}为搜索页面接口响应报文中的recordid字段的值

分析了下,我们可以根据书名模糊搜索对应书本,获取响应报文里的recordid字段,然后书本详情页面接口中,recordid内容赋值给metaId参数并上传,获取书本详情信息。

所以先配置搜索图书的请求:
在这里插入图片描述
在这里插入图片描述
请求执行正常,由于是从搜索页面的响应报文获取数据,所以需要在搜索图书请求中增加提取器(Extractor)
在这里插入图片描述
响应报文是Json字符串,所以选择了了JSON Extractor提取器
在这里插入图片描述
在这里插入图片描述
JSON Path expression的语法如下:

符号描述
$根节点
@当前节点
.or[]子节点
所有符合条件的节点
*所有节点
[]迭代器标示,如数组下标
[,]支持迭代器做多选
[start:end :step]数组切片运算符
?()过滤
()表达式计算

书本详情页面的HTTP Request组件配置如下:
在这里插入图片描述
执行结果如下图:
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

2023年最热门的网络安全岗位分析

大数据、人工智能、云计算、物联网、5G等新兴技术的高速发展&#xff0c;蒸蒸日上。但是随之也出现了许多问题&#xff0c;比如&#xff1a;政府单位、企业、个人信息泄露&#xff0c;网络安全问题日益严峻&#xff0c;网络空间安全建设刻不容缓。 网络安全人才需求量巨大&…

双核驱动,合力共进,郁锦香与凯里亚德酒店强强联合释放多元化商业价值

近日&#xff0c;以“清风雅茗 亨嘉之会”为主题的2022锦江酒店&#xff08;中国区&#xff09;厦门站品牌投资品鉴会圆满落幕&#xff0c;众多投资人和酒店品牌方负责人齐聚一堂&#xff0c;在充满文艺气息的滨海城市厦门&#xff0c;感受精致、愉悦的慢生活。在品牌见面环节&…

NodeJs实战-Express构建照片存储网站(1)-ejs视图引擎填充数据

ejs视图引擎填充数据express 生成项目安装 express-generator生成项目程序结构理解项目结构生成的文件的含义视图渲染填充照片数据增加路由器修改 app.js修改 routes增加对应的视图页面路由器 res.render 查找视图逻辑新增文件之后的项目结构图效果图项目地址express 生成项目 …

kali Linux常用快捷键及vim的基本使用

kali Linux 系统快捷键 Ctrl Alt T &#xff1a;打开一个新的命令行终端。 如果是在桌面打开的是这种情况 Ctrl C 复制。 Ctrl Z 撤消。 Ctrl S &#xff1a;保存 Ctrl Q &#xff1a;退出。 终端快捷键 TAB &#xff1a;补全命令。 Ctrl &#xff1a;放大文字…

Netty系列(一):Springboot整合Netty,自定义协议实现

Netty是由JBOSS提供的一个java开源框架&#xff0c;现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说&#xff0c;Netty 是一个基于NIO的客户、服务器端的编程框架&…

目标检测论文解读复现之十六:基于改进YOLOv5的小目标检测算法

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Java项目使用intellij-IDEA查看依赖包版本是否有冲突(方法及工具)

编译器及版本idea-ultimate依赖管理工具maven 第一个是idea本身的 Step1&#xff1a;点击右侧的maven Step2&#xff1a;右键依赖项&#xff0c;点击分析依赖关系 Step3&#xff1a;可以在模块名位置进行切换&#xff0c;左侧三角的标志则表示该包引入了多个版本&#xff…

【云原生】Docker网络原理及Cgroup硬件资源占用控制

内容预知 1.dockers的网络模式 获取容器的进程号 docker网络模式的特性 1.1 host主机模式 1.2 container模式 1.3 none模式 1.4 bridge 桥接模式 1.5 容器的自定义网络 &#xff08;1&#xff09;未创建自定义网络时&#xff0c;创建指定IP容器的测试 &#xff08;2&a…

双坐标轴柱状图

双坐标轴柱状图 setwd(“H:/分析评价 20220531/6-分析过程”) #设置工作路径 library(xlsx)#加载excel文件包 #---------------------------------------------------------------------------------------------------------- tiff(file“1-占比.tiff”,res600,width6000,hei…

负载均衡有哪些?

目录 【一】前言 【二】负载均衡分类 2.1 DNS 2.2 硬件负载均衡 2.3 软件负载均衡 2.4 组合负载均衡 【三】负载均衡算法 3.1 负载均衡算法分类 3.2 轮询 3.3 加权轮询 3.4 负载最低优先 3.5 性能最优类 3.6 Hash 【四】总结 【一】前言 在互联网尤其是移动互联…

【前沿技术RPA】 一文了解UiPath的项目活动设置

&#x1f40b;作者简介&#xff1a;博主是一位.Net开发者&#xff0c;同时也是RPA和低代码平台的践行者。 &#x1f42c;个人主页&#xff1a;会敲键盘的肘子 &#x1f430;系列专栏&#xff1a;UiPath &#x1f980;专栏简介&#xff1a;UiPath在传统的RPA&#xff08;Robotic…

【计算机组成原理Note】5.2 指令周期的数据流

5.2 指令周期的数据流 5.2.1 指令周期 指令周期&#xff1a;CPU从主存中每取出并执行一条指令所需的全部时间。 指令周期&#xff1a;常常用若干机器周期来表示&#xff0c;机器周期又叫CPU周期。 一个机器周期又包含若干时钟周期(也称为节拍、T周期或CPU时钟周期&#xff…

SpringCloud微服务(十一)——Sentinel服务熔断限流

SpringCloud Alibaba Sentinel服务熔断与限流 简介 github&#xff1a;[https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5](https://github.com/alibaba/Sentinel/wiki/如何使用) 官网&#xff1a;https://spring-cloud-alibaba-group.github.io/github-pages/…

为什么追踪员工的时间和出勤率很重要

监控员工的出勤时间和出勤率对于提高业务绩效和生产力至关重要。实施有效计时策略的组织可以帮助员工跟上项目目标和截止日期&#xff0c;提高客户满意度&#xff0c;并加强对员工产出的整体意识。所以每个企业组织都应该掌握员工出勤时间和出勤数据。 为什么要掌握员工出勤时…

阿里架构师耗时 1 年,把 P8 所需要的整个 Java 体系,都整理到了一起

有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西…… 透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30 岁之后就要面临被优化的危险…… 想跳槽&#xff0c;但是更高的平台难…

微信小程序怎么弄?【小程序制作】

微信小程序怎么弄&#xff1f;很多人都会想弄一个微信小程序&#xff0c;因为微信小程序这个轻应用现在的使用频率已经赶上微信了&#xff0c;有如此大的用户群体&#xff0c;企业和商家当然都想在这个庞大流量池里分一杯羹。那么微信小程序怎么弄呢&#xff1f;下面一起来看看…

群签名、环签名、盲签名

文章目录群签名定义安全性构造环签名定义安全性构造盲签名定义安全性构造群签名 定义 群签名方案是算法组 ΠGS(Gen,Sign,Ver,Open)\Pi_{GS}(Gen, Sign, Ver, Open)ΠGS​(Gen,Sign,Ver,Open)&#xff0c; Gen(1λ,n)Gen(1^\lambda,n)Gen(1λ,n)&#xff1a;密钥生成算法&…

百度Q3财报显AI技术厚度,“慢生意”稳步驶入“快车道”

一周前&#xff0c;笔者参加了一场百度主办的关于AIGC话题的沙龙&#xff0c;因为话题无比火爆&#xff0c;活动延迟到了一点钟才结束&#xff0c;以至于让约定的好友饭局也一等再等。 倒没有丝毫抱怨的意思&#xff0c;正是这个烧脑的活动&#xff0c;让我感受并体验到了当下最…

GEE开发之Modis_LAI数据分析和获取

GEE开发之Modis_LAI数据分析和获取1.遥感卫星数据叶面积指数LAI2.MOD15A2H(500m/8天)2.1 MOD15A2H下的指数2.2 LAI遥感影像查看获取3.LAI日数据下载4.LAI月数据下载5.LAI年数据下载前言&#xff1a;主要介绍LAI的概念&#xff0c;以及GEE下如何获取查看Modis下的LAI指数&#x…

Talk | 清华大学陈晓宇苏黎世联邦理工黄嘉伟 :基于实际应用的强化学习

本期为TechBeat人工智能社区第455期线上Talk&#xff01; 北京时间11月17日(周四)20:00&#xff0c;清华大学交叉信息研究院在读博士生——陈晓宇与苏黎世联邦理工大学计算机科学在读博士生——黄嘉伟的Talk将准时在TechBeat人工智能社区开播&#xff01; 他们与大家分享的主题…