jmeter元件作用域和执行顺序
1. 元件的基本介绍
2. 元件作用域
在jmeter中,元件的作用域是靠测试计划的树形结构中元件的父子关系来确定的。
提示: 核心是取样器,其他组件都是以取样器为核心运行的,组件添加的位置不同,生效的取样器也不同。
2.1 作用域的原则
按照jmeter测试计划的树形结构来定义作用域(有点儿类型python的缩进)
3. 元件执行顺序
jmeter使用示例
1. jmeter第一个案例
需求:使用jmeter访问百度首页接口,并查看请求和响应信息
操作步骤
2. 重点组件
2.1 线程组
说明:线程组是控制jmeter将用于执行测试的线程数,也可以把一个线程理解为一个测试用户。
2.1.1 添加线程组
位置:右键点击‘测试计划’ --> 添加 --> 线程(用户) --> 线程组
2.1.2 线程组的特点
模拟多人操作
程组可以添加多个,多个线程组可以并行或串行
如下图,“独立运行每个线程组”勾选,则所有的线程组按照添加顺序串行执行;
如果未勾选,则并行执行(先后顺序无法保证)
2.1.3 线程组分类
2.1.4 线程组参数详解
2.1.5 取样器错误后要执行的动作
2.1.6 线程组属性
2.1.7 调度器配置
持续时间(秒):设置脚本压测持续时间
启动延迟(秒):启动延迟时间
2.2 http请求
位置: 选中线程组->右键->添加->取样器->http请求
作用: 向服务器发送http及https请求
案例1:发送请求时:协议未填写,则默认为http协议 端口未填写,则默认为80端口 将get请求参数放在路径中填写
案例2:发送请求时: 协议选择https, 端口号为443 将get请求参数放在下面的参数列表中进行填写
案例3:发送post请求,将参数内容放入到消息体数据中,在发送时参数会添加到请求体中发送
2.3 查看结果树
位置: 选中测试计划/线程组->右键->添加->监听器->察看结果树 作用: 查看请求请求和响应结果
jmeter参数化
1. jmeter参数化常用方式
配置方法1:配置元件中配置
添加路径:测试计划——线程组——配置元件——用户定义的变量参数设置:
参数名:参数值
在http取样器中应用:${参数名}
线程组下配置的用户定义的变量,在线程组下生效,与测试计划中配置的变量冲突时,以线程组下的为准
配置方法2:在测试计划中配置(全局生效)
2. 用户定义的变量
添加方式:测试计划 --> 线程组--> 配置元件 --> 用户定义的变量
2.1 场景
要求:使用用户定义的变量配置被测系统的协议、域名和端口
2.2 操作步骤
-
添加线程组
-
添加用户定义的变量
-
添加http请求
-
添加查看结果树
用户定义的变量
http请求设置
3. 用户参数
添加方式:测试计划 --> 线程组--> 前置处理器 --> 用户参数
使用用户定义的变量时,不同的用户在访问时,读取的参数值完全相同,如果希望每个用户在访问时的 变量不同,可以使用用户参数。
3.1 场景
要求:第一次请求附带参数:name="张三"&age=28;第二次请求附带参数:name="李四"&age=30
3.2 操作步骤
线程组设置
线程数设置: 2
用户参数设置
http请求设置
参数化格式:${参数名}
运行结果
4. csv数据文件设置
添加方式:测试计划 --> 线程组--> 配置元件 --> csv 数据文件设置
4.1 场景
要求:循环3次,每次请求时附带参数username,password,code的值不相同
操作步骤
4.1.1、定义csv数据文件
4.1.2、线程组设置
4.1.3、配置csv数据文件设置
添加位置:线程组——配置元件——csv数据文件设置
参数配置:
4.1.4、http请求设置
4.1.5、查看结果树
4.2 参数详解(csv 数据文件设置)
5. 函数( counter)
计数函数,一般做执行次数统计使用;
位置:在菜单中选择--> 选项 --> 函数助手对话框
5.1 函数助手
参数设置
true,每个用户有自己的计数器;
false,使用全局计数器
name of variable in which to store the result (optional):用于存储结果的变量名(可选)
生成-复制
5.2 参数化调用
5.3 运行结果
6. csv和用户定义的变量作用域问题
jmeter断言
1. jmeter断言
1.1 断言的概念
断言:让程序判断预期结果和实际结果是否一致。
提示:jmeter断言是在请求的返回层面增加一层判断机制;因为请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性。
1.2 jmeter中常用断言
2. 响应断言
添加方式:测试计划 --> 线程组--> http请求 --> (右键添加) 断言 --> 响应断言
2.1 案例
场景
检查:让程序检查响应数据中是否包含“百度一下,你就知道”
操作步骤
-
添加线程组
-
添加http请求
-
添加响应断言
-
添加断言结果
-
添加查看结果树
响应断言
2.2 参数详解
3. json断言
该组件用来对json文档进行验证,验证步骤如下:
-
首先解析json数据,如果数据不是json,则验证失败。
-
使用jayway jsonpath 1.2.0中的语法搜索指定的路径。如果找不到路径,就会失败。
-
如果在文档中找到json路径,并且要求对期望值进行验证,那么它将执行验证操作。
添加方式
测试计划 --> 线程组--> http请求 --> (右键添加) 断言 --> json断言
3.1 案例
场景
请求:http://www.weather.com.cn/data/sk/101010100.html
检查:让程序检查响应的json数据中,city对应的内容是否为“北京”
操作步骤
-
添加线程组
-
添加http请求
-
添加json断言
-
添加断言结果
-
添加查看结果树
json断言
3.2 参数详解
4. 断言持续时间
添加方式:测试计划 --> 线程组--> http请求 --> (右键添加) 断言 --> 断言持续时间
4.1 案例
场景
检查:让程序检查响应时间是否大于500毫秒
操作步骤
-
添加线程组
-
添加http请求
-
添加断言持续时间
-
添加断言结果
-
添加查看结果树
断言持续时间
4.2 参数详解
持续时间(毫秒):在将每个响应标记为失败之前允许的最大毫秒数
jmeter关联
1. 关联
当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这时候就需要用到关联处理。 jmeter可以通过“后置处理器”中的一些组件来处理关联。
2. 正则表达式提取器
添加方式:测试计划 --> 线程组--> http请求 --> (右键添加) 后置处理器 --> 正则表达式提取器
2.1 场景
请求:http://www.itcast.cn/ ,获取网页的title值
请求:https://www.baidu.com/ ,把获取到的title作为请求参数
2.2 操作步骤
-
添加线程组
-
添加http请求
-
添加正则表达式提取器
-
添加http请求-百度
-
添加查看结果树
正则表达式提取器
http请求设置(百度)
2.3 参数设置(正则表达式提取器)
3. xpath提取器
添加方式:测试计划 --> 线程组--> http请求 --> (右键添加) 后置处理器 --> xpath提取器
3.1 场景
请求:http://www.itcast.cn/ ,获取网页的title值
请求:https://www.baidu.com/ ,把获取到的title作为请求参数
3.2 操作步骤
1、添加线程组
2、添加http请求——传智播客首页
3、添加xpath提取器
勾选use tidy
填写引用名称:参数名
xpath路径
4、添加http请求——百度首页
引用xpath提取器中定义的参数名:${参数名} 5、添加查看结果树
正则表达式提取器
3.3 参数设置(xpath提取器)
4. json提取器
添加方式:测试计划 --> 线程组--> http请求 --> (右键添加) 后置处理器 --> json提取器
4.1 场景
-
获取返回结果中的城市名称
-
请求:https://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数
4.2 操作步骤
1、添加线程组 2、添加http请求——天气 3、添加json提取器 参数名 json路径 4、添加http请求——百度, 应用json提取器中定义的参数名 5、添加查看结果树
json提取器
4.3 参数设置
names of created variables:存放提取出的值的参数
json path expressions:json路径表达式
5. 跨线程组关联
当有依赖关系的两个请求(一个请求的入参是另一个请求返回的数据),放入到不同的线程组中时,就不能使用提取器保存的变量来传递参数值,而是要使用jmeter属性来传递。
5.1 jmeter属性的配置方法
5.2 场景
-
线程组1:请求获取天气的接口,http://www.weather.com.cn/data/sk/101010100.html
-
获取返回结果中的城市名称
-
线程组2:请求:https://www.baidu.com/s?wd=北京 ,把获取到的城市名称作为请求参数
5.3 操作步骤
-
添加线程组1
-
添加http请求-天气
-
添加json提取器
-
添加beanshell取样器(将json提取器提取的值保存为jmeter属性)
(填写setproperty函数( 函数助手)——将提取器提取出来的值赋值给jmeter属性)
-
添加线程组2,添加http请求-百度(读取jmeter属性)
引用前面返回的城市信息(使用property函数( 函数助手)——将jmeter属性值读取出来)
-
添加查看结果树
jmeter录制脚本
1. jmeter录制脚本
应用场景:
在没有接口文档的旧项目当中,快速录制web页面产生的http接口请求,帮助编写接口测试脚本
代理服务器原理介绍
代理服务器的原理主要拦截和转发请求与响应数据。
操作步骤:
1. 开启操作系统的浏览器代理
开启后,windows操作系统中所有的http请求都会发送给设置的代理服务器。如果这个代理服务器没有启动,那么会提示网络连接错误。
保存后,访问页面会提示
2. 在jmeter当中添加非测试元件http代理服务器,并进行配置
在jmeter当中添加http代理服务器:测试计划(右键)->非测试元件->http代理服务器
配置代理服务器的参数
注意事项:
jmeter的代理服务器组件配置中,配置的端口必须和windows的浏览器代理的端口号保持一致
3. 启动代理服务器,开始录制
先点击启动
等待一段时间后,会弹出一个证书确认窗口,这个证书用于抓取https接口请求。
后续如果需要抓取https的请求时,需要按照这个窗口的提示添加证书到操作系统当中
最后的效果:
在浏览器页面中进行操作,成功后,就能在jmeter当中看到抓取到的接口请求了。
访问tpshop商城主页
回到jmeter查看录制结果
cookie管理器:
管理cookie:自动将cookie信息添加到后续的所有请求中。
登录及后续的相关操作时,需要提前添加http cookie管理器
jmeter直连数据库
1. jmeter直连数据库
1.1 场景
-
连接tpshop商城数据库获取商品名包含:小米手机5 的商品id
1.2 准备工作
启动tpshop数据库服务器
库名:tpshop2.0
表名:tp_goods
商品id字段:goods_id 商品名字段:goods_name
添加mysql驱动jar包
在测试计划面板点击“浏览…“按钮,将你的jdbc驱动添加进来
配置数据库连接信息
添加方式:测试计划 --> 线程组--> (右键添加) 配置元件 --> jdbc connection configuration
主要参数:
1.3 操作步骤
-
添加线程组
-
添加 jdbc connection configuration
-
添加 jdbc request
-
添加查看结果树
jdbc request设置
主要参数:
运行结果
编写jdbc脚本步骤(搜索指定商品,在返回结果中检查是否包含指定商品的id的详情url):
1、添加jdbc request请求
jdbc连接池名称:必须与“jdbc连接池”中的连接名一致
要执行的sql语句
variable name中:写明要保存的数据的参数名
2、添加http请求 —— 搜索请求
参数为中文时,将参数写到下方参数位置,并勾选上“编码”
3、添加响应断言:
在响应断言中配置要检查的数据内容。
注意:应用jdbc request查询出的结果时,需要加上索引(因为jdbc查询的结果保存为一个列表)
jmeter逻辑控制器
1. 逻辑控制器
逻辑控制器可以按照设定的逻辑控制取样器的执行顺序
1.1 常用的逻辑控制器
2. 如果(if)控制器
if控制器用来控制它下面的测试元素是否运行
添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 如果(if)控制器
2.1 案例
需求
操作步骤
if控制器
第一种配置方法:
第二种配置方法:
勾选上interpret condition as variable expression,判断条件需用使用jexl3函数。
(使用这个函数来进行判定时,jmeter自身的执行效果要高一些)
3. 循环控制器
通过设置循环次数,来实现循环发送请求
添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> 循环控制器
3.1 案例需求
-
循环访问百度10次
操作步骤
-
添加线程组
-
添加循环控制器
-
添加http请求
-
添加查看结果树
循环控制器
思考:线程组属性可以控制循环次数,那么循环控制器有什么用?
线程组属性控制组内所有取样器的执行次数,而循环控制器可以控制组内部分取样器的循环次数,后者控制精度更高
4. foreach控制器
foreach控制器一般和用户自定义变量或者正则表达式提取器一起使用,其在用户自定义变量或者从正则表达式提取器的返回结果中读取一系列相关的变量。 该控制器下的取样器都会被执行一次或多次,每次读取不同的变值。
添加方式:测试计划 --> 线程组--> (右键添加) 逻辑控制器 --> foreach控制器
4.1 案例需求
-
有一组关键字 [hello,python,测试],使用用户定义的变量存储
-
要依次取出关键字,并在百度搜索,例如:百度安全验证
操作步骤
-
添加线程组
-
用户定义的变量
-
添加foreach控制器
-
添加http请求
-
添加查看结果树
用户定义的变量
foreach控制器
http请求
4.2 案例需求
-
访问传智播客首页http://www.itcast.cn,获取首页中的地址信息,并全部保存下来
-
要依次取出关键字,并在百度搜索,例如:https://www.baidu.com/s?wd=地址1
操作步骤
-
添加线程组
-
添加http请求1 (传智播客)
-
添加正则表达式提取器
-
添加foreach控制器
-
添加http请求2(百度)
-
添加查看结果树
与正则表达式配合使用:
1、添加http请求——itcast首页
2、添加正则表达式提取器,提取出itcast响应中所有的地址相关的数据,并保存为参数area(列表数据)
3、添加foreach控制器,循环提取area列表中的每一个地址信息
4、在foreach控制器下添加一个http请求——百度,引用foreach控制器中定义的变量${word},作为 参数
5、添加查看结果树
jmeter定时器
1. 同步定时器(synchronizing timer)[集合点]
提示:在jmeter中叫做同步定时器,在其他软件中又叫集合点。
思考?
-
如何模拟多个用户同时抢一个红包?
-
如何测试电商网站中的抢购活动、秒杀活动?
1.1 介绍
synctimer的目的是阻塞线程,直到阻塞了n个线程,然后立即释放它们。
同步定时器相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,所以可以用来做大数据量的并发请求。
添加方式:测试计划 --> 线程组--> http请求 --> (右键添加) 定时器 --> synchronizing timer
1.2 案例
场景
模拟100个用户同时访问百度首页,统计高并发情况下运行情况
操作步骤
-
添加线程组,设置线程数=100
-
添加http请求
-
添加同步定时器
-
添加查看结果树
-
添加监听器-聚合报告
操作截图
1.3 注意事项
问题: 当用户数不能整除集合点组件的一组用户数属性时,如果超时时间是 0,会导致程序挂起,怎么避免挂起?
实现:
方案1: 点击 stop 强行终止,但是不建议
方案2: 修改一组用户数,能够做到整除(治标不治本)
方案3: 修改超时时间,不设置为 0,即便一组用户数填充不满,只要超时,也会执行(建议)
2. 常数吞吐定时器(constant throughput timer)
2.1 介绍
常数吞吐量定时器可以让jmeter以指定数字的吞吐量(以每分钟的样本数为单位,而不是每秒)执行。 吞吐量计算的范围可以为指定为当前线程、当前线程组、所有线程组。
添加方式:测试计划 --> 线程组--> http请求 --> (右键添加) 定时器 --> constant throughput timer
2.2 案例场景
一个用户以 20qps (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况
操作步骤
-
添加线程组,循环次数设置成永远
-
添加http请求
-
添加常数吞吐定时器
-
添加查看结果树
-
添加监听器-聚合报告
操作截图
查看聚合报告的 throughput 字段,实际值围绕设置的qps值上下波动
注意:常数吞吐量定时器只是帮忙达到性能测试的负载(压力)要求,本身不代表性能有bug/无bug
对于bug的分析需要通过响应时间来判断
jmeter分布式
1. jmeter分布式测试
在使用jmeter进行性能测试时,如果并发数比较大(比如项目需要支持10000并发),单台电脑的(cpu和内存)可能无法支持,这时 可以使用jmeter提供的分布式测试的功能。
1.1 jmeter分布式执行原理
1.2 代理机(agent)配置
1.3 控制机(controller)配置
1. 修改jmeter的bin目录下jmeter.properties配置文件,修改`remote_hosts` - 示例:`remote_hosts=192.168.182.100:1099,192.168.182.101:1099` - ip和port是agent机的ip以及自定义的端口,多台agent之间用","隔开 2. 将rmi ssl设置为禁用 - 打开bin/jmeter.properties文件,修改为:server.rmi.ssl.disable=true 3.启动jmeter 4.选择菜单:运行-->远程启动/远程全部启动
1.4 案例
一台控制机和两台执行机,做分布式;要求控制机启动,两台执行机执行,反馈结果;
实现步骤
1.5 备注
jmeter测试报告
1. 聚合报告
位置: 测试计划->右键->监听器->聚合报告
2. 生成html测试报告
jmeter支持生成html测试报告,以便从测试计划中获得图表和统计信息。
2.1 命令
2.2 查看测试报告
打开index.html,就可以看到页面左侧有三个菜单:
2.3 dashboard
test and report information
apdex (应用性能指标)
计算每笔交易apdex的容忍和满足阈值基于可配置的值,范围在 0-1 之间,1表示达到所有用户均满意 t(toleration threshold):容忍或满意阈值 f(frustration threshold):失败阈值
requests summary(请求总结)
成功与失败的请求占比,ko指失败率,ok指成功率
2.4 chart(图表)
它包括over time(时间变化) 、throughput(吞吐量) 、response times(响应时间)
jmeter性能测试常用图表
1. 常用平均并发数计算公式
pv:(page view)即页面访问量,每打开一次页面pv计数+1,刷新页面也是。pv只统计页面访问次数。uv(unique visitor),唯一访问用户数,用来衡量真实访问网站的用户数量。
一般用uv统计用户活跃数,用pv统计用户访问页面的频率
1.1 普通计算方法
计算公式:tps= 总请求数 / 总时间
1.2 二八原则计算方法
二八原则就是指80%的请求在20%的时间内完成
计算公式 : tps = 总请求数 80**% / (总时间20%)
1.3 按照业务数据进行计算
业务数据:有的公司会统计一定时间内的所有业务数据,我们可以根据这个业务数据曲线图,统计出最多请求的数量和时间比例。
曲线图看趋势
直方图看数据和趋势
计算模拟用户正常业务操作(稳定性测试)的并发量:
根据这些数据统计图,可以得出结论:
结合二八原则计算公式 : tps = 总请求数 80**% / (总时间20%)
计算模拟用户峰值业务操作(压力测试)的并发量:
根据这些数据统计图,可以得出结论:
算压力测试的并发数:tps = 峰值请求数/峰值时间 * 系数
练习
2. 插件管理包工具
说明:下载jmeter插件管理工具包(可以用此包下载jmeter插件)
1.1 应用步骤
下载: https://jmeter-plugins.org/install/nstall/
将jar包添加到jmeter中
提示:存放到jmeter安装目录 lib\ext\目录下
3. 性能测试常用图表及组件
3.1 concurrency thread group 线程组
说明:阶梯线程组
添加方式:测试计划 --> 线程(用户)--> concurrency thread group
3.2 transactions per second
说明:每秒完成事务数 场景:统计业务成功率
添加方式:测试计划 --> 线程组--> 监听器-->transactions per second
提示:需要配合事务控制器完成,如果不使用事务控制器,默认1个请求为1个事务
3.3 bytes throughput over time
说明:查看服务器吞吐流量 单位/字节
添加方式:测试计划 --> 线程组--> 监听器-->bytes throughput over time
3.4 perfmon metrics collector
说明:用来监控服务端的性能的工具,包括cpu、内存、磁盘、网络等性能数据
添加方法:线程组->监听器->jp@gc - perfmon metrics collector
注意:使用之前需要在服务器端安装监听服务程序并启动
监控服务器服务程序:
-
下载安装包serveragent-2.2.3.zip,链接地址:github - undera/perfmon-agent: server metrics fetching agent, based on sigar
-
解压serveragent-2.2.3.zip
-
启动,如果是windows运行startagent.bat,如果是linux运行startagent.sh
-
启动这个工具后,jmeter的插件jp@gc - perfmon metrics collector就可以收集服务端的资源使用率,并在jmeter中查看了
发表评论