Jmeter使用介绍
文章目录
- 前言
- Jmeter简介
- 安装与配置
- JDK安装与配置
- JMeter安装与配置
- 打开JMeter
- 方式一
- 方式二
- 设置Jmeter语言为中文
- 方法一(仅一次性)
- 方法二(永久设置成中文)
- Jmeter文件常用目录
- 元件与组件
- 元件
- 组件
- 元件的作用域
- 元件的执行顺序
- 第一个案例
- 添加线程组
- 添加 HTTP 请求
- 添加查看结果树
- 响应结果乱码问题
- 线程组
- 并行与串行
- 线程组的分类
- 线程组参数详解
- HTTP请求
- HTTP请求参数详解
- 查看结果树
- HTTP信息头管理器
- HTTP Cookie管理器(HTTP Cookie Manager)
- 参数化
- 用户定义变量(全局变量)
- 用户参数
- CSV数据文件方式
- CSV数据文件设置参数详解
- 函数
- 计数器${__counter(,)}
- 断言
- 响应断言
- JSON断言
- 断言持续时间
- Jmeter关联
- 正则表达式提取器
- XPath提取器
- JSON提取器
- Jmeter属性
- Jmeter录制脚本(仅作介绍)
- Jmeter直连数据库
- 逻辑控制器
- 如果(if)控制器
- 循环控制器
- Foreach控制器
- 定时器
- 同步定时器
- 常数吞吐量定时器
- 固定定时器
- 参考目录
前言
阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
Jmeter简介
JMeter是一个纯Java编写的开源软件,主要用于进行接口测试和性能测试。它支持测试的应用/服务/协议包括Web (HTTP, HTTPS)、SOAP/REST Webservices、FTP、Database via JDBC等。我们最常使用的是HTTP和HTTPS协议。
安装与配置
JDK安装与配置
因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。请注意,Jmeter对于JDK的版本有一定的要求,可以在下文Jmeter下载地址中查看,一般要求Java 8+。关于JDK的安装与配置请各位自行资料,网上已有图片配合的详细安装教程。
JMeter安装与配置
下载地址:Apache JMeter - Download Apache JMeter
打开JMeter
注意:不管用使用哪一种方式打开,都会打开一个cmd窗口。如果关闭这个cmd窗口,打开的jmeter也会被关闭。
方式一
Jmeter下载后无需安装,解压后即可使用。解压后到其apache-jmeter/bin目录如下,双击jmeter.bat 即可以运行。
方式二
配置环境变量,利用cmd控制台打开Jmeter。有需求的朋友请自行上网查阅资料进行配置。
设置Jmeter语言为中文
虽然Jmeter自带的翻译并不准确,但由于网上大部分的博客以及学习资料都是中文语言的Jmeter。因此,建议将Jmeter设置为中文。
方法一(仅一次性)
方法二(永久设置成中文)
找到jmeter下的bin目录,打开jmeter.properties 文件
第三十七行,修改为language=zh_CN,并去掉前面的#。重新启动Jmeter即可
Jmeter文件常用目录
元件与组件
Jmeter进行接口测试和性能测试,并不是使用代码来实现。而是使用已经封装好的元件和组件进行操作。
元件
元件:多个具有类似功能的组件的容器(集合,类似于面向对象中的类)
Jmeter中的元件按功能分为这么多类,如上图所见。例如 取样器元件,其中的组件主要功能都是发送请求。
组件
组件:实现独立的某个功能(类似于方法)
例如,取样器中的组件都是用于发送请求的。但HTTP请求是用于发送HTTP请求的,JDBC Request组件是用于连接数据库 并进行发送请求的。
元件的作用域
如图,如果(if)控制器是HTTP请求2的父节点会对其起作用。注:如果(if)控制器属于逻辑控制器元件,HTTP请求属于取样器元件。
固定定时器是HTTP请求3的子节点,该定时器只对HTTP请求3起作用。
固定定时器1的父节点是线程组(并不是取样器),那么其作用域就是该线程组下的所有节点。
图中的例子仅供理解与学习,现实的脚本设计不会如此混乱。
元件的执行顺序
第一个案例
添加线程组
右键点击“测试计划” -> 添加 -> 线程(用户) -> 线程组,添加测试需要的线程组
添加 HTTP 请求
JMeter的HTTP请求是测试中常用的功能,用于模拟用户向服务器发送HTTP请求并获取响应。
右键点击线程组 -> 添加 -> 取样器 -> HTTP请求,添加一个HTTP请求
点击HTTP请求,输入请求所需信息 http://www.baidu.com/s?ie=utf-8&wd=jmeter 参考下图
添加查看结果树
JMeter 的结果查看树用于查看和分析HTTP请求的响应结果。
右键点击线程组 -> 添加 -> 监听器 -> 查看结果树,添加一个查看结果树
将查找下方的响应数据格式改为 HTML Source Formatted(自行指定响应数据的展现格式),点击上方的绿色三角按钮,运行http请求
运行结果如下
取样器结果
HTTP响应体内容为,搜索返回结果页面标题为“JMeter性能测试_百度搜索”,与之前设置的查询参数相吻合。
响应结果乱码问题
注:从此处开始介绍一些常用的元件和组件,其余没有提到的元件和组件可自行查阅资料和查看Jmeter自带文档学习
线程组
作用:控制JMeter将用于执行测试的线程数,也可以把一个线程理解为一个测试用户。
并行与串行
如上图可知,我们设置了三个线程组。且内部有不同的HTTP请求,从执行结果来看。HTTP请求发送顺序是随机的,并不是按照从上到下的顺序。因此,多个线程组默认是并行的。
点击测试计划,勾选独立运行每个线程组(例如在一个组运行结束后启动下一个),即可实现串行。
线程组的分类
即,Setup线程组会在其他所有线程组之前执行,Teardowm会在其他所有线程组之后执行。
线程组参数详解
HTTP请求
作用:向服务器发送HTTP和HTTPS请求
位置:选中线程组->右键->添加->取样器->HTTP请求
HTTP请求参数详解
注:如果要一次性添加多个参数,可以将参数的键值对复制到剪切板,点击窗口最下方的从剪切板添加按钮即可批量添加参数。
查看结果树
作用:查看HTTP请求的请求和响应结果
位置:选中测试计划/线程组->右键->添加->监听器->查看结果树
注:对于取样结果 尤其是响应数据 我们可以通过切换数据展现方式进行查看,例如图中默认的是Text方式,可以点击切换成想要的方式 例如HTML Json等格式
HTTP信息头管理器
作用:给HTTP请求添加请求头信息,信息头即请求头。
位置:点击HTTP请求->右键->添加->配置元件->HTTP信息头管理器
添加方式与HTTP请求的查询参数方式相同, 也是用键值对的方式表示。
HTTP Cookie管理器(HTTP Cookie Manager)
作用:如果你有一个 HTTP 请求,其返回结果里包含一个 cookie,那么 Cookie 管理器会自动将该 cookie 保存起来,而且以后所有的对该网站的请求都使用同一个 cookie
位置:右键 -> 添加 -> 配置元件 -> HTTP Cookie管理器
选项(Options)
(1)每次反复清除Cookies?:每次迭代时,都将 Cookies 清空
(2)Use Thread Group configuration to control cookie clearing:用户线程组去配置清空 Cookie
(3)Cookie 格式
standard:标准格式
standard-strict:严格格式
ignoreCookies:此规格忽略所有 Cookie。被用来防止 HttpClient 接受和发送的 Cookie
netscape:是最原始的 Cookies 规范,同时也是 RFC2109 的基础。尽管如此,还是在很多重要的方面与 RFC2109 不同,可能需要特定服务器才可以兼容
default:默认
rfc2109:是 HttpClient 使用的默认 Cookies 协议
rfc2965:定义了版本2并且尝试去弥补在版本1中 Cookie 的 rfc2109 标准的缺点。规定 rfc2965 最终取代 rfc2109 发送 rfc2965 标准 Cookies 的服务端,将会使用 Set-Cookie2 header 添加到 Set-Cookie Header 信心中,rfc2965 Cookies 是区分端口的
compatibility:推荐选择此种策略。这种兼容性设计要求是适应尽可能多的不同的服务器,尽管不是完全按照标准来实现的。如果你遇到了解析 Cookies 的问题,你就可能要用到这一个规范。有太多的 web 站点是用 CGI 脚本去实现的,而导致只有将所有的 Cookies 都放入 Request header 才可以正常的工作。这种情况下最好设置 http.protocol.single-cookie-header 参数为 true
存储在Cookie管理器中的Cookie:表示已经存储的Cookie,用户也可以手动添加
参数化
参数化测试:把测试数据组织起来,用不同的测试数据调用相同的测试方法,实现测试数据与测试方法的分离。
用户定义变量(全局变量)
作用:定义全局变量
位置:测试计划/线程组–>配置元件–>用户定义的变量
变量声明也是用键值对的方式表示。
使用方法:在需要变量处,使用${变量名}引用。
用户参数
假设有多个用户同时请求, 每个用户在登录请求时需要不同的用户名和密码进行登录,可以使用用户参数。
作用:针对同一种方法,当不同的用户来访问时,可以获取到不同的值。
位置:线程组–>前置处理器–>用户参数
添加变量(变量可多个),用户即是变量的值。
由于有两个用户,我们将线程组的线程数改为2,模拟两个用户。
随后建立HTTP请求,访问百度。并在参数中引用用户参数,使用方法也是${变量名}。
创建查看结果数后运行。
从结果看,一共发送了两次请求,两次请求引用的参数分别就是设置好的两个用户参数。
CSV数据文件方式
作用:在多次循环中,取到不同的值。
位置:线程组—>配置元件—>CSV数据文件设置(CSV Data Set Config)
CSV数据文件设置参数详解
使用步骤:
-
定义csv文件
-
添加线程组,设置循环次数为3(根据CSV文件的行数来确定,该例子为3)
-
添加CSV数据文件设置,文件名选择CSV文件路径即可。变量名称用于Jmeter中引用,可自行指定,并不要求与CSV文件中的严格相同。由于我们定义的CSV首行是数据,所以不忽略首行。分隔符CSV文件中使用的是逗号
-
添加HTTP请求并引用参数,引用参数的方法同样是${变量名}
-
添加查看结果数并执行
函数
Jmeter内部已定义好了一些函数供用户使用,函数格式为双下划线开头,后面跟着函数名称,且函数名称严格区分大小写。
位置:Jmeter菜单栏->工具->函数助手对话框
以下为一些常用的函数
${__counter(,)} 计数器
${__dateTimeConvert(,)} 时间格式转换
${__digest(,)} 加密 简单加密 *****
${__intSum(,)} 整数相加函数
${__P(,)} 获取属性函数 *****
${__property(,)} 获取属性函数 *****
${__setProperty(,)} 设置属性函数 *****
${__Random(,)} 随机数
${__RandomString(,)} 随机字符串
${__threadNum} 获取线程号函数
${__time(,)} 获取当前时间戳函数 *****
${__timeShift(,)} 数据格式化
${__V(,)} 拼接函数 *****
本文以计数器函数为例进行介绍,其他函数以及具体用法可以参考网络资料以及Jmeter自带的文档。
计数器${__counter(,)}
在函数助手对话框中选择counter函数,点击生成,即可获得计数器函数表达式${__counter(,)}。且生成了一个从1开始的计数器函数,初始值从1开始
添加一个访问百度的HTTP请求,且引用计数器函数。使用方法在参数中直接引用
${__counter(,)},并将线程组循环次数进行调整。此处例子将循环次数设置为10
点击执行并查看结果,从结果树中我们可以看到。进行了10次请求,且每次引用的参数即计数器函数每次递增。
注意:计数器函数每次递增只能加1,若想用递增加2或递增更多的时候,需要使用配置原件中的 “计数器”;
断言
断言:让程序自动判断实际结果是否与预期结果一致
响应断言
作用:对HTTP请求的任意格式的响应结果进行断言
位置:测试计划->线程组->HTTP请求->右键->添加->断言->响应断言
忽略状态是复选框,由于Jmeter会自动判断状态码,并将例如400等状态码判为错误。假如我们就是要模拟错误,就选择忽略状态。
如果填写了多个预期结果,他们是逻辑与的关系。
JSON断言
作用:对HTTP请求的JSON格式的响应结果进行断言
位置:测试计划->线程组->HTTP请求->右键->添加->断言->JSON断言
Assert JSON Path exists:填写JSON元素所在的路径,$为根节点。例 $.weatherinfo.city,断言根节点下的weatherinfo节点,weatherinfo节点下的city节点值。
Additionally assert value:勾选之后,才能填写Expected Value(期望值)。即JSON节点的值与期望值进行对比是否相等,如果此外还勾选了Match as regular expression,则在期望值框里输入正则表达式,进行对比结果。
断言持续时间
作用:测试HTTP请求的响应时间是否满足需求
位置:测试计划->线程组->HTTP请求->右键->添加->断言->断言持续时间
Jmeter关联
当请求之间有关联, 比如一个请求的参数是另一个请求的响应数据,这时候就需要用到关联处理来进行提取响应数据中的值。
正则表达式提取器
作用:针对任意格式的响应结果进行提取
位置:测试计划->线程组->HTTP请求->右键->添加->后置处理器->正则表达式提取器
关于正则表达式如何书写,有需要的朋友请自行上网查阅。此外,可以用网页版的正则表达式测试器来判断自己所书写的正则表达式是否正确。
模板中提到的正则表达式中的多个提取值,指的是 如果正则表达式中有多个(),也就是一次匹配中提取多个值,要取第一个()中的值,就填写数字几 且前后用$符号。
匹配数字指的是,正则表达式匹配到多组数值,取多组数值中的哪一个。
假如有多组数据,匹配数字为-1,那就是全部取值,那么引用参数中存储的是一个列表形式,
在引用列表中其中一个参数,格式是${变量名_索引}
XPath提取器
作用:针对HTML格式的响应数据进行提取
位置:测试计划->线程组->HTTP请求->右键->添加->后置处理器->XPath提取器
JSON提取器
作用:针对JSON格式的响应数据进行提取
位置:测试计划->线程组->HTTP请求->右键->添加->后置处理器->JSON提取器
Jmeter属性
作用:当有关联的两个请求不在同一个线程组中时,可以使用Jmeter属性进行数据传递。
位置:测试计划->线程组->右键->添加->取样器->BeanShell取样器
要使用BeanShell取样器进行属性设置, 要搭配其他的提取器和函数助手进行使用。
工作流程:提取器将数据提取后保存到变量中,通过_setProperty函数将提取器提取的变量值保存到Jmeter属性中,在要使用该Jmeter属性的地方通过_property函数引用。
设置函数_setProperty,这里表示Jmeter属性的变量名称为pro_city,其值为${city}(该值一般由提取器提取),点击生成函数。
使用函数_property,在属性名称中输入要使用的Jmeter属性,点击生成即可。The result of the function is 表示pro_city中值是什么。
操作步骤
- 添加线程组1
- 在线程组1下添加HTTP请求
- 添加JSON提取器(仅作演示)将HTTP请求响应结果 提取存为变量city
- 添加BeanShell取样器 利用函数_setProperty,将JSON提取器变量city 设置为Jmeter属性
- 添加线程组2
- 在线程组2下添加HTTP请求(并读取Jmeter属性)
Jmeter录制脚本(仅作介绍)
用于在没有API文档时,编写HTTP请求。Jmeter作为代理服务器,拦截和转发请求与响应数据。(功能与抓包工具一样)
Jmeter直连数据库
使用场景
- 请求需要的参数, 从数据库中获取
- 断言的预期结果从数据库中获取
- 清理接口测试后所留下的测试数据
- 通过数据库获取大量的测试数据
操作步骤,以mysql数据库为例
位置:测试计划->线程组->右键->添加->配置元件->JDBC Connection Configuration
Password:连接数据库密码,如实填写
配置完成后,相当于连接数据库成功,接下来就要执行SQL语句。
添加JDBC请求
位置:测试计划->线程组->右键->添加->取样器->JDBC Request
通过JDBC Request的SQL语句将返回结果存在变量里,在要使用的地方通过${变量名_索引}的方式进行引用
逻辑控制器
如果(if)控制器
作用:控制它下面的Jmeter组件是否运行
位置:测试计划->线程组->右键->添加->逻辑控制器->if控制器
利用JS语法的方式书写,表示判断 变量name是否等于itcast 且注意要加双引号 并不勾选下面的Interpret Condition as Variable Expression
循环控制器
作用:通过设置循环次数,实现循环发送请求
位置:测试计划->线程组->右键->添加->逻辑控制器->循环控制器
思考:线程组也可以设置循环次数,为什么还要使用循环控制器?
答:线程组会使其下的所有HTTP请求循环一定次数,循环控制器会使其下的HTTP请求循环一定次数。他们两的作用范围不同,循环控制器可实现更精准的范围控制。
此外,假设线程组设置了循环M次, 其下循环控制器又设置了循环N次, 那么循环控制器下的HTTP请求会循环执行 M*N 次
Foreach控制器
作用:遍历变量中的值(值以列表的方式存在),搭配正则表达式提取器等进行使用。
位置:测试计划->线程组->右键->添加->逻辑控制器->Foreach控制器
由上文的正则表达式提取器内容可知,如果变量值是列表形式,那么使用其中的某个值则是${变量名_索引}。所以 变量名即是输入变量前缀,且在提取的时候要添加下划线。因此需要勾选Add’_’ before number ?
如果列表是用户自定义的数据,没有下划线 而是${变量名索引}的方式 那就取消勾选。
要循环使用Foreach控制器提取的变量 通过${输出变量名称}引用
定时器
同步定时器
作用:先阻塞线程,当在规定时间内达到一定的线程数量后,这些线程会在同一时间点一起释放,瞬间产生很大的压力,用于模拟高并发场景。
位置:测试计划->线程组->右键->添加->定时器->Synchronizing Timer
此处,设置的并发线程数应该为小于等于线程数n,如果大于的话 则取n。
常数吞吐量定时器
作用:让Jmeter按照指定的吞吐量执行, 以每分钟为单位,大多用于模拟系统稳定运行下的吞吐量,进行稳定测试。
位置:测试计划->线程组->右键->添加->定时器->Constant Throughout Timer
固定定时器
作用:让其父节点等待设定的时间后运行。
位置:测试计划->线程组->右键->添加->定时器->固定定时器
本文关于Jmeter的部分使用介绍就到此为此了, 关于更多的Jmeter使用方法请各位自行查阅资料,或者参考Jmeter自带文档。
参考目录
https://blog.csdn.net/u014045237/article/details/143368211
https://blog.csdn.net/cool_tao6/article/details/142441207
https://blog.csdn.net/qq_45138120/article/details/130478599
https://www.bilibili.com/video/BV12Q4y1C7Wf
https://www.bilibili.com/video/BV19Q4y167Qo
https://www.bilibili.com/video/BV1Ne411M7Gb