Jmeter
Jmeter概述#
Jmerter简介
Apache Jmeter是Apache组织的开源项目,是一个纯Java桌面应用,用于压力测试和性能测试。它最初设计用于Web应用测试后来扩展到其他测试领域。
Jmeter功能
能够对HTTP和FTP服务器进行压力和性能测试,也可以对任何数据库进行同样的测试(通过JDBC)。
- 完全的可移植性和100%纯java。
- 完全Swing(java设计的GUI工具包)和轻量组建支持。
- 完全多线程框架允许通过多个线程并发取样和通过单独的线程组对不同的功能同时取样
- 精心的GUI设计允许快捷操作和更精确的计时
- 缓存和离线分析/回访测试结果
Jmeter接口测试
jmeter接口测试的简单操作包括做Http脚本编辑(发get/post请求,cookie设置、header设置,权限认证)、参数化、断言、关联和数据驱动等。
Jmeter初级实践#
Jmeter脚本编写一般分五个步骤:
- 添加线程组
- 添加http请求
- 在http请求中写入接入url、路径、请求方式和参数
- 添加查看结果树
- 调用接口、查看返回值
测试接口:
httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。
发送GET请求#
请求URL如下:
http://httpbin.org/get
在jmeter配置如下图所示:
在查看结果树选择Json path Tester 如下图所示可以看到返回结果:
发送POST请求#
请求URL如下:
http://httpbin.org/post
Jmeter配置如下图所示:
响应结果:
HTTP请求默认值#
Web服务器中的协议和服务器名称或IP这两个值是一样的,每次重复输入起始比较麻烦,英雌可以试用HTTP请求默认值来管理这样的公共配置数据。
添加步骤:线程组——添加——配置元件——HTTP请求默认值 然后进行如下配置, 并吧元件防止在请求前面。
经过请求默认值的配置后,后续我么年增加新的请求,如果这两项是一样的话则无需重复填入该值
断言设置#
断言设置步骤如图:
Jmeter可以针对每一个请求响应进行断言。常用断言模式匹配规则如下:
- 包括:响应内容包括需要匹配的内容即代表响应成功,支持正则表达式
- 匹配:效应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达式
- Equals:响应内容要完全等于匹配的内容才代表成功,大小写敏感,需要匹配的内容是字符串正则表达式
- Substring:返回结果包含指定结果的字串,但是不支持正则字符串
- 否:不进行匹配
测试:如下图所示,断言返回的字符串是否包含 “”httpbin.org/get“”
如果断言成功,结果树显示为绿色标志,失败则为红色标志,下图中将post请求故意断言失败:
参数设置#
Jmeter支持通过Query String Parameters 或者 Request body 请求体来传递数据
Query String Parameters#
如果希望在请求URL中添加参数,则可以在HTTP请求界面的Paeameters选项里面添加参数。该参数会通过Query String Parmeters方式传递给服务器,也就是在URL中传递参数。如下图所示设置参数:
Request body#
在Post请求中参数一般在body中传递,Jmeter也支持在body中传递数据。如传递Json格式的参数,在Body Data 编辑框输入参数,另外还需要指定参数的格式,因此需要添加HTTP信息头管理器。并在管理器里添加参数类型 Content-Type:appication/json 如下图所示:
变量#
Jmeter支持以下类型变量
- 用户自定义变量
- 函数生成变量
- BeanShell变量
- csv数据文件变量
用户自定义变量#
设置步骤:
Tips:
每次迭代更新一次:如果有多个用户/使用变量时勾选,如果不勾选,所有线程用的是同一个值,需要不同的线程用不同的值,需要勾选此选项
在请求时变量引用格式为:${heroname} 如下图所示:
请求数据:
函数生成变量#
Jmeter由许多内置的函数,可以生成随机数。
生成变量:
请求结果:
BeanShell变量#
什么是Bean Shell?
- Beanshell是一种完全符合java语法规范的脚本语言,并且由用由自己的一些语法和方法;
- Beanshell是一种松散类型的脚本语言(与JavaScript类似);
- Beanshell是用Java写成的,一个小型的、免费的、嵌入式的Java源代码解释器,具有对象脚本语言特性,非常精简;
- Beanshell实行标准Java语句和表达式,另外包括一些脚本命令和语法;
Jmeter有哪些BeanShell
- 定时器:BeanShell TIme
- 前置处理器:BeanShell PreProcessor
- 采样器:BeanShell Sampler
- 后置处理器:BeanShell Postprocessor
- 断言:BeanShell 断言
- 监听器:BeanShell Listener
Bean Shell 常用内置变量
Jmeter在它的BeanShell中内置了变量,用户可以通过这些变量与Jmeter进行交互,其中主要的变量及其使用方法如下:
vars - (JmeterVariables):操作Jmeter变量,这个变量试剂引用了Jmeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:
//定义Jmeter变量 var.put(String key,string value); //从Jmeter中获取变量 vars.get(String key);
BeanShell实践案例
1、创建一个Http请求,请求地址为:http://httpbin.org/get同时设置传递的参数为beanshell_user
2、创建BeanShell PreProcessor 变量设置如下所示:
3、变量已经生效
csv数据文件变量#
csv数据文件变量是指从外部csv文件读取数据来作为变量。
1、添加步骤:
2、创建csv文件
文件名:user_data.csv
文件内数据:leesin,6666
3、csv文件设置:
返回数据如下:
POST http://httpbin.org/post POST data: user=leesin&passwd=6666 [no cookies] Request Headers: Connection: keep-alive Content-Type: application/x-www-form-urlencoded Content-Length: 23 Host: httpbin.org User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_191)
csv参数化#
针对刚刚POST接口进行如下参数遍历测试:
接口如下:
http://httpbin.org/post
发送参数:user_data.csv
leesin,6666 zed,3333 jawen,rrrr
1、在之前的csv数据文件设置更改配置如下:此操作表示把所用数据读取一遍,且不重复
2、在请求名称后面加上变量可以方便我们后期擦好看数据遍历情况:
3、将线程组的数量更改,比如csv文件中有3组数据,线程数就更改为3。最后运行结果如下:
正则匹配#
在接口测试过程中经常需要接口之间关联调用,比如获取上一个接口的返回值,作为另一个接口的请求参数。此时就需要使用jmeter的正则表达式提取器,通过对响应的数据来提取指定的数据。的
操作案例
从请求Http-get的响应数据中匹配随机数num的值,然后创建请求get-num来引用num的作为请求参数
操作步骤
1、在函数助手中设置一个1-100的随机数,待会提取使用:
2、创建正则表达式提取器
3、配置正则表达式提取器
4、新建请求get-num,在新的请求中将http-get返回的数据作为传递参数:
此时发送请求,两个HTTP请求的请求数据是一样的
正则表达式配置表:
- 引用名称:请求要引用的变量名称,如填写result_num,则可用${result_num}引用它;
- 正则表达式:匹配需要的内容;
- 模板:用$num$引用起来,如果在正则表达式中有多个匹配数据,num表示匹配到的第几个值给变量。如:$1$表示匹配到的第1个值储存在变量中;
- 匹配数字:0代表随机取值,1代表取全部值;
- 缺省值:如果参数没有取得到值,那默认给一个值让他取;
案例中正则表达式说明:
- ()括起来的部分代表要提取的值;
- .匹配任何字符;
- +匹配一次或多次
- ?在找到的第一个匹配项后停止
相关资料:正则表达式教程
用例数据分离#
之前用例数据都是配置在Jmeter Http请求中,每次需要增加,修改用例都需要打开Jmeter重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦。那么我们就可以将用例的数据存放在csv文件中,然后通过csv文件配置来读取用例中的数据,执行测试。用例数据如下图所示:
用例名称变量含义:
- ${caseSeq}:用例编号
- ${apiType}:api类型
- ${apiSeq}:api版本号
- ${apiName}:api名称
- ${priority}:优先级
- ${url}:api路径
- ${methids}:请求方法
- ${parameter}:请求参数
- ${expectValue}:期望值,用于断言
案例演示:
1、新建一个线程组,命名:数据驱动
2、创建一个Http请求默认值,设置如下:
3、添加一个循环控制器,位置:线程组--添加--逻辑控制器--循环控制器。()循环控制器可以控制整个用例循环执行的次数)默认值是1根据用例数量修改为4.
4、在循环控制器节点系阿创建csv文件设置,配置内容如下:
5、创建一个if控制器,位置:线程组--添加--逻辑运算器--if控制器
if控制器的作用为根据不同条件执行不同的用例,例如这里根据不同的接口请求类型,分别创建了GET和POST控制器。
GET设置的条件语句如下:
"${methods}"=="GET" 其中${methods}表示引用csv的methods中的值
参数:
- interpret Condition as Variable Expression?:如果这项被选中,将不会使用js解析;条件表达式的值必须是true(忽略大小写),这里我们取消勾选状态
- Evaluate for all children:如果心中这一项,在每个子节点执行前都会计算表达式
Post条件语句设置为:“${methods}”=="POST"
6、创建GET请求类型用例如下:
用例名称格式:${caseSeq}_${apiSeq}_${apiName}
断言设置:
通过数据驱动当面临大量用例时其Jmeter设置和用例后期维护工作就会非常高效
Cookie设置#
HTTP Cookie 管理器
如果你有一个HTTP请求,其返回值结果包含一个cookie,那么使用Jmeter Cookie管理器会自动将该Cookie保存起来,而且以后所有对该网站的请求都是用同一个Cookie。每个Jmeter线程都有自己独立的“cookie保存区域”
案例实践:
发送两个请求,将第一个请求的cookie值保存,第二个请求进行复用
请求URL:http://httpbin.org/cookies/set
设置的cookie内容:hero/leesin
1、添加HTTP Cookie 管理器:
2、新增一个HTTP请求,名称为:set-cookie,方法为:GET,路径为:/cookies/set/hero/leesin
3、添加查看结果树,运行可以看到cookie数据
4,、新增一个HTTP请求,名称为:get-cookie,方法为:GET,路径为:/cookies,运行后可以看到get-cookie也包含的cookie数据
授权设置#
上一个学习Postman的文章中,使用过对各种授权协议的接口进行测试,在Jmeter中同样也支持对授权的接口进行测试。关于各个授权协议的内容请参考Postman内容中的介绍
Basic Auth#
案例实践:
接口:http://httpbin.org/basic-auth/{username}/{passwd}
用户名:hero
密码:leesin
1、新建http请求名称为:basic-auth
2、添加HTTP授权管理器,添加路径:选中请求--添加--配置元件--HTTP授权管理器
执行结果如下:
请求内容:
GET http://httpbin.org/basic-auth/hero/leesin GET data: [no cookies] Request Headers: Connection: keep-alive Host: httpbin.org User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_191) Authorization: Basic aGVybzpsZWVzaW4=
请求内容中带有授权信息Authorization:BasicaGVybzpsZWVzaW4=,而aGVybzpsZWVzaW4=这个数值就是将 “用户名:密码” 经过Base64编码后计算出来的。
Digest Auth#
案例实践:
接口:http://httpbin.org/digest-auth/{qop}/{username}/{passwd}
{qop}这个参数规定server支持保护方案。client能从列表中(auth,auth-int)选择一个。
- auth表示仅仅进行身份验证;
- auth-int表示进行验证外,另一些完整性保护;
用户名:hero
密码:leesin
测试报告#
批量执行完接口测试之后,我们需要查看测试报道,之前单个接口调试是通过 “查看结果树”来查看结果,但是当大批量执行接口测试后依旧这样查看坑定会很低效。
聚合报告#
聚合报告是一个比较精简的报告元件,可以查看每个接口的性能情况与执行结果。
添加路径:
运行结果:
各个参数含义如下:
- Label----每个请求的名称,比如HTTP请求等
- Samples----发给服务器的请求数量
- Average----单个请求的平均响应时间 毫秒ms
- Median----50%请求的响应时间 毫秒ms
- 90%Line----90%请求响应时间 毫秒ms
- 95%Line----95%请求响应时间 毫秒ms
- 99%Line----99%请求的响应时间 毫秒ms
- Min----最小的响应时间 毫秒ms
- Max----最大的响应时间 毫秒ms
- Error%----错误率=错误的请求的数量/请求的总数
- Throughput----吞吐量即表示每秒完成的请求数
- Received KB/sec----每秒从服务器端接收到的数据量
- Sent KB/sec----每秒从客户端发送的请求的数量
HTML报告#
工作中会碰到将测试报告以HTML附件的方式发送给各个项目成员,那么需要生成测试报告。Jmeter3.0以后引入了Dashboard Report,用于生成HTML页面格式图形化报告的扩展模块。
生成步骤:
打开cmd进入jmeter目录bin目录
执行命令:
jmeter -n -t C:\Users\ccl\Desktop\data_driver.jmx -l httpbin.jtl -e -o C:\Users\ccl\Desktop\report
命令参数:
- -n:以非GUI形式运行Jmeter
- -t:Jmeter脚本路径
- -l:result.jtl 运行结果保存路径(.jtl)此文件必须不存在
- -e:在脚本运行结束后生成html报告
- -o:用于存放html报告的目录,不加改参数默认生成到bin\report-output
生成的测试报告样式如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