【任务描述】:前面已经分析完某公司企业网站内容管理系统的性能需求,如何使用性能测试工具设计和开发对应的测试脚本?
【任务目标】:通过设计和开发文章新增功能的测试脚本,掌握JMeter性能测试工具的线程组、HTTP请求、HTTP Cookie管理器、查看结果树、HTTP请求默认值等元件的基本使用,掌握Fiddler抓包工具的基本使用。
【任务储备】:
1、Fiddler
Fiddler是一款免费的、基于Windows系统的代理服务器软件(即Web调试抓包工具),由Eric Lawrence用C#语言在2003年10月发布了第一个版本。当启动Fiddler时,它会自动注册成Windows Internet(WinINET)网络服务代理,从而就能捕获本地所有的HTTP和HTTPS数据流,其运行原理图如下图所示。

客户端(例如Web浏览器、iOS移动设备等)发送请求后,Fiddler会将数据包拦截,假装自己是客户端再发送给服务器,服务器响应后,Fiddler也会拦截返回的响应数据,再转发给客户端。在Fiddler介入后,就能实现过滤数据流、解密HTTPS、调试断点、修改请求或响应等功能。
Fiddler运行主界面分为左右两栏,左边按照请求顺序显示会话列表,右边显示Fiddler工具提供的功能页签,包括Statistics、Inspectors、AutoResponse、Composer、FiddlerScripts、Log、Filters、Timeline、Fiddler Orchestra Beta九个页签,具体运行界面如下图所示。

v Statistics,通过该页签,用户可以通过选择多个会话来得到这几个会话的总的信息统计,比如多个请求传输的字节数。访问页面时选择第一一个请求和最后一 一个请求 ,可获得整个页面加载所消耗的总体时间。从条形图表中还可以分别出哪些请求耗时最多,从而对页面的访问进行速度性能优化。
v Inspectors,提供headers、textview、WebForms、hexview,Raw等多种方式查看,一条HTTP请求的请求和响应,它分为上下两部分:上部分为请求展示,下部分为响应展示。
v AutoResponse,通过该页签可以抓取在线页面保存到本地进行调试,大大减少了在线调试的困难,也可以修改服务器端返回的数据,如让返回都是404的数据包读取本地文件作为返回内容。
v Composer,支持手动构建和发送HTTP , HTTPS和FTP请求,还可以从会话列表中拖曳会话,把它放到Composer页签中,点击Execute按钮时则把请求发送到服务器端。
v FiddlerScripts,打开Fiddler脚本编辑。
v Log,打印日志。
v Filters,通过该页签可以对左侧的数据流列表进行过滤,左边的请求列表只显示符合过滤要求的所有请求。
v Timeline,称为Fiddler的瀑布图,用于展示网络请求时间。每个网络请求都会经历域名解析、建立连接、发送请求、接受数据等多个阶段,把多个请求以时间作为X轴,以图表的形式展现出来就形成了瀑布图。在左侧会话窗口点击一个或多个会话,Timeline便会显示指定内容从服务端传输到客户端的时间。
v Fiddler Orchestra Beta,提供远程Web调试的功能。
Fiddler的完整操作视频如下。
2、JMeter
JMeter是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试。 其最初被设计用于Web应用测试,但后来扩展到了其他测试领域,可用于测试静态和动态资源,如静态文件、Java小服务程序、CGI脚本、Java对象、数据库和FTP服务器等等。JMeter可对服务器、网络或对象模拟巨大的负载,在不同压力类别下测试它们的强度和分析整体性能,其运行界面如下所示。

启动JMeter进入工作区,工作区分为三部分:区域①是一个目录树,存放测试设计过程中使用到的元件,执行过程中默认从根节点开始顺序遍历树上的元件;区域②是各个元件的配置区域,可以配置区域①选中的元件各项属性;区域③是菜单栏,图标是菜单快捷方式。
JMeter中一个脚本即是一个测试计划,也是一个管理单元,其至少需要保护下面四个基本要素:
(1)测试计划(TestPlan),一个脚本中只能有一个测试计划,是区域①中目录树的根节点。
(2)线程组,JMeter负载是通过线程组驱动的,一个测试计划中至少要有一个线程组,一个线程组,可以看做一个虚拟用户组,线程组中的每个线程都可以理解为一个虚拟用户,线程组中包含的线程数量在测试执行过程中是不会发生改变的。
(3)取样器,每个线程组中至少要有一个取样器,取样器(Sample)是性能测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,JMete支持多种不同的取样器,如 HTTP Request Sampler、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的取样器可以根据设置的参数向服务器发出不同类型的请求。
(4)监听器,一个测试计划至少要有一个监听器,监听器是用来对测试结果数据进行处理和可视化展示的一系列元件,包括察看结果树、汇总报告、聚合报告等元件。
3、线程组
线程组相当于有多个用户,同事去执行相同的一批次任务,一个测试计划可以有多个线程组,每个线程组之间是相互隔离的,互不影响。添加线程组的步骤为:右击“测试计划”,选择“添加”→“线程(用户)”→“线程组”。
4、HTTP请求
是指从客户端到服务器端的请求消息,包括:请求方法、标识符及使用的协议等。添加HTTP请求的操作步骤为:右击“线程组”,选择“添加”→“Sampler”→“HTTP请求”

