Jmeter基本使用 及FAQ
jmeter用法
一、环境信息了解
1,JDK安装
2,jmeter安装:必须要跟jdk版本配套使用
3,直接解压缩jmeter即可
4,配置环境变量
5,验证是否安装成果
启动方式:双击jmeter.bat ; 双击ApacheJmeter.jar
二、jmeter的使用
基本元件
线程组:用来模拟用户组
配置元件:进行测试环境和测试数据的初始化。类似于自动化脚本中的setup
前置处理器:对要发的请求进行预处理。类似参数化
定时器:等待一段时间。
取样器:往服务器发送请求
后置处理器:对收到的服务器的响应进行数据提取。类似获取响应中的特定字段
断言:将收到的响应结果与预期结果做对比。
监听器:查看测试脚本运行的结果和日志
测试片段:封装测试的功能,不单独执行,需要通过脚本的调用。类似于封装的函数
元件作用域:
1.取样器:元件相互没有作用,不存在作用域问题
2.逻辑控制器:元件只对其子节点中的取样器和逻辑控制器作用
3.其他六大元件:除取样器,逻辑控制器外。如果是某个取样器的子节点,则该元件对其父子节点起作用
4.如果其父节点不是取样器,则其作用域是该元件父节点下的所有节点
重要的三个组件
线程组:通过配置线程组中的线程数模拟用户
线程组特点:
- 设定线程数(模拟多个用户操作)
- 取样器和逻辑控制器必须依赖线程组才能使用
- 线程组可以添加多个,多个线程组可以并行或者串行(并行是默认状态下执行的;串行可以在测试计划下勾选“独立运行每个线程组”)
- 线程组下可以添加其他元件或组件
线程组分类:
- setUp线程组:用于测试前的预处理操作,在所有的线程组中最先执行。一般做初始化操作
- 普通线程组:用于执行业务测试。一个线程组可以看作一个虚拟用户组,一个线程就是一个虚拟用户。
- tearDown线程组:用于测试后的后置处理,如恢复环境,数据,清除缓存等,在所有线程组中最后执行的。一般做结尾操作,收尾。
线程组属性:
ramp-up时间:虚拟用户启动一共需要的时间
循环次数:
- 配置指定次数:控制脚本循环执行的次数
- 配置循环永远:
1,需要调度器配置使用
2,运行时间:脚本执行的时间
3,延迟启动时间:脚本等待特定的时间才能开始运行
基础页面功能介绍
1.循环次数(Loop Count): 请求发生的重复次数。若选择永远,请求将一直持续发出。
配置元件介绍
http请求默认值
作用:在整个线程组中都可以使用。其他的请求如果是相同的值,不需要填,会填默认管理器的值。
可以通过2种方式设置:
①手动一个一个添加参数
②直接将抓取到的请求参数体copy到body data
http信息头管理器:
作用:反爬虫添加信息头–模拟浏览器去发送请求–user agent
http cookie管理器
1)管理test plan运行时的所有cookie
2)可以自动存储服务器发送给客户端的所有的cookie,并在发送请求时附加上合适的cookie
3)用户也可以在cookie管理器上手工添加一些cookie,这些手工添加的cookie会在请求时被自动附加到请求中。
注意:
1.一般访问首页时都会有一个cookie记录,直接添加cookie管理器即可!!
2.若用户的请求参数为特殊形式,如json,那么接收数据后,需要通过请求头来解决数据,否则不会返回数据,也没有报错信息。
http cache管理器
一般指的是浏览器的缓存。
作用:用于模拟浏览器的cache行为,更真实的模拟用户行为
参数化方式
1,用户定义变量的参数化(①通过配置元件设置;②直接在测试计划下定义参数,作用域用于测试计划中所有请求)
引用方式:${变量名}
2,用户参数(可以针对不同的用户,设置不同的数据)
在前置处理器下添加的元件
3,CSV数据文件参数化
多数据量的使用,一般推荐使用该方式参数化
配置:
文件名:填写csv文件的路径,建议使用相对路径
文件编码:UTF-8
变量名称:从csv数据文件中读取的数据需要保存的变量名,有多个变量时用逗号分开
是否忽略首行:是否从数据文件第一行开始读取
分隔符:要求与csv数据文件中多列的分隔符一致
遇到文件结束符是否再次循环:若设置的数据值不够的情况下,可以自己设置是否再次循环
遇到文件结束符是否停止线程:当上面的参数为false时,该参数才有效,一般设置为true。
csv注意
一般csv文件都是默认以逗号作为分隔符,这就会导致使用jmeter进行数据提取的时候,将json数据”大卸八块“,从而导致取值一直不对!!真是死活都找不出来哪里错了。
这里提供一个简单的解决方案:
简单粗暴:直接将所有的json数据用双引号包裹起来
4.函数助手
在线程组-config element-csv data 创建配置元件,通过variable name定义读取数据。
引用:${__counter(true,)}
引用场景:只是验证多个数据,没有严格的数据要求
1)通过__csvread函数助手获取。
a)位置:tool-function help
b)将获取到的函数填入变量值即可,通过循环线程用户数来达到遍历获取数据
2)函数助手randomstring (弊端:可能会生成重复的数据)
断言
作用:让脚本自动化执行的过程中,能够自动判断执行的结果是否正确
1、响应断言
2、json断言
只适用于返回的http响应为json格式
配置:json path格式如 : $.weather.city
该组件用来对json文档继续验证,验证步骤如下:
- 1、首先解析json数据,如果数据不是json则验证失败。
- 2、使用Jayway JaonPath1.2.0中的语法搜索指定的路径。如果找不到路径,就会失败。
- 3、如果在文档中找到JSON路径,并且要求对期望值进行验证,则将执行验证操作。
添加方式:测试计划–线程组–HTTP请求–右键添加断言–json断言
3、断言持续时间–Duration Asssetion
适用于性能测试时,检查http请求的响应时间是否超过预期值
接口关联
当多个请求之间有依赖关系,后一个请求的参数需要使用前一个请求的相应数据时,需要用到关联
1,正则表达式提取器
2,path提取器
3,json提取器
关键操作:先获取到token------提取
断言是:从返回结果中检查是否有预期值------对比
关联:获取返回的值,保存起来给别的请求使用。
1.正则表达式
正则表达式搭配Debug Sampler使用,查看获取到的值。
()表示要提取的内容
(.+?).代表要获取匹配任意字符 ;+表示至少匹配一次,?表示匹配一个或多个
提取单个字符串:
<title>哈哈哈哈哈哈</title>
提取:<title>(.+?)</title>
提取多个字符串:
有几个配置就写几个:name="(.+?)" value="(.+?)"
这样会创建2组,分别用于$1$ 和$2$
引用名称:MYREF(jmeter内置函数) 模板:$1$ ,$2$
MYREF g0: name="xxx" value="xccc"
MYREF g1=xxx
MYREF g2=xcc
需要引用时,可以通过${MYREF},${MYREF g1}
正则表达式使用场景:
第二个请求需要用到第一个返回值
通过正则提取器提取一个请求的值将指定字段信息赋值给第二个需要的地方。
实操:
1.首先在请求响应的数据中查看需要提取的信息
2.通过添加正则表达式获取值
3,添加debug调试,查看数据是否正常获取到
4.在需要引用的地方通过${配置名} 引用即可
若有多个值,可以在debug中找到关键字,通过相对应的变量名来引用
2. xpath提取器
XPath query : //title
xpath匹配规则??
匹配数字跟正则的规则是一样的
3.json提取器
适用于数据响应是json的格式,路径格式:$.weather.city
jmeter连接数据库
1,先将数据库服务启动
2,测试计划中添加Mysql 的驱动jar包
在测试计划面板点击“浏览…”按钮,将你的JDBC驱动添加进来。若已经将jar包放置在jmeter的lib路径下,则可省略这一步!
3,配置数据库连接信息
在配置元件中添加JDBC连接,并配置
Database URL格式:jdbc:mysql:/主机名:端口号/lockin_cloud_test(数据库名)
使用数据库
1,在线程组下创建一个jdbc的请求
2,配置数据库名
3,配置mysql语句,并设置其变量名存储获取的数据
其他请求引用数据库中获取的值
- 仅单个数据:使用${变量名}引用
- 多个数据值可以用计数器协助:
1、线程下添加一个循环处理控制器 loop controller ,下面添加一个Counter计数
2、结合函数助手${_v()}来循环获取
完整的引用表述方式:${__V(model_${numName},)}
${numName}:获取计数器的每次变化的值。
model_${numName} :每次获取不同的变量值。
给数据库请求后添加一个debug sampler可以看到响应值均是变量名_1,变量名_2...来命名的,故引用也需要按照对应格式引用。
数据库连接失败FAQ:
1、问题:
Response message:java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)
解决方案:
检查你的数据源配置即Resource中的:url,username,password 。一般都是Database URL写错了,可能是端口、数据库名等
逻辑控制器
控制元件的执行顺序
1.if 控制器
配置:
1、使用JS语法:“${变量名}”==“baidu”
2、使用函数的方式:${__jexl3(“${变量名}”==“baidu”,)}
2.循环控制器
指定http请求执行特定的次数
配置:只需要配置循环的次数即可
循环控制器循环次数和线程组的循环次数对比:
- 关系:如果同时配置,循环控制器下的HTTP请求实际的执行次数应该是两个数的乘积
- 区别:两个循环次数的作用域不同
3.for each 控制器
foreach控制器一般和用户自定义变量或正则表达式提取器一起使用。其在用户自定义变量或从正则表达式提取器的返回结果中读取的一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值。
使用
1,先用户定义一个变量,并且设置值
2,配置for each循环控制器
若是通过正则表达式获取数值,则for each控制器的获取变量名是正则表达式设置的变量名
4.吞吐量控制器
作用:用于分流,一些用户做这些操作,一些做那些操作,加起来总的用户就是线程用户数。
控制器是控制请求的,只能在整个线程组添加
1、仅一次控制器
在测试计划执行期间,在仅一次控制器下的子节点对每个线程只执行一次。
注意:只能对一个用户多次操作登录请求限制有效。多个用户还是会执行多次。
登录场景经常会使用到仅一次控制器
2、转换控制器
通过控制控制器中的请求执行,value值来指定运行哪个取样器,也可以理解为开关控制器。值的规则跟数组下标一致
定时器
1、固定定时器--------模拟用户思考时间
2、固定吞吐量控制器
用于模拟性能测试时,模拟用户产生的业务压力,通过制定QPS对服务器发送固定频率的请求。
只要有设置固定吞吐量控制器,一定要设置吞吐量目标样本(每分钟处理多少个)
3,同步定时器
也叫集合点。即积累了一定的请求,在规定的时间内达到一定的线程数量后,在同一个时间点一起并发。一般可以用来做大数据量的并发请求。
需要进行大量用户并发测试时,为了让用户同时执行,添加同步定时器,用于线程阻塞。当用户数达到预先配置的数值,才开始执行取样器的操作。
配置:
- 并发数:同时达到多少用户才开始发送请求
- 超时时间:
1)必须配置,否则若虚拟用户数无法被并发数整除时,就会有部分的用户挂起无法执行。
2)配置时间不能太短:必须比并发数加载的时间要长,否则无法达到并发数的请求,数据就会被释放
操作:
在需要并发请求下添加一个同步计时器
Number of simulated users to group by:
1.每集合够设置的模拟用户个数,则发一次请求;
2.如果设为0,则表示所有的用户一起并发
3.确保设置的数不大于实际线程组包含的用户数,否则会造成线程组达不到集合的要求,一直等待,直到超时为止(如果有设置超时时间的话);若没设置,会一直等待。
timeout in milliseconds:超时时间。
0表示没有设置超时时间。需要所有的的用户都到了才释放
如果大于0 ,并且已经达到了最大等待时间,此时还没达到集合点的用户数,timer将不再等待,会先释放已到达的线程。
若多个用户两两集合一起跑,则超时时间指的是最后一个正常跑的请求与超时的那个请求的时间差,至少大于设置的超时时间。可能某些外部元素导致相差得超时时间大一点,这个也算是比较正常得。
注意事项:
如果超时时间为0,且线程数无法达到设置的集合点值,则该测试将无限等待,只能手动终止。
无法达到得情况:
1)设置的值大于线程总数量;
2)最后一批线程数不够集合点数目;
断言&监听器
常用断言方法:
监听器方法:查看结果树、聚合报告、表格查看结果、图像结果
响应断言:
如果响应中的数据没有,则报错;
几种查看结果的方式
查看结果树中的css的使用:
查看结果树之Regexp的使用:
例如:
三、jmeter脚本编写
一共有四种些脚本的方式:
1)通过抓包后,人工手动写
2)通过jmeter 的http代理服务器录制
3)通过抓包工具导出,保存脚本为jmx文件,直接拖拽到jmeter即可。
4)通过badboy录制。
脚本录制
1、打开浏览器的代理设置
2.添加http代理:线程组-》右键-》add->非测试原件->http测试脚本录制
3.配置好代理服务器相关信息,点击录制,然后操作访问要录制的东西即可。
4、通过filter来过滤录制中不想要的数据:
统一格式为:
.*\.(js|css|PNG|jpg|ico|png|gif|txt).*
注意:
1、若出现以下报错,可能是开启了其他代理端口号为8888的软件,例如:fiddler/charles等
2、怎么录制https请求的数据?浏览器中导入jmeter的证书(在jmeter安装路径下)
四、跨线程的变量调用
方法1:设置全局属性调用
在jmeter中将属性设置为动态的属性,属性可以在整个线程组中使用;而变量就只能在单个线程中使用。
操作方法
1、添加两个线程,在第一个线程中通过BeanShell PostProcessor,将变量设置为属性。
- 添加beanshell后置处理器
- 打开函数助手,使用_setProperty()函数设置变量
- 点击生成函数表达式,将生成的表达式放入script内即完成属性的设置。
2、在第二个线程中添加一个用户自定义变量,或者直接通过_P函数调用。 - 打开函数助手,找到获取值的函数_P(),在value文本框处输入:${前面设置的属性名称},然后生成函数表达时候直接通过该表达式调用即可。
特别注意:
由于多个线程组需要分先后顺序才能获取到值,因此需要在测试计划中勾选独立运行每个线程组。若要设置多个属性,可以在设置属性脚本出设置多个即可。
ps:也可以通过文件形式获取:第一个线程读取到了变量值,将其保存在文件中(通过save response to a file来实现);然后通过第二个线程读取文件的内容即可。
性能测试需要安装的辅助插件
下载一个产检管理包jmeter-plugins-manager_(version).jar,放到jmeter的lib\ext目录下,然后重启jmeter。
主要是要有一下三个插件:
FAQ
解决接口返回数据展示中文乱码
1.给该接口加一个beanShell后置处理器,添加如下代码即可
prev.setDataEncoding("utf-8");
命令行生成html报告时报错Begin size 1 is not equal to fixed size 5
原因:jre版本不兼容导致
解决方案:
切换到1.8版本的jre即可。我本地之前jdk时最新的18版本的导致一直异常。18和1.8的区别是:1.8是长期使用比较稳定的。18是2022年新发的版本。
更多推荐
所有评论(0)