由于公司在来年需要进行压力测试,所以也就借节假日的机会来学习一下压力测试的步骤,由于本人的学习时间比较短,希望各位大神朋友们能够多多的谅解并指正在下的错误,在此仅表敬意
1、初入门的压力测试工程师
2、为入门但是打算在软件测试方面发展的同学
3、对软件测试有浓厚的兴趣的人
压力测试初窥探
压力测试顾名思义就是通过模拟指定的用户数量同时访问网站从而达到对网站进行施压,进而测试出网站在高并发问题上的性能优势劣势以及应对DDOS攻击的防护能力,这也是考验一个网站的健壮性的一个特点(本人认为的),目前主流的压力测试工具有Jmeter、RoadRunner,其中RoadRunner是有惠普公司开发的一款非开源的商业软件,在性能测试方面可以说是市面上最牛的测试工具,但是由于其使用需要收费,对于很多自营公司但是资金又不是十分的充裕来说,这样一笔费用确实比较难让人接受,所以在此我就推荐大家使用另外一款压力测试工具Jmeter,其在测试方面虽然相比于RoadRunner来说还是有很多的不足但是由于Jmeter是开源的,而且基本上可以完成公司正常的测试要求,所以Jmeter这一款软件才是我认为的最佳的压力测试工具
Jmeter软件的安装
Jmeter软件是纯JAVA开发的软件,所以需要配置JAVA的运行环境才能够运行,具体的 配置JAVA环境请点击本链接
环境安装完成后再命令行中运行中直接运行命令java,出现下面的内容即为安装成功
安装成功后直接打开bin目录下面的jmeter.bat文件,初次打开可能会久一点,请耐性等候
Jmeter的几个常见的概念
1、测试计划,所有的测试工作都要基于测试计划来进行,一个测试项目中就只能存在一个的测试计划,测试计划在整个项目中充当的是一个全局设置的作用,这样也就不难解释为什么一个项目中就只能有一个测试计划
2、线程组,线程组顾名思义也就是相当于很多线程的一个集合,在项目中可以有多个的线程组,线程组在项目中主要是集合对一个对象进行测试的线程,比如说你想测试A网站和B网站,这个时候你就可以通过创建两个线程组来完成这个任务
3、HTTP请求,HTTP请求的原理是通过创建HTTP的多条请求,从而达到测试网站性能的作用,HTTP请求也是压力测试中最为常见的,其他的还有数据库测试、FTP测试等
好了,在这里就不多说了这些概念了,接下来就来进行一个简单的应用,其他的概念会在下面提到
Jmeter的简单应用
Jmeter最为大家所认识的是它在对网站性能上的测试,所以就从这个开始介绍
任务:模拟5个用户同时访问,并且访问的时间要在2秒内结束,目标网站是http://www.cnblogs.com/st-leslie/
分析:模拟5个用户其实说白了也就是模拟发送五条HTTP请求,这个相信大家都应该知道的吧,不解释了。
1、打开Jmeter,并将测试计划命名为FirstDemo,如下图所示
2、测试计划创建完成下一步是创建线程组,线程组中主要有线程数、Ramp-Up Period、循环次数,调度器下面我们就来对这几个参数简单的介绍一下
线程数:线程数相当于要虚拟的用户
Ramp-Up Period:相当于是线程所用的首次循环的时间范围,后面会进行详细的解释
循环次数:用户循环的次数,循环次数为永远默认不勾选,这个的主要好处是用来绘制图标图标所用,后面进行详细解释
调度器:调度器主要是用来设定特定时间运行所用的
根据本次的测试任务要求,线程数我们设置为5,Ramp-Up Perod我们设置为2,循环次数设置为1,如下图所示
3、线程组创建完成下面就来介绍一下最核心的部分,创建HTTP请求,HTTP请求的创建流程是:线程组=>添加=>Sampler(取样器)=>HTTP的请求,下面是HTTP请求的主要参数,其他的参数比较简单就不做介绍,相信你读者都会懂的
服务器名称或IP:这里指的是你要访问的目标主机的域名
注意:在输入的时候切记不要将"http://"输入其中这样jmeter会出错,直接写WWW即可,本题也就是输入 www.cnblogs.com/st-leslie/
端口号:默认的HTTP的端口号是80端口,这个默认的端口号可以不填
协议:指的是数据传输协议,一般我们填写的是HTTP协议
方法:提交信息的方法,一般我们常见的是GET,POST方法
路径:指的是发生错误所要重定向的URL地址或者本地localhost地址
同请求一起发送参数:这个参数相当于GET或者是POST方法提交的一些用户的自定义信息,这个参数除了可以接受直接设置,也可以使用CSV进行设置
同请求一起发送文件:这个的使用方法跟上面的相似就不介绍了
其他的一些参数比较少用到,一般不设置
将HTTP请求设置为如下图:
4、好了,基本上已经完成了测试的搭建,现在可以直接的运行,运行的快捷键是Ctrl+R,也可以使用下面的按钮
但是你会发现这样运行之后你什么现象都没有看到,这是正常的,因为这样虽然理论上已经搭建完成但是缺少了一个监视器,所以你是没有办法查看结果的,其中监视器的位置是在添加=>监视器下面。常见的监视器有:聚合报告、用表格查看结果、查看结果树、图形结果
聚合报告:我们能够从聚合报告中获取相关的测试结果,这个也是我们分析结果的主要依据,这个显示的是同一HTTP请求
用表格查看结果:通过表格的形式将结果呈现,从这里我们可以看到每次HTTP请求发送的情况,相比于聚合报告如果同一个请求发送给多次聚合报告是不会记录的,但是用表格查看结果是会将其进行记录
查看结果树:这个跟表格查看结果有点相似,但是比起根据有详细的发送请求的信息,以及返回的结果可以查看
图形结果:这个顾名思义地球人都懂
这里的监视器的用法都是一样的,我们就以聚合报告为例,为HTTP请求添加聚合报告,其他的监视器的使用方法基本相同
层级关系如下:
好了,这样便是真正的大功告成了,运行结果如下:
1、Label:HTTP请求的名称, 这里是采用默认的名称
2、#Samples:这个是指,采集器的数量,计算公式是:线程数*循环次数
3、这些样本中HTTP的平均时间
4、样本的中位数时间,本题中的时间是从大到小排列的第3位,其中Average和Median比较相近,这个也反映了这组请求的时间起伏不大
5、90%Line:指的不是Average*100%*90%,而是假如有10个数,那么我们去的就是百分之90的位置的数,也就是从小到大排列的第9位
5、Throughout:这个也就是我们常说的吞吐量,主要是用来衡量网站性能的关键指标,一个网站的吞吐量越高意味着性能越强
6、其他的参数是最小时间、最大时间、出错率、流量查看
实践经验篇
正如上面所说的我们可以把聚合报告放在HTTP请求目录的下面,但是不知道有没有人跟我想的是一样的,就是聚合报告可不可以放在线程组层级的下面,下面我们就来验证这个说法,如下图所示:
从上图我们可以发现,这两个层级关系都是一样的(虽然里面的数据不同,但是这些可能会受到网络流量等其他的一些网络环境所影响),那聚合报告(监视器)到底与HTTP请求之间的关系是什么呢?这里我们可以先猜测然后进行验证,我们猜测监视器的作用范围是监视同级以下的Samples,现在我们就来验证,如下图所示
聚合报告的结果是聚合报告1
聚合报告
聚合报告3
由此可以看出,聚合报告1=聚合报告+聚合报告3
下面我们就来谈谈并发的问题,如上面所示,我们一般人会以为只要把时间设置为 Ramp-Up Period =0的时候就一起发送的,其实并不然,下面我们就来举例看看 Ramp-Up Period 这个是怎么一回事,先清除所有的测试内容,然后在HTTP请求的下面添加用表格查看结果,如图所示:
我们可以从红色的框内发现,2s指的是所有线程一次循环的时间是在两秒钟以内,但是0s就不是这样的效果了,这个有谁知道请留言一下,大家学习学习
好了,怎么实现真正意义上的同时并发呢?这个其实我们可以引入Synchronizing Timer定时器,我们只要在Number of Simulated Users to Group by选项中设置并发数便可以了,但是这个并发数一定要小于线程数要不然就不会发生触发,下面我们就来看看这个的运行情况
看到了吗?HTTP请求中的Samples不是一条一条加上去的,而是一下子就5条Samples同时出现
如上面所说的,测试计划其实就是提供一个全局设置,但是在Jmeter中还有一个可以提供全局设置的地方就是在前置处理器下面的用户参数, 如下图所示,我们将80端口号用port变量来代替
然后将HTTP请求改为下图所示
这个设置你也可以在测试计划中添加效果都是一样的
对了,可能有些读者以前是熟悉RoadRunner测试工具的,会认为 RoadRunner测试工具 有比较直观的图形化可以进行比较,其实这个在Jmeter中也是有的,你只要在监视器中添加图形结果即可以看到,但是这个图形结果一般我们会将循环次数设置为永远,循环次数太少就没有什么比较的意义
我们就以循环5次和永远来进行比较一下
循环5次:
循环永远
哈哈,是不是直观了好多呢(笑点低)
上文中我们有写到CSV的用法,其实CSV的用法有点类似用户参数的设置,具体请看 这里
结尾
好了,这一章就说到这里了,虽然短短的3天去学习这个工具但是真心感觉这个工具很是强大,比人才疏学浅里面有什么说错的地方希望大家指正指正,而且对 Constant Throughput Timer定时器 的使用一直不太清楚,有懂的读者直接在下面留言,最好详细一点,谢谢大家,春节快乐