什么是压测,为什么要进行压力测试?JMETER工具的使用
1.背景介绍
JMeter是Apache组织的开放源代码项目,它是功能和性能测试的工具,100%的用java实现,我们今天要用到的就是JMeter的性能测试部分。
首先我们先了解下压力测试的基本概念:
1吞吐率(Requestspersecond)概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。计算公式:总请求数/处理完成这些请求数所花费的时间,即
Requestpersecond=Completerequests/Timetakenfortests
2并发连接数(Thenumberofconcurrentconnections)概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。
3并发用户数(Thenumberofconcurrentusers,ConcurrencyLevel)概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。
4用户平均请求等待时间(Timeperrequest)计算公式:处理完成所有请求数所花费的时间/(总请求数/并发用户数),即Timeperrequest=Timetakenfortests/(Completerequests/ConcurrencyLevel)
5服务器平均请求等待时间(Timeperrequest:acrossallconcurrentrequests)
计算公式:处理完成所有请求数所花费的时间/总请求数,即Timetakenfor/testsCompleterequests可以看到,它是吞吐率的倒数。同时,它也=用户平均请求等待时间/并发用户数,即
Timeperrequest/ConcurrencyLevel
举个跑步的例子进行解释
1.性能测试,表示在一个给定的基准下,能执行的最好情况。例如,在没有负重的情况下,你跑100米需要花多少时间(这边,没有负重是基准
2.负载测试,也是性能测试,但是他是在不同的负载下的。对于刚才那个例子,如果扩展为:在50公斤、100公斤……等情况下,你跑100米需要花多少时间
3.压力测试,是在压力情况下的性能测试。对于刚才那个例子,如果改为:在一阵强风的情况下,你在负重或没有负重的情况下,跑100米需要花多少时间
2.知识剖析
1、录制Jmeter脚本
录制Jmeter脚本有两种方法,一种是设置代理;一种则是利用badboy软件,badboy软件支持导出jmx脚本。
这里我们介绍第二种方法,利用badboy录制脚本,然后导出Jmeter需要的jmx文件。
打开badboy时默认是在录制模式下,可以在窗口标题栏中看到(recording),如果点击工具栏中个红色圆形按钮则进入非录制模式。首先,在地址栏中输入要录制脚本的地址,然后点击绿色按钮即可开始录制;录制完成后点击红色圆形按钮旁边的正方形黑色按钮结束脚本录制(录制的过程和loadrunner类似),在内嵌的浏览器上面操作你需要测试的动作即可,它会记录你的相关行为动作。
录制完成后点击黑色按钮完成录制。
导出jmx文件:
保存为“login.jmx”,
2、打开脚本
使用jmeter打开上面保存的文件“login.jmx”
打开之后如图所示:
3、修改脚本
a、线程组
如果是录制方式打开的jmx脚本默认会场景线程组,如果是手工生成脚本则需要首先添加线程组,右键点击测试计划,选择添加,添加线程组,这里的线程组相当于loadrunner中的用户组。
如上图:
名称:可以随意取,最好取为我们测试场景相关的名称
注释:随意
在取样器错误后要执行的动作:我们选择继续,错误之后依然继续执行
线程数:一般我们用来表示多少个用户,相当于loadrunner中的并发用户数
Ramp-up Period(in Seconds):表示每个用户启动的延迟时间,上述我设为1秒,表示系统将在1秒结束前启动我设置的1000个用户,如果设置为1000秒,那么系统将会在1000秒结束前启动这1000个用户,开始用户的延迟为1秒,如果我设置为0秒,则表示立即启动所有用户。相当于loadrunner中的用户加载策略。
循环次数:如果你要限定循环次数为10次的话,可以取消永远的那个勾,然后在后面的文本框里面填写10;在这里我们勾上永远,表示如果不停止或者限定时间将会一直执行下去,是为了方便调度器的调用。
调度器的配置:我们勾选调度器时,将会出现这个面板
启动时间:表示我们脚本开始启动的时间,当你不想立即启动脚本测试,但是启动脚本的时间不会再电脑旁的时候,你可以设定一个启动的时间,然后再运行那里点击启动,系统将不会立即运行,而是会等到你填写的时间才开始运行。
结束时间:与启动时间对应,表示脚本结束运行的时间。
持续时间:表示脚本持续运行的时间,以秒为单位,比如如果你要让用户持续不断登录1个小时,你可以在文本框中填写3600。如果在1小时以内,结束时间已经到达,它将会覆盖结束时间,继续执行。
启动延迟:表示脚本延迟启动的时间,在点击启动后,如果启动时间已经到达,但是还没有到启动延迟的时间,那么,启动延迟将会覆盖启动时间,等到启动延迟的时间到达后,再运行系统。
注意:如果我们需要用到调度器来设定持续时间,如果线程数不够多到持续时间结束,我们就必须将循环次数勾选为永远,特别地,如果线程组里面有其他的循环,我们也需将该循环次数勾选为永远(如我上面录制的脚本中的Step1也是一个循环,需要将永远勾选),否则,按我如上配置,将永远去掉勾选,文本里填1,那么无论你将持续时间启动时间结束时间等设置多少,系统运行1000次后,将会停止不再运行。
b、关于HTTP请求
关于HTTP请求,我们录制的脚本里面就有,这里就介绍一些常用的属性。
如图所示:
其中:
名称:可以随意取,我们可以根据录制脚本的路径来命名
注释:可以对该界面做一个简单介绍
服务器名称或IP:即我们的服务器或者IP的地址。
端口号:我用的是18080端口,所以设置的端口号为18080
后面的超时定义可以不用填写。
Implementation:这里我们录制时默认填写为JAVA
协议填写为:http
方法为:GET
Content encoding:编码可以不用填写
路径:即页面的路径;下面的重定向等选择可以根据需要勾选,这里我们保持录制不修改。
Parameters参数:即跟着路径一起发送的参数及文件
下面的代理服务器等可以忽略,按需要填写。
c、参数化
如下面图,我们为请求发送的参数来参数化。
上述的例子以登录为例,登录有两个参数:userAccount和password,在实际测试中,当我们需要用到不同的用户来登录的时候,我们就可以对userAccount和password参数化。
1)、我们新建一个文件,这里我新建的是一个txt文件,命名为c.txt,里面的内容为
[email protected],1qaz!QAZ
[email protected],1qaz!QAZ
[email protected],1qaz!QAZ
2)、在jmeter中的【选项】中选择【函数助手对话框】,将会弹出如下对话框:
其中
CSV file to get values from |*alias:要读取的文件路径,为绝对路径
CSV文件列号| next| *alias:从第几列开始读取,注意第一列是
如上图所示,我们读取的是c.txt里面的第一列用户名(如果要读取第二列的密码,只需将0改成1即可,往后类推),点击【生成】按钮即可生成函数,我们使用时即拷贝生成的函数字符串:${__CSVRead(E:\c.txt,0)}。
d、关联
Jmeter中的关联是使用正则表达式提取器来实现的,相对于loadrunner来说jmeter的关联功能比较弱,只能在线程组内实现关联,不能跨线程组。
我们以进入vmall商品列表,然后打开某个上面详情页为例进行关联操作:
第一步:右键点击商品列表的请求> 添加> 后置处理器 >正则表达式提取器
第二步:填写正则表达式
我要获取的值原本服务器返回的结果是:以下是左边界和右边界
解释:
(1)注释不多说,随便自己喜欢
(2)Apply to:默认即可
(3) 要检查的字段:一般我们选择主体,即服务器返回给我们的页面主体信息
(4)引用名称:即参数名称,这个自己定义,在后面时可用
(5)正则表达式: 正则表达式中()括起来的部分就是要提取的。.代表任意字符,+代表出现任意次,后面加?。
(6)模板:$1$代表只取一组数据
(7)匹配数字:0代表随机取值,1代表取找到的第一个值,2代表去找到的第二个值,依次类推。
(8)缺省值:如果参数没有取得到值,那默认给一个值让它取
第三步:在商品详情页请求中使用关联的参数值
在第二步填写的引用名称中加入${},然后替换掉需要关联的地方,这里把整个url替换了。
e、断言验证
在web测试中,有的时候,即使我们测试返回的response code为200,也不能保证该测试是正确的,这时候,我们可以用到响应断言,通过对比响应的内容来判断返回的页面是否是我们确定要返回的页面,或者判断请求是否成功,相当于loadrunner中的检查点。
选择我们要判断的页面,点击添加断言----响应断言,将会出现如下图:
名称:随意,这里我们不做改动
注释:随意
Apply to:这里我们选择默认值
要测试的响应字段:这里我们选择响应的文本,即返回的页面信息
模式匹配规则:这里我们选择包括,即响应的文本是否包括我们验证的信息
要测试的模式:title="商品详情">,即我们需要验证, title="商品详情"> 是否在响应文本中存在,也可以添加更多的字段来验证。
如果没有找到需要匹配的字符串则事务会失败。
4、调试脚本
调试脚本一般是通过添加查看结果树监听器、查看jmeter运行日志、查看控制台日志实现
查看结果树
Jmeter运行日志
控制台日志
有时jmeter的控制台也会打印错误日志,如果是java请求打印的显示结果会在这里显示。
5、添加setUp ThreadGroup、tearDown Thread Group线程组
setUp Thread Group 相当于loadrunner的vuser_init部分,在运行过程中只执行一次,用于初始化动作。
tearDown Thread Group 相当于loadrunner的vuser_end部分,在运行过程中只执行一次,用于关闭动作。
根据测试场景是否需要来添加setUpThread Group、tearDownThread Group线程组。
3.常见问题
1.JMeter的使用步骤
(1)添加线程组
(2)添加http请求
(3)在http请求中写入接入url、路径、请求方式和参数
(4)添加查看结果树
(5)调用接口、查看返回值
2.压测任务需求的确认
压测前要明确压测功能和压测指标,一般需要确定的几个问题:
1. 固定接口参数进行压测还是进行接口参数随机化压测?
2. 要求支持多少并发数?
3. TPS(每秒钟处理事务数)目标多少?响应时间要达到多少?
4. 压服务器名称还是压服务器IP,一般都是压测指定的服务器
3.压测设置
1. 线程数:并发数量,能跑多少量。具体说是一次存在多少用户同时访问
2. Rame-Up Period(in seconds):表示JMeter每隔多少秒发动并发。理解成准备时长:设置虚拟用户数需要多长时间全部启动。如果线程数是20,准备时长为10,那么需要10秒钟启动20个数量,也就是每秒钟启动2个线程。
3. 循环次数:这个设置不会改变并发数,可以延长并发时间。总请求数=线程数*循环次数
4. 调度器:设置压测的启动时间、结束时间、持续时间和启动延迟时间。
4.编码实战
线程组设置:
HTTP请求设置:
聚合报告:
查看结果树:
5.拓展思考
压测结果的分析
1. 有错误率同开发确认,确定是否允许错误的发生或者错误率允许在多大的范围内;
2. Throughput吞吐量每秒请求的数大于并发数,则可以慢慢的往上面增加;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数;
3. 压测结束,登陆相应的web服务器查看CPU等性能指标,进行数据的分析;
4. 一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。
5. 影响性能考虑点包括:数据库、应用程序、中间件(tomact、Nginx)、网络和操作系统等方面。
6.参考文献
https://zhidao.baidu.com/question/498084507.html
http://www.51testing.com/html/56/n-3723356-2.html
https://blog.csdn.net/github_27109687/article/details/71968662
7.更多讨论
8.鸣谢
感谢观看,如有出错,恳请指正