官网下载地址
可以默认也可以修改安装路径(这一步和环境变量有关)
环境变量-系统变量,修改2处(这一步和JDK安装的路径有关,我这里安装在了D盘)
# 新增系统变量JAVA_HOME(JDK的安装地址)
D:\Java\jdk-17.0.2
# Path中新增环境变量(JDK的bin路径)
D:\Java\jdk-17.0.2\bin
D:\Java\jdk-17.0.2\jre\bin
# 如果后面升级JDK,Path中的变量也需要修改,所以更好的写法是
%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
下载地址
这里我选择的是apache-jmeter-5.4.3.zip,这里需要的是jdk 1.8+的版本(JMeter和JDK版本需要对应)
把下载的安装包,解压到某一目录下(安装目录中不能有中文/空格)
和JDK环境变量配置相似
环境变量-系统变量,修改2处(这一步和JMeter安装的路径有关,我这里安装在了D盘)
# 新增系统变量JMETER_HOME(JMeter的安装地址)
D:\apache-jmeter-5.4.3
# Path中新增环境变量
%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar
%JMETER_HOME%\lib\jorphan.jar
法1. 直接双击bin目录下的jmeter.bat
法2. java -jar ApacheJMeter.jar
任意一种方式能启动说明安装成功
修改配置文件:bin/jmeter.propertites,修改语言为language=zh_CN,重启JMeter
选项-外观
乱码:中文无法正常显示
修改配置文件:bin/jmeter.propertites,修改配置为sampleresult.default.encoding=UTF-8(原来是ISO-XXX)
修改完配置文件后重启JMeter才能使修改的配置生效
存放可执行文件和配置文件
JMeter的api文档,用于开发扩展组件
用户帮助手册
存放JMeter依赖的jar包和用户扩展所依赖的jar包
多个类似功能组件的容器(类似于类)
发送请求
控制语句的执行顺序
对请求参数进行预处理
对响应结果进行提取
检查接口的返回结果是否和预期结果一致
设置等待
封装一段代码,供其他脚本调用
测试数据的初始化配置
查看JMeter脚本的运行结果
初始化测试数据
对请求参数进行赋值
调用GET/POST方法发送请求
提取响应中特定字段的值
对提取出来的值与预期结果进行对比
控制台查看脚本运行结果
元件作用域是靠测试计划的树形结构中元件的父子关系来确定的
所有的组件都是以取样器为核心来运行的(如果在一个脚本里没有取样器,那么这个脚本就不会执行)
组件添加的位置不同,生效的取样器也不同
同一作用域下的不同类型元件:配置元件-前置处理器-定时器-取样器-后置处理器-断言-监听器
同一作用域下的多个相同类型元件:按照测试计划从上到下的顺序依次执行
定时器1-请求1-定时器1-定时器2-请求2-定时器1-定时器3-请求3
使用JMeter访问百度首页接口,并查看请求和响应信息
实现独立的某个功能(类似于方法)
以取样器的组件为例,以下介绍3种重要的基本组件(JMeter基本组成部分)
线程组就是控制JMeter用于执行测试的一组用户
向服务器发送http和https请求(取样器)
如果协议部分不填,JMeter默认是http协议,端口默认是80
协议、域名、端口、路径、请求方法、编码格式
使用HTTP请求-路径来传递get请求参数
使用HTTP请求-参数列表来传递get请求参数(需要注意这里协议是https而不是http)
使用HTTP请求-参数列表来传递POST请求的form格式参数
使用HTTP请求-消息体数据来传递POST请求的form格式参数
查看HTTP请求的请求和响应结果
查看响应头信息、响应状态码
查看请求相关信息(URL,方法,参数)
查看响应信息(状态码,响应体)
如果要发送请求10次,每次请求发送不同的参数值,应该怎么做?引入参数化
用不同的测试数据调用相同的测试方法进行测试(用参数来替代固定的测试数据,参数是1个还是多个由自己来定义)
用户定义的变量–全局变量
用户参数–为每个用户分配不同的参数值
CSV Data Set Config–文件方式参数化
函数–随机数据
(数据库/数据文件)
实现测试数据和测试方法的分离
某支付系统,需要用1000个不同的用户登录,并使用添加不同的测试金额数据访问支付接口
定义全局变量
每次取值(无论是否相同用户)都是固定值
线程组–添加–配置元件–用户定义的变量
使用用户定义的变量配置被测系统的协议、域名和端口(https://www.baidu.com:443)
性能测试的时候有多个用户同时请求,每个用户在登录请求时需要使用不同的用户名密码进行登录,应该怎么做
针对同一组参数,当不同的用户来访问时,可以获取到不同的值
同一个用户在多次循环时,取到相同的值
线程组–添加–前置处理器–用户参数
第一个用户请求附带参数:name=“张三”&age=28;第二个用户请求附带参数name=“李四”&age=30(https://www.baidu.com)
性能测试时有多个用户登录,登录后循环添加商品,每次添加时商品的参数不同,应该怎么做
让不同的用户或者同一用户在多次循环时,可以取到不同的值
需要手动进行测试数据的设置
线程组–添加–配置元件–CSV数据文件设置
循环请求3次,每次请求时附带参数username,password,code的值不相同(https://www.baidu.com)
在vscode里编辑数据,最后修改文件后缀名为.csv
如果修改线程数为2,循环次数依旧为3,则会读取CSV文件中的所有6条数据
性能测试时,如果模拟1000个用户,每个用户循环执行10万次添加商品操作,请求参数要求不同,应该怎么做
需要自动生成不重复的数据时,让每个用户每次循环都能取到不同的数据,且不需要提前定义
计数函数,一般做执行次数统计使用
输入数据有特定业务要求时无法使用(如登录时的用户名,密码)
菜单栏–函数助手对话框(倒数第2个菜单);快捷键ctrl+shift+F1
True:每个用户有自己的计数器
False:所有用户使用全局计数器
填写True/False后,点击生成,将生成的字符串复制粘贴到请求的取样器里即可
每个用户每次循环执行该脚本都可以使用不同的值(访问百度首页http://www.baidu.com/S?num=1)
查看结果树中看到的发送消息和HTTP取样器中配置的不一致?
手工执行用例时,可以用肉眼观察结果,使用工具代替手工执行用例时,如何判断用例是否通过?
让程序自动判断预期结果是否和实际结果一致
JMeter在请求的返回层面,有个自动判断机制(响应状态码,如果状态码为4XX/5XX,判定为失败),但是请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性
对HTTP请求的任意格式的响应结果进行断言
线程组–HTTP请求–添加–断言–响应断言
实际结果
比较方式
预期结果,即填写指定的结果(可填写多个),添加和删除是进行指定内容的管理
具体是否包含"百度一下,你就知道",可以先不配置响应断言,直接查看HTTP请求的响应数据,查找是否存在这样的内容
对HTTP请求的JSON格式的响应结果进行断言
线程组–HTTP请求–添加–断言–JSON断言
让程序检查响应的JSON数据中,city对应的内容是否为北京(http://www.weather.com.cn/data/sk/101010100.html)
检查HTTP请求的响应时间是否超出要求范围
线程组–HTTP请求–添加–断言–断言持续时间
持续时间(毫秒):HTTP请求允许的最大响应时间,超过则认为失败
让程序检查响应时间是否大于100毫秒(访问https://www.jd.com)
选择商品加入购物车
当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,此时就需要用到关联处理
正则表达式提取器:如果JSON提取器和XPath提取器都无法实现关联,使用正则表达式提取器进行补充–针对任意格式的响应数据(相对其他两种提取器,效率低)
XPath提取器:如果响应格式是HTML格式,优先使用XPath提取器进行关联
JSON提取器:如果响应格式是JSON格式,优先使用JSON提取器进行关联
一个公式/一套规则,使用这套规则可以从任意字符串中提取出想要的数据内容
公式格式:左边界(匹配符号)右边界:可以提取出想要获取的数据内容
.:是通配符,可以代表任意字符(除换行回车)
*: 代表前面的字符出现0次或者多次
.*匹配规则:找到左边界值后,往右查找有边界,找到最后面的右边界,中间的所有数据都被记录下来
?: 代表非贪婪匹配,找到左边界后,往右查找匹配右边界,只要有匹配的右边界就停止继续查找;再次查找
左边界和右边界
公式格式:左边界(.*?)右边界
百度一下,你就知道 百度一下,你就知道
(.*?)
原始文本:
021-1234-1234
022-1234-1235
023-1234-1236
024-1234-1237
025-1234-1238
026-1234-1239
027-1234-1230
要求:匹配出 城市号、地区号、个人号码三组
(.*?)-(.*?)-(.*?)\n
针对任意格式的响应数据进行提取
线程组–HTTP请求–后置处理器–正则表达式提取器
符号 | 含义 |
---|---|
() | 括起来的部分就是要提取的 |
. | 匹配任何字符串 |
+ | 一次或多次 |
? | 非贪婪匹配,在找到第一个匹配项后停止 |
可以方便查看正则表达式提取到的内容
位置:线程组–添加–取样器–调试取样器(设置匹配数字为-1)
运行以后,察看结果树–调试取样器–响应结果里会有所有获取到的area值(格式是area_1, area_2, …,据此修改HTTP请求百度中的请求路径为wd=${area_5})
方法2是以列表索引的方式来引用,格式:${变量名_索引},索引从1开始
获取传智播客的首页地址,把第5个校区地址作为参数传递(span为地址/后面带一、二、三)
地址格式1:地址一昌平区建材城西路金燕龙办公楼一层
地址格式2:地址上海市浦东新区航头镇航都路18号万香创新港
针对HTML格式的响应结果数据进行提取
//标签名
线程组–HTTP请求–添加–后置处理器–XPath提取器
获取传智播客首页的title,并作为参数传递
针对JSON格式的响应结果数据进行提取
线程组–HTTP请求–添加–后置处理器–JSON提取器
Names of created variables:存放提取出的值的参数名称
JSON Path Expressions:JSON路径表达式
Match No:如果JSON路径匹配出许多结果,则可以选择提取哪个。0随机、-1提取所有结果、1第一个
Default Values:参数的默认值
请求获取天气的接口(http://www.weather.com.cn/data/sk/101010100.html)获取返回结果中的城市名称"北京"
把获取到的城市名称作为参数访问百度
当有关联关系的两个请求在同一个线程组中时,可以使用三种提取器的变量来实现数据传递
当有关联关系的两个请求在不同线程组中时,如何进行数据传递(变量不可以跨线程组传递,所以需要设置全局变量)
实现跨线程组的数据传递时,需要使用JMeter属性
setProperty函数:将值保存为JMeter属性
property函数:在其他线程组中使用property函数读取属性
setProperty函数执行时(保存JMeter属性),需要通过BeanShell取样器来执行
property函数(读取属性),在其他线程组中使用property函数
线程组1:请求获取天气的接口(http://www.weather.com.cn/data/sk/101010100.html)获取返回结果中的城市名称"北京"
线程组2:把获取到的城市名称作为参数访问百度
有API文档时,可以根据API文档的定义来编写HTTP接口测试脚本
没有API文档时,应该如何编写HTTP接口测试脚本
在没有接口文档的旧项目中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本
JMeter作为代理服务器来拦截和转发请求与响应数据
分为包含模式(匹配则抓取)和排除模式(匹配则丢弃)
.*.jpg
.*.jpeg
登录时需要的用户,可以从数据库中查询获取
添加到购物车,下订单,检查接口返回的订单号,是否和数据库中生成的订单号一致
添加商品(商品名/编号等不能重复),再执行该脚本不能成功,需要在下次执行之前删除该商品数据
通过数据库来准备大量(几十万条)的性能测试数据
添加MySQL驱动jar包
将MySQL驱动jar包放入到lib/ext目录下,重启JMeter
配置数据库连接信息
线程组–添加–配置元件–JDBC Connection Configuration
线程组–取样器–JDBC Request
可以按照设定的逻辑控制取样器的执行顺序
If控制器用来控制它下面的测试元素是否运行
线程组–添加–逻辑控制器–如果(If)控制器
“${name}”==“baidu”
不勾选Interpret Conditions as Variable Expression
jexl3函数,勾选Interpret Conditions as Variable Expression
函数的方式访问速度更快点
使用用户定义的变量,定义一个变量name,name的值可以是baidu或itcast
根据name的变量值实现对应网站的访问
设置循环次数,来实现循环发送请求
线程组–添加–逻辑控制器–循环控制器
循环次数
循环访问百度10次
线程组循环次数对线程组下所有HTTP请求有效,循环控制器循环次数对子节点下HTTP请求有效
关联:
循环控制器次数为M,线程组循环次数为N
循环控制器下的请求运行M*N次
线程组下非循环控制器的请求运行N次
一般和用户定义的变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量
线程组–添加–逻辑控制器–ForEach控制器
有一组关键字[hello, python, 测试],使用用户定义的变量存储
依次取出关键字,并在百度搜索,例如https://www.baidu.com/S?wd=hello
访问itcast首页,获取首页中地址信息,全部保存下来
依次取出地址关键字,并在百度搜索,例如https://www.baidu.com/S?wd=地址
如何模拟1w人同时使用电商网站?(线程组中设置线程数,相对并发)
如何模拟1w人同时进行电商网站中的抢购活动/秒杀活动?(同步定时器,绝对并发)
阻塞线程(累积一定请求),当在规定时间内达到一定线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大压力
JMeter中叫同步定时器,Loadrunner中叫集合点
测试抢购、秒杀或者抢红包等高并发场景时使用
线程组–HTTP请求–添加–定时器–Synchronizing Timer
模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况
稳定性测试时,要求模拟用户真实的业务场景
如果真实的业务场景QPS为20,如何精确模拟
需要按照指定的吞吐量发送请求时,可以使用常数吞吐量定时器
让JMeter按照指定的吞吐量执行,以每分钟为单位
线程组–HTTP请求–添加–定时器–Constant Throughput Timer
Target Throughput:目标吞吐量的设置(每个用户每分钟发送的请求数)
计算方法:QPS*60/线程数
模拟用户真实业务场景的需求:20QPS
如果线程数设置为1,则目标吞吐量设置为20*60=1200
如果线程数设置为2,则目标吞吐量设置为1200/2 = 600
IHRM系统登录错误3次后,锁定1分钟,1分钟后重新输入正确的用户名密码登陆成功