环境搭建
1.安装java 8.0以上版本
2.下载jmeter并安装。安装参考网址:https://blog.csdn.net/wust_lh/article/details/86095924
3.打开JMeter中bin目录下面的jmeter.bat文件即可打开JMeter了,打开的时候会有两个窗口,Jmeter的命令窗口和Jmeter的图形操作界面,不要关闭命令窗口。(也可以配置环境变量,在cmd下使用jmeter启动)
Jmeter各组件的执行顺序
1、配置元件:配置一些全局参数
2、前置处理器:运行前需要处理的数据
3、定时器
4、取样器(sampler)
5、后置处理器 :处理响应结果
6、断言
7、监听器
请求并查看响应
a.添加线程组
添加取样器–HTTP请求
添加监听器,查看结果树。
6.
查看结果树:
get/delete/put请求
GET请求
put请求
delete请求
断言
想要看到断言结果,需要添加监听器,断言结果
添加响应断言
两个断言都失败了?为什么我这返回的没有百度一下。
响应结果的中文都是乱码了。
参考这篇文章解决
https://www.cnblogs.com/xiaxiaoxu/p/9607017.html
再次请求,一条断言成功,一条断言失败。
响应断言,JSON断言
https://www.jianshu.com/p/0ab3e5e22673
响应断言
响应断言的适用于返回的是HTML文本,或者是XML文本等格式,控制面板中允许添加要与请求或响应的各个字段进行比较的模式字符串。
json断言
json断言
1.json断言,请求结果需要是json格式的
注意这里$后面必须有一个点.
2.添加断言结果
断言失败才会在断言结果中显示。
定时器
同步定时器
https://www.cnblogs.com/xueli/p/17037031.html
用来配置同时多少个线程执行。主要是设置分组。
10个线程,2组,则并发是5。
配置元件
HTTP信息头
请求,会发现request headers有显示添加上的信息头
CSV data set config
配置元件之CSV数据文件配置
添加CSV Data Set Config
CSV数据文件配置
在变量名称处填写变量,如果需要忽略首行,则设置为True。
CSV文件
设置变量引用 ${变量名}
这个设置后,还需要设置线程组的数量,如测试数据有100个,则线程组设置100个,即可读取100个测试数据。
用户定义变量
21天Jmeter打卡day15 配置元件之用户定义的变量+抽离公共数据
https://www.jianshu.com/p/b2e40ff62952
添加配置元件,用户定义的变量
把协议和请求设置为用户自定义变量
设置引用
执行请求,读取变量成功
逻辑控制器
循环控制器
逻辑控制器之循环控制器
https://www.jianshu.com/p/53335b2ff9be
添加循环控制器,设置循环次数为2
这样设置,就是执行四次
注意循环控制器内的组件会被循环执行,如果组件不在循环控制器内,则不会被循环。
如图,HTTP请求和CSV配置,都在控制器内。
If控制器
逻辑控制器之if和简单控制
https://www.jianshu.com/p/9e3838cfb220
1.读取所有数据 循环控制器设置次数为6
2.添加if控制器 注意接口需要在if控制器下
3.登录名不等于IDO127
线程用户
setUp和tearDown
setup一般可用来请求登录接口,返回token.
其实学过unittest,就知道setup和teardown分别是测试类的初始准备工作和结束工作。
监听器
21天Jmeter打卡Day14 监听器之查看结果树+断言结果+聚合报告+图形结果+表格查看结果
https://www.jianshu.com/p/c81806d82142
先写文件路径,再执行线程。
察看结果树
jtl格式的打不开?
响应断言
断言结果
汇总报告:
聚合报告
聚合报告各项意思:
Label:请求的名称,就是我们在进行测试的http request sampler的名称
Samples:总共发给服务器的请求数量,线程组中有一个用户,循环50次,总共就50个请求
Average:默认情况下是单个 Request 的平均响应时间,当使用了 Transaction
Controller 时,以Transaction 为单位显示平均响应时间 ,单位是毫秒
Median: 50%用户的请求的响应时间,中位数
90%Line:90%的请求的响应时间95%Line:95%的请求的响应时间
99%Line:99%的请求的响应时间
Min:最小的响应时间
Max:最大的响应时间
Error%:错误率=错误的请求的数量/请求的总数
Throughput: 默认情况下表示每秒完成的请求数(Request per Second),当使用
了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per
Second 数 (这个就是QPS,我们设置的虽然是10,但是这里显示9.1,这样也没关系的,
会有一点上下浮动)
Received KB/sec: 每秒从服务器端接收到的数据量
断言结果
如果没有写断言,或者成功,只显示请求名称。
图形结果:
表格查看结果:
断言结果写入文件:
后置处理器
json提取器、BeanShell后置处理程序接口关联
参数传递 token传递,接口关联
https://www.jianshu.com/p/e3a116f7bf6b
实现效果,把第一个请求的响应结果,提取出来,作为变量传入第二个请求。
1.在请求下添加【JSON提取器】和【BeanShell后置处理程序】。
可以在要提取的接口的响应结果通过json path 来测试下能不能取到值。
同线程组和不同线程组,用的变量不一样。同用的是vars,不同用的是props
//同线程组
vars :操作 jmeter 变量,它是测试用例与 BeanShell 交互的桥梁,常用方法:
vars.get(String key):从jmeter 中获得变量值
vars.put(String key,String value):数据存到 jmeter 变量
//跨线程组
props :操作 jmeter 属性,该变量引用了 JMeter 的配置信息,可以获取Jmeter
的属性,它的使用方法与 vars 类似,但是只能 put 进去 String 类型的值,而不能是一个对象。
props.get(“START.HMS”);START.HMS 为属性名,在jmeter.properties 中定义
props.put(“PROP1”,“1234”);
同线程组设置变量
在第二个请求中读取该变量,注意需要加双引号
也可以在信息头中读取该变量
查看结果。token成功读取到值。
请求头也成功读取到值。
跨线程组:
后置处理器_JSON_正则表达式_边界提取器_完成删除场景模拟测试
https://www.jianshu.com/p/5c1d64e5d724
Json提取器见Day16
正则表达式
正则表达式提取器填写引用名称和表达式
BeanShell后置处理程序提取变量并赋值
在下一个接口引用变量
{
“blog_name”:“21天打卡”,
“bolg_title”:“Jmeter打卡之Day16”,
“blog_details”:“21天打卡”,
“token”:“${__P(loginName,)}”
}
前置处理器
前置处理器_熟悉常用组件
前置处理器使用场景
1、准备测试数据
2、数据加密–BeanShell 预处理程序
3、连接数据库取数据 --JDBC预处理程序
https://www.jianshu.com/p/84866b2315f8
BeanShell 预处理程序
这里引用了用户自定义变量中的passwd,并把这个值加密为passwd_base。
在登录接口请求中引用加密后的密码(我这里请求后失败了,没找到原因)
数据库连接
21天Jmeter打卡Day19 JDBC连接数据库增删改查,抛出变量
https://www.jianshu.com/p/2d1a3ae8cbd7
1.安装Mysql驱动
下载地址:https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.44.zip
解压后将.jar驱动文件拷贝到jmeter安装目录lib文件夹下
2.JDBC connection Configuration
添加JDBC connection Configuration
参数说明:
Variable Name:数据库连接池的名称,名字可自定义,但是必须与* * JDBC Request中的Variable Name保持一致
Database URL:数据url jdbc:mysql://主机ip或者机器名称:mysql监听的端口号/数据库名称,例如:jdbc:mysql://localhost:3306/sqltest
jdbc:mysql://localhost:3306
JDBC Driiver class:JDBC驱动
Username:数据库登录的用户名
Password:数据库登录的密码
3.添加JDBC Request
参数说明:
Variable Name:数据库连接池的名字,需要与JDBC Connection * * * Configuration 的 Variable Name Bound Pool 名字保持一致
SQL QUERY:多条sql语句,需要用“;”隔开
Select Statement:仅支持测试select语句,并且一次只能测试一条
Update Statement:支持测试费select语句,并且支持测试多条
若中夹杂select语句,会自动忽略若第一条语句为select语句,则会报错
Callable Statement:语法正确,支持多条任何语句,如果需同时执行多条语句,JDBC Connection Configuration 中 Database URL,配置中加上?allowMultiQueries=true,否则报错(例如:jdbc:mysql://localhost:3306/sqltest?allowMultiQueries=true)
Parameter valus:参数值
Parameter types:参数类型,(例如:int char varchar等)
Variable names:保存sql语句返回结果变量名
Result variable name:创建一个对象变量,保存所有返回的结果
Query timeout:查询超时时间
Handle result set:定义如何处理由callable statements语句返回的结果
4.运行线程,查看结果。
添加一个察看结果树,运行线程。
可以看到成功取出数据库表中的数据。
5.引用变量
在JDBC_Request中声明变量
在需要用到变量的请求中引用,注意这里_1表示取结果的第一个值。
在请求结果可以看到,成功取到第一个值。
作业场景
使用上述的操作方法,自行完成Jmeter操作数据库并取出里面的值(一个就好,有兴趣的可以取出所有的),并思考这个JDBC request能在测试中帮助我们做什么工作?
作用:取出数据库的测试数据
疑问,login_name_1只取出了第一个值,如果操作能将取出的所有值都赋值给同一个请求呢?–foreach控制器
ForEach控制器
参数说明:
输入变量前缀:本例中为login_name(与JDBC Requse中的返回结果Variable names变量名一致)
Start index for loop (exclusive):循环开始的索引(默认从0开始,如果填写是2,实际是从2+1个开始执行)
End index for loop(inclusive):循环结束的索引
输出变量名称:提供给其他控件引用,可自定义,调用时使用该参数
Add“-”before number:输入变量名称中是否使用-进行间隔。
将需要循环取值的请求放在ForEach控制器下,这里输入参数为${login_name},每次Foreach从数据库取出一个值,就执行一次请求。
执行请求,数据库一共15条数据,这里执行了15次请求,每次取出了一个loginname赋值给请求。
测试报告
生成HTML测试报告
参考:https://www.jianshu.com/p/bc42f8c69fee
方式一:GUI生成
方式二:CLI生成
修改JMeter 下 bin 目录中的jmeter.properties 配置文件
jmeter.save.saveservice.output_format=csv
在测试脚本文件路径下,执行cmd 命令:
参数说明:
参数 说明
-n 非GUI 模式执行JMeter
-t 执行测试文件所在的位置
-l 指定生成测试结果的保存文件,jtl 文件格式
-e 测试结束后,生成测试报告
-o 指定测试报告的存放位置
//1.无.jtl文件生成测试报告(注意修改路径)
jmeter -n -t test.jmx -l result.jtl -e -o html
//jmeter是执行命令, -n -t 参数,test.jmx是jmeter文件(可以带路径),-e -o 是参数 ,html是位置
这种方式以非GUI模式执行jmeter,先生成jtl文件,再生成html报告。
从测试报告可以看出,sorcefile是result.jtl
执行结果100%pass
JDBCRequest执行了一次,初始化退出request执行了15次。
//2.利用已有.jtl文件生成报告(注意修改路径)
jmeter -g test.jtl -o /path
生成的测试报告(自带的是性能测试报告,附带很多信息),官网详解:
https://jmeter.apache.org/usermanual/generating-dashboard.html
fiddler结合jmeter
参考 https://www.jianshu.com/p/b3dcc28108f0
分布式测试
多台测试机协助完成测试任务,就称为分布式。
比如我现在需要测试1500个用户的并发,用一台电脑测试,电脑可能会卡死,这时我就可
以使用分布式,分到3台电脑上,每台电脑测试500个。
分布式实现思想:控制机分配任务->执行机,执行测试->将结果给控制机->控制机汇总结
果。
Jmeter分布式环境搭建
下面说明一下使用一台控制机,两台执行机来测试,如何搭建环境。首先要有3台电脑,如果没有,可以暂时使用一台电脑模拟3台,模拟方式:
1、将Jmeter的环境复制3份出来(如果是真实的3台电脑就不需要这样)
2、因为需要联网进行数据交互,所以修改一下执行机的端口号(如果是真实的3台电脑也
不需要修改端口号了,因为IP地址肯定不一样)
修改方式:找到执行机A->bin目录->jmeter.properties文件,用记事本打开它。往下
拉找到“#server_port=1099”,将#去掉,修改端口号为5553(尽量大一些,省得跟其
它冲突),执行机B的也同样方式修改。
3、修改控制机的remote_hosts的值,告诉控制机需要控制哪台机器:
remote_hosts=127.0.0.1:5553,127.0.0.1:5554
(如果使用的是真实电脑测试,将电脑的IP放过来就可以)
ps:环境搭建完毕,注意重启。
分布式测试
在控制机下编写脚本
这里我们就拿前面的关联那个章节的脚本用吧,将线程数设置为20,添加聚合报告
2、启动所有的执行机,执行机可以不需要界面,只启动Jmeter服务即可(bin目录下的
jmeter-server.bat文件)
3、将测试任务分配给执行机(运行->远程全部启动)测试结果在我们的控制机上就有了,点开聚合报告可以看到请求数刚好40,两台机器,每
台20.
Jmeter 扩展组件-图形监视器
不是Jmeter官方的,第三方开发的组件,即扩展组件
图形监视器:监视服务器的内存、硬盘、CPU、网络等。模拟生产状态下,服务器状态的
测试。
客户端,右键点击线程组->添加->监听器->jp@gc - PerfMon Metrics Collector
然后点击Add Row,可以选择监控CPU、IO、内存等,将前面的IP地址改为服务器IP地
址,端口一般默认是4444.
如果监听器中找不到“jp@gc - PerfMon Metrics Collector”,那去下面这个链接下载一
下:JMeterPlugins-Standard、JMeterPlugins-Extras,然后解压到这个路径
下:…\apache-jmeter-3.1\lib\ext
插件下载链接:Install :: JMeter-Plugins.org
服务器端需要安装ServerAgent,下载后将ServerAgent-2.2.1.jar上传到被测服务器,解
压,进入目录。如果是Windows环境,双击ServerAgent.bat启动;linux环境执
ServerAgent.sh启动,默认使用4444端口,出现如下情况即服务端成功:另外,
添加监控响应时间:右键点击线程组->添加->监听器->jp@gc - Response Times Over
Time
监听吞吐率即每秒的事务数:右键点击线程组->添加->监听器->jp@gc - Transactions
per Second
都添加好之后,点击运行,查看结果即可。
性能压力测试
模拟多种场景测试程序的响应时间、出错率等
参数化:尽量避免从外部读取参数(测试性能,尽量避免影响性能测试结果的事件),直
接通过固定参数+函数形式(__counter())
察看结果树:只保留最外层的察看结果树
报告:最外层添加聚合报告,察看结果更方便
线程组:增删改查分别放到不同线程组,尽量不放到一个线程组内,方便对单个请求做测
试
分布式:如并发量比较大,采用分布式测试
新增/删除:新增和删除接口,建议不要采用时间模式(定时器)来压测,直接使用线程数
和循环。(新增和删除高并发情况比较少)
需求1:在300秒内启动100个用户,每个用户访问10次服务器,平均响应时间在10ms内,
错误率为0.
300秒内,是设置线程组的线程属性Ramp-Up Period值;100个用户表示:线程数为
100;每个用户访问10次:循环次数10;
需求2:100个用户同时访问服务器,平均响应时间为10s内,错误率0.
100个用户同时:线程数为100,然后设置集合点:添加->定时器->Synchronizing
Timer,分组数为100
需求3:100个用户,以20QPS的频率访问服务器资源,持续10s,要求平均响应时间为30s
内,错误率0.
100个用户:线程数为100;20QPS:表示一个用户20次/秒去访问服务器(添加->定时
器->Constant Throughput Timer);持续10s,那么循环次数应该为20*10=200