1. Jmeter是什么
如果我们要开发一个网站的话,不能仅仅将目光关注在这个网站的搭建,我们还要关注这个网站的性能如何,比如说能否承载10000个用户在1秒内的同时访问,换言之,就是说这个网站能否承载10000的高并发访问。要想知道网站是否真的有这个功能,只能进行实践,但是我们不可能找10000个人来帮我们做测试,于是相应的压力测试工具就诞生了,我们只要操控这样的一个工具,就能进行高并发的模拟,统计网站的各项数据,评估网站的性能。
很幸运,Jmeter就是众多压力测试工具中的一款,官网点击此处从中可以下载jmeter。
Jmeter使用java开发,开源并且下载方便,这也是其流行的原因之一。
2. Jmeter的使用
2.1 启动
下载完jmeter的压缩包并解压之后,我们发现可以直接使用,没有复杂的安装程序,其实这就是它的一个轻量化的体现。
在\bin目录下,点击jmeter.bat文件即可开启批处理文件,之后会弹出程序窗口,其实这个程序就是用java的GUI组件写的嘛,通过这个.bat文件调用java文件即可开启,当然.bat文件里进行了很多其他的设置,比如设置好堆内存是多少,如果我们创建线程模拟并发发现线程不够用了,在.bat文件这里可以设置堆内存。
2.2 设置语言
由于汉化太烂,所以设置语言为英文,那设置语言自然是要找相应的配置文件啦,在jmeter.properties
里面就可以设置了,要把语言的那句话注释清除掉
2.3 一个简单的例子
先看一个创建好的结构
Test Plan
相当于其它IDE的工程项目,右击可以创建各种项目相关东西。
包括用户定义的变量和library
Thread Group(mytest)
我们的目的是要进行模拟高并发,所以要将这10000个“用户”进行一个分组,其实每一个用户在Jmeter里面就是一个线程,这也是Thread group的由来。
- 线程组里面,可以设置“用户数量”。
- 可以设置这么多用户访问量是在多长时间达到的(一般就是1s就行了,因为这里设置时间长了的话,用户量是从0逐渐递增的,我们想要的是直接把青蛙放入油锅,而不是温水煮青蛙)
- 可以设置loop(换言之是这10000个用户每个用户循环访问多少次,这里先是1就行了)
Sampler(HTTP Request)
有这么多用户之后,我们到底要访问什么网站呢,访问哪个端口呢,用什么请求方式来访问呢,这些东西是不写在Thread Group里面的,要不然耦合性太强了,所以就在sampler里面了。每访问一次网站并且接受请求,可以看做一次“采样”,要访问多个网站,那就可以设置多次“采样”,换言之,那就是新建多个sampler。
明确一点,每个sampler只对应一个网站,要让这10000个用户设置访问不同的网站,就设置多个sampler就行了,没必要再新建Thread Group。
继续明确,sampler是jmeter的核心!
Listener
光访问也不行啊,我们得知道访问的过程怎样啊,不然就让软件这样不知不觉执行了有啥用呢(当然你如果可以在服务器端查看服务器的情况的话当我没说)
常用的listener是这个View Results Tree
文件的保存
保存的文件,就是testplan,和下面的workbench没关系,保存的文件本质上是什么呢,看一下代码就知道,其实就是xml文件,其实如果你足够强的话,完全可以自己写xml文件,然后自己运行(不过谁会放着现成的图形界面不用呢)
2.4 另一个关于录制的例子
概述
所谓的录制,其实就是为了方便我们的操作,我们要测试一个网站,其实就是创建多个sampler并执行的过程,而这样手动一个个创建sampler太麻烦了,能不能直接是一种“录制”的形式呢,比如我们访问一个网站,访问各种链接,这样一个流程我们先走下来,让软件自动记录,自动生成各种sampler,这无疑是极为方便的。
原理
软件要想进行录制,可不是直接屏幕录制,如果真是这样那倒是nb了。jmeter录制的原理,其实就是通过充当代理服务器进行抓包,监听各种请求来实现“录制”。
设置代理服务器
- 要开代理,首先在jmeter里先进行设置,在workbench里面开一个http test script recorder,以后设置端口号,代理服务器的开启就都在这里面了。
- 值得注意的是代理的属性里面有一个grouping,我们需要知道,比如说,即使访问一个简单的有道网页,请求也绝不仅仅是一次完事,包括里面的各种图片啥的都会自动生成新的sampler,这无疑为管理增加了麻烦,而通过设置分组,可以简化我们的管理。只要在sampler里面设置好自动访问内嵌资源,这些图片啥的杂乱的东西就都会自动给访问了,目录结构也会清晰很多。
- 使用火狐浏览器设置代理服务器。(不知为啥其它浏览器报告不是私密连接的错误,不管他们了)
访问
以上配置好之后,开启jmeter代理,在火狐浏览器地址栏输入http://youdao.com即可访问有道主页就可以被抓包录制了。
如果直接输入youdao.com无法正常抓取,也不知道为什么。
3. Jmeter的执行顺序和作用域
3.1 概述
在Thread group里我们可以添加很多不同的组件,我们必须明确:这些组件是有层级关系和先后顺序的
- 同一层级关系的不同组件执行顺序不同。
- 同一层级的相同组件按照先后顺序执行。
- 不同层级的组件作用范围不同。
- 不同层级都有相同组件作用在同一个sampler的时候(比如http default request)冲突的地方按照就近原则,不冲突的地方会叠加。
3.2 举例
层级关系
- 两个sampler的ip都没有,所以得根据http request defaults这个“配置结点”来访问应该访问的网站
- a层级内部的配置为
- a、b并列层级的配置为
访问结果
3.3 开发Jmeter脚本的实质
其实开发一个Jmeter脚本,就是根据上述那么多组件的作用域,通过各种排列组合模拟用户的真实情况,进行开发。
4. Jmeter结合ECShop的一个实战案例
4.1 录制阶段
- 建立以下workbench目录,设置将samplers存入transaction controller,启动代理服务器
- 打开火狐浏览器,设置好代理后,输入
http://xxx.xx.x.xxx:2333
可以进入ECShop主页,此时再进几个子目录,可以发现代理服务器成功录制。(地址不可输入https
,会报错)
上图已剔除不必要的访问sampler,只保留了关键的samplers - 由于在workbench里的东西不会保存,所以我们要明确这里仅仅是起到了一个临时存储的作用。录制阶段结束,关闭代理服务器。
4.2 测试脚本参数化阶段
原因:我们的录制仅仅是省了去自己手工制造sampler的麻烦,但是仅仅是访问几个网页无法覆盖整个网站的网页,比如id=16和id=23这俩根本无法覆盖所有的id情况。所以这里我们就需要进行测试脚本参数化。
类型分析
我们需要分析参数化的东西有哪些类型。
- 网址和端口号,这些是不会变化的
- 各种id之类的,我们录制无法覆盖所有的情况,所以更需要参数化
网址端口号参数化
- 使用
User Defined Variables
来进行参数化控制 - 如图所示建立各种参数
- 如图将所有的samplers进行修改,使用
${内容}
来进行插值
- 注意每一个子网页,他们都有一个refrence,肯定是因为他们得知道从哪里跳转到这个子网页里的啊,也需要改一下。
使用CSV进行id之类的参数化
- 新建
CSV Data Set Config
这个配置元件,里面这样填写
- 在bin目录下新建data文件夹,里面新建
catgd.csv
,在里面填写数据
- 将catgory和goods对应的sapmler的id进行插值
- 将goods的sampler的reference进行插值
- 启动模拟即可实现模拟不同用户随机访问不同的网页。
4.3 实战案例的一个小结
上述的操作可能无法知其所以然,这里稍微总结一下。
- 在ECShop里面,可以进行各种各样的购物,进入主页后,我们首先进入category这样的子网页,通过这个category再进入goods子网页查看详细的商品。
- 我们通过录制,经过剔除,得到了三个关键的sampler,分别访问的是主页(只有一个),category子网页(不同的id有不同的子网页,这里只是录制了我们访问的那个id对应的category子网页),goods子网页(通过category子网页进入,也是有不同的id,我们只是访问了一个)
- 原则上,到这一步后,我们就可以测试了!但是这样扩展性不强啊,我们取样的category只不过是众多id中的一个,我们取样的goods也只不过是众多id中的一个,这样测试的时候也是照着这个样本来的,根本无法代表整个网站,于是就有了参数化,对于网址和ip的参数化其实无所谓,关键是对category和goods的id的参数化,参数化之后,我们只要提供不同的键值对(catid,gdid),这样使用并发模拟的时候,就能取到所有可能的我们所提供的的id了!换句话说,只要我们把所有的category的id和goods的id都提供出来(至于怎么取得所有的那就得问后端了),Jmeter就能保证把这些都覆盖到!(当然前提是模拟的用户得足够多)
- Jmeter模拟的执行过程(假设模拟10个用户):
- 遇到第一个sampler是根目录,10次访问完成
- 遇到第二个sampler是category,发现id参数化了,于是找到csv文件,随机抽10个catid访问,总共也是10次
- 遇到第三个sampler是goods,发现id参数化了,于是根据上面一步的catid,找到对应的gdid继续访问。(注意的一点是第二步的分支决定了第三步的分支)总的来说,第三sampler也总共访问了10次
4.4 校验
我们只是能够访问这个网站其实还不够,我们还应当判断这个网站的内容是不是真的正确,比如在category的一个页面中,我们点击之后还应当是此页面:
现在我们就需要添加断言这个组件了。
添加选择器
我们首先的目的应该是从网页源代码中选择出要判断的对象,于是使用CSS/JQuery Extractor
这个组件(其实还可以使用正则表达式或者是xpath等,这里不演示了)
设置各种属性
添加Beanshell
我们选择出来了还不够,应当进行判断看看是否和我们的预期相符,所以应该添加脚本。
之后进行如下配置,点击运行后,就可以在dos窗口查看打印结果了。