在上篇,我们了解了性能测试相关的一些基础内容,那么这篇开始,我们来看看性能测试的经典代表工具LoadRunner。本篇内容分为脚本生成,脚本增强处理以及场景运行三个大模块。对于工具的安装过程跟我们安装其他软件一样,所以在此不再赘述。
在正式讲解工具使用之前,还请大家先了解LoadRunner组成及工作原理,这个对今后的工作以及解决相关问题是相当有帮助的。
1.LoadRunner组成及工作原理
从图中可以看见,LoadRunner由四个核心组件构成:
Vugen:Virtual User Generator,虚拟用户生成器是用来实现录制、生成、编辑、调试脚本的组件。在LoadRunner中,脚本就是虚拟用户。实际上,脚本可以看作是虚拟用户要完成的行为的模板。在Vugen中,只能模拟一个虚拟用户执行脚本。
Controller:是LR中,用来实现场景的设计、执行、集成监控、实时监控等功能的一个组件。在Controller中,可以模拟多个虚拟用户执行脚本。
Analysis:是用来收集、整理测试结果,然后提供简单的概要报告和图表,并且提供了一定的分析选项来帮助我们实现性能测试结果的分析。
Load Generator:负载生成器,该组件是用来实现脚本到虚拟用户(线程、进程)的转化过程。
2.LoadRunner的脚本生成
LoadRunner脚本通常可以由两种方式生成:一种是利用工具本身的录制功能,但是这个功能对于现在的电脑不是非常友好。主要是浏览器的兼容问题,一般我们在Win7+IE9的环境进行录制,而Win10就比较麻烦了。另一种方法就是利用抓包工具,抓包然后手写脚本。这个对于一些有经验的测试人员来说可能来的更加直接。但是对新手不是特别友好,所以本文介绍了第三种生成办法--利用第三方工具进行录制,然后再生成脚本。
2.1LoadRunner自身录制
由于工具本身录制过程较简单,所以通过几个图来帮助大家快速掌握。
关于各种录制模式的对比:
HTML模式:又叫页面模式,主请求模式,在该模式下LoadRunner只会对主请求生成对应的请求函数。
代码特征:Mode=HTML
优点:生成的脚本简洁。
缺点:可能会遗漏某些ajax的请求。
URL模式:又叫http模式,请求模式,在该模式下LoadRunner会对所有的http请求都生成对应的请求函数。
代码特征:Mode=HTTP
优点:不会遗漏任何使用http协议的请求,包括ajax的请求。
缺点:生成的脚本臃肿。
在HTML模式下两种方法对比:
HTML下基于用户行为模式:生成的脚本中请求之间是存在上下文依赖的。该模式下LoadRunner的作用类似于浏览器,请求之间是强制建立依赖,即从第二个请求开始,所有的请求都是依赖于第一个请求的响应结果。
优点:对于业务系统中,本身就存在的上下依赖,不需要做额外的处理。
缺点:脚本的耦合度高,可编辑性差,对于非上下依赖,还是需要做关联处理。
HTML下基于URLs模式:生成的脚本中,请求是通过url地址来实现的,在脚本层面,请求之间不会存在任何的依赖性。
优点:脚本的可编辑性高。
缺点:不明显。
2.2抓包手写
通过前面录制脚本,我们思考下,为什么LoadRunner能够帮我们自动生成脚本呢?这其中的原理是什么?
其实,LoadRunner在生成脚本的过程中扮演的就是一个代理服务器的角色,它记录的从我们发出的请求到服务器响应的整个过程。然后再把这些信息(数据包)转化成它自己的脚本的过程。那么既然由于种种原因,LoadRunner不能扮演这个角色了,我们当然可以手动来帮助它完成,于是就有了后面两种办法。
我们先来讲抓包手写。首先打开抓包工具:
手动编写脚本,需要一定的C语言基础(LoadRunner自带的类C语言),这里给讲解以下LoadRunner常用的几个请求函数。
web_custom_request
语法格式:int web_custom_request(const char *RequestName,<Listof Attriutes>,[EXTRARS,<List of Resource Attriutes>,]LAST);
返回值:成功返回时LR_PASS(0),失败返回时LR_FAIL(1)。
参数说明:
RequestName:步骤名称
List of Attriutes:
URL:被测地址(要加载的页面地址)
Method:页面提交方式,POST或者GET
TargetFrame:包含当前链接或者资源的frame名称
EncType:编码类型
RecContentType:响应消息的内容类型
Referer:被当前页引用的页面
Body:请求消息体
Raw Body:以指向数据的指针形式表示的请求消息体
ResourceByteLimit:资源大小限制
Snapshot:以.inf为扩展名的快照名称
Mode:录制模式
EXTRARS:分隔符,表明下面的是一个资源属性表
List of Resource Attriutes:资源属性表
LAST:属性列表结束标识符
说明:
该函数创建一个HTTP的客户请求,它支持HTTP的所有请求方法。默认情况下,只有当其他web请求函数不能被解释时,LR才会利用此函数创建请求,且该函数通常会与其他函数配合使用,比如:先利用web_add_header函数添加请求头,然后再利用该函数发送请求。以及一般开发webservice脚本的时候,也使用的比较多。
web_submit_data
函数格式:int web_submit_data(const char *StepName,<List of Attriutes>,ITEMDATA,<List of data>,[EXTRARS,<List of Resource Attriutes>,]LAST);
返回值:成功返回时LR_PASS(0),失败返回时LR_FAIL(1)。
说明:该函数处理无状态或者上下文无关的表达的请求,生成表达GET或者POST的请求,这些请求与Form自动生成的请求是一样的。不管是URL_based录制模式还是HTML_based录制,只有在选择URLs only选项后,才会使用该函数。
web_submit_form
函数格式:int web_submit_form(const char *StepName,<List of Attriutes>,<List of Hidden Fields>,ITEMDATA,<List of data Fileds>,[EXTRARS,<List of Resource Attriutes>,]LAST);
返回值:成功返回时LR_PASS(0),失败返回时LR_FAIL(1)。
当我们写过几个脚本后就会发现,很多时候我们在实际工作中处理脚本的时候,只需要改动请求地址和下面参数就行了,之前写过的脚本都是可以重复利用的,然后我们处理起来就像使用Jmeter差不多,效率也会很高。
2.3“万能录制大法”
前面我们说过,既然可以使用第三方工具来抓包,那么我们能不能有种办法可以让LoadRunner把我们抓的包自动识别成它的格式,然后自己生成脚本呢?其实,办法当然有,还是利用了LoadRunner的脚本生成原理来解决。下面,我们来看具体是怎么实现的吧。
首先,我们要利用第三方工具--Wireshark来帮忙。Wireshark是个很强大的工具,测试人员常用它来做抓包和网络分析。
Wireshark的基本使用流程
第一步:选择网卡
第二步:开始操作被测系统
第三步:过滤
第四步:分析数据包(在这里,我们选择保存封包,导入LoadRunner)
附:Wireshark的过滤规则
过滤源ip、目的ip
在wireshark的过滤规则框Filter中输入过滤条件。如查找目的地址为192.168.101.8的包,ip.dst==192.168.101.8;查找源地址为ip.src==1.1.1.1
端口过滤
如过滤80端口,在Filter中输入,tcp.port==80,这条规则是把源端口和目的端口为80的都过滤出来。使用tcp.dstport==80只过滤目的端口为80的,tcp.srcport==80只过滤源端口为80的包
协议过滤
比较简单,直接在Filter框中直接输入协议名即可。
http模式过滤
如过滤get包,http.request.method=="GET",过滤post包,http.request.method=="POST"。
连接符and的使用
过滤两种条件时,使用and连接,如过滤ip为192.168.101.8并且为http协议的,ip.src==192.168.101.8 and http。
”万能录制方法“操作步骤
第一步:跟之前抓包手写无差异,打开抓包工具然后操作被测系统;
第二步:操作完成后,停止抓包,然后按照过滤规则过滤,一般我们使用过滤源IP+目的IP的组合方式即可。
第三步:将过滤完成后的封包保存,注意:保存为*.pcap格式,只有这个格式才能够被LoadRunner11识别。
第四步:导入LoadRunner,生成脚本。注意:LoadRunner11要使用该功能,需要打4个补丁包,将LoadRunner11升级到11.04版本。按补丁顺序一个个来,不可跳跃。
点击完成后,脚本自动生成。是不是很方便?
本篇主要讲解了脚本的生成,那么下篇我们详细介绍脚本增强技术,请关注《性能测试三部曲之工具篇(中)》。