v 名称:可以随意设置,一般设置为有业务意义的名称。
v 协议:HTTP或者HTTPS(默认为HTTP)。HTTPS是SSL的连接,较HTTP有较高的安全性,但效率较HTTP低。
v 服务器名称或IP:指定HTTP请求的主机地址。
v 端口号:默认80,如果访问地址中带有其他端口号在此填入。
v 方法:HTTP请求的方法,最常用的有GET和POST。
v 路径:除去主机地址部分的访问链接。
v Content encoding:字符编码格式,默认为iso8859,大多数应用会指定成UTF-8格式。
v 自动重定向:HttpClient接收到请求后,如果请求中包含重定向请求,HttpClient可以自动跳转,但是只针对GET与HEAD请求,勾选此项则“跟随重定向”失效;自动重定向可以自动转向到最终目标页面,但是JMeter是不记录重定向过程内容的,比如在察看结果树中无法找到重定向过程内容(A重定向到B,此时只记录B的内容不记录A的内容,A的响应内容暂且称为过程内容),如果此时要做关联,则无法关联到。
v 跟随重定向:HTTP请求的默认选项,当响应Code是3××时(比如301是重定向),自动跳转到目标地址。与自动重定向不同,JMeter会记录重定向过程中的所有请求响应,在察看结果树时可以看到服务器返回的内容,所以可以对响应的内容做关联。
v 使用KeepAlive:对应HTTP响应头中的Connection:Keep-Alive,默认为选中。
v 对POST使用multipart/form-data:当发送HTTP POST请求时,使用multipart/form-data方法发送,如需要往服务器上传文件时,则必须勾选该选项。
v 与浏览器兼容的头:浏览器兼容模式,如果勾选了“对POST使用multipart/form-data”,建议勾选此项。
v Parameters:同请求一起发送的参数,可以把要发送的参数(就是表单域)与值填到此域,GET方法也适用。
v Body Data:指的是实体数据,就是请求报文里面主体实体的内容,一般向服务器发送请求,携带的实体主体参数,可以写入这里。Parameters和Body Data只能同时使用其中一种方式。
Files Upload:当勾选了“对POST使用multipart/form-data”可以在此一同上传文件。MIME类型有STRICT、BROWSER_COMPATIBLE、RFC6532等。
5、HTTP Cookie管理器
在用浏览器访问Web页面时,浏览器会自动记录Cookie信息,JMeter通过加入HTTP Cookie管理器来自动记录Cookie信息,添加Cookie管理器后选择默认即可。当一个线程组有多个HTTP请求,一个HTTP请求为登录请求,其他请求必须登录成功后才能访问,则必须添加HTTP Cookie管理器元件。添加HTTP Cookie管理器的操作步骤为:右击“线程组”,选择“添加”→“配置元件”→“HTTP Cookie管理器”.
6、HTTP请求默认值
一个测试计划中通常包含同一个系统中的多个HTTP请求,这些HTTP请求很多参数值都是相同的,针对这些相同的参数值配置项,如果对每一个HTTP请求单独设置比较浪费时间和精力,为节省工作量,JMeter提供了HTTP请求默认值元件,可以将多个HTTP请求参数值相同的配置项配置到HTTP请求默认值元件,其他HTTP请求则可以不配置这些配置项。添加HTTP请求默认值的操作步骤为:右击“线程组”,选择“添加”→“配置元件”→“HTTP请求默认值”.
7、查看结果树
察看结果树会显示取样器的每一次请求(每运行一次,结果树多一个节点,不管取样成功与失败),所以大量运行会比较耗费机器资源,因此在正式运行性能测试计划时,建议不开启。添加察看结果树的操作步骤为:右击“线程组”,选择“添加”→“监听器”→“察看结果树”
【任务实施】
为企业网站内容管理系统的文章新增功能模块添加脚本:
1、在JMeter软件中新建一个线程组,线程组名称为:企业网站内容管理系统。
2、设置Fiddler的Filters,让Fiddler只显示企业网站内容管理系统的所有请求
3、在Fiddler软件中识别登录请求,在Inspectors页签查看请求和服务器返回信息,在JMeter线程组“企业网站内容管理系统”下面新建一个HTTP请求。
4、在JMeter线程组“企业网站内容管理系统”下面新建一个HTTP Cookie管理器。
5、参考步骤3,在Fiddler中识别文章新增请求,并根据Fiddler获取到的信息在JMeter线程组“企业网站内容管理系统”下面新建一个名称为“文章新增”的HTTP请求
6、在JMeter线程组“企业网站内容管理系统”下面新建一个“察看结果树”的监听器,点击运行,在察看结果树和系统中查看运行结果。
7、脚本优化。前面“登录”和“文章新增”的HTTP请求填写的IP和端口号相同,为了减少重复配置工作量,在JMeter线程组“企业网站内容管理系统”下面新建一个HTTP请求默认值,将相同的配置放配置到HTTP请求默认值中,并重新运行,在察看结果树和系统中查看运行结果。
完整操作视频如下所示。

