loadrunner-录制脚本

创建Vuser 脚本–录制基本脚本

1、启动loadrunner

选择开始程序 HPLoadRunnerLoadRunner,打开HP LoadRunner窗口。

2.打开VuGen

在LoadRunner Launcher窗格中,单击Create/Edit Scripts,链接启动Virtual user Generator起始页。(如图两种方式都可以)
在这里插入图片描述

3.创建一个空白Web脚本

选择File–>New菜单,或点击在这里插入图片描述按钮,打开New Virtual User对话框,显示可供选择脚本的协议。

在这里插入图片描述
对于常用的应用软件,我们可以根据被测应用是B/S结构还是C/S结构来选择协议。如果是B/S结构,就要选择Web(HTTP/HTML)协议。如果是C/S结构,则可以根据后端数据库的类型来选择,如MS SQL Server协议用于测试后台数据库为SQL Server的应用;对于没有数据库的WINDOWS应用,可以选择Windows Sockets协议。
根据选择协议的不同,Virtual User Generator 会使用不同的方式和界面引导用户完成脚本的录制。
loadrunner-介绍一文中有介绍loadrunner自身录制分析网址使用的是什么协议

4.录制前的设置

选择Web(HTTP/HTML),点击Create按钮,打开Start Recording对话框。选择的协议不同,打开的窗口就会不同,实例是针对Web录制的对话框。
在这里插入图片描述
VuGen的脚本分为3个部分:Vuser_init,Action,Vuser_end。
Vuser_init和Vuser_end都只能存在1个,在迭代执行中只会执行1次 (例如:登录与退出)
Action可以存在多个,在迭代执行中可以执行多次

在Start Recording对话框,点击Options按钮,进入录制选项设置。一般要设置以下选项:

1)RecordingHTTP/HTML level中设置脚本的显示形式:URL_based script。
基于浏览器的应用程序推荐使用 HTML-based script。
不是基于浏览器的应用程序推荐使用 URL-based script。
基于浏览器的应用程序中包含了JavaScript,并且该脚本向服务器发送了请求,比如DataGrid的分页按钮等,推荐使用URL-based script。
基于浏览器的应用程序中使用了HTTPS安全协议,建议使用URL-based script。
在这里插入图片描述
== LR HTML与URL录制方式区别==
Recording录制选项
这里提供了两个大类的录制方式:

  1. HTML-based script基于HTML的脚本
    这种方式录制出来的脚本是基于HTML基础的,为每个用户操作生成单独的步骤,这种脚本更容易理解和维护,也更容易处理关联。对于正常的浏览器应用程序,推荐使用HTML录制模式。
    一般来说如果我们是标准使用IE访问的B/S架构,我们应该使用HTML-BASE下的A script. containing explicit URLs only方式来录制脚本,这种脚本基于URL请求完成,不会带有任何前后依赖的内容。
    选择HTML Advanced,出现两种script type
    • A script describing user actions (web_link, web_submit_form)
    脚本中的每一个函数直接对应着虚拟用户的一个动作,创建的函数主要有URL(Web_url)、link(Web_link)、image(Web_image)以及表单提交(Web_submit_form)等几类。
    基于解释用户行为的脚本,注重描述用户做了什么操作类似于QTP,脚本简洁,基于用户操作模拟,浅显易懂,并且自身就包含了对象检查过程,无需校验
    • A script containing explicit URLs only (web_url, web_submit_data)
    将所有的URL、link、image都用Web_url函数来统一处理,在表单提交时则用Web_submit_data来处理。这样做的结果是脚本没有前一种方式那么直观,但如果网页中存在较多相似类型的链接时,这样做更容易处理脚本中的参数化和关联问题。
    基于URL请求的脚本录制类型,这种方式不考虑用户的操作,只考虑客户端发送的请求,注重于实际上系统做了什么。
  2. URL-based script基于URL的脚本
    这种方式录制出来的脚本是基于URL请求的。如果我们是一个非IE标准的C/S架构,我们建议使用URL-BASE来录制脚本,这样我们可以确保不会遗漏任何HTTP请求。
    这种是基于URL请求的脚本录制方式,我们会录制得到所有的http请求,导致脚本中包含了大量的web_url()函数Use web_custom_request only 自定义的http请求规则,更适合在自定义的http请求中进行二进制处理。采用这种方式生成脚本所有请求都生成web_custom_request () 函数。
    对于web_link()、web_submit _form()等函数,需要前面页面的支持,也就是说必须先访问http://127.0.0.1:1080/WebTours/这个页面之后,才可以点击sign up now 按钮,如果不在http://127.0.0.1:1080/WebTours/这个页面,是无法点击sign up now 按钮的,包括web_submit _form()提交,也必须是在点击了sign up now 按钮之后的页面才可以提交。
    而对于web_url(),web_submit _data()等函数则不需要要前面页面的支持,也就是说你可以直接访问http://127.0.0.1:1080/WebTours/login/p1 (相当于点击了sign up now ),而且还可以在当前页面进行提交。

两种录制模式的选择:
HTML-based优缺点:
(1)资源从内存中取出且在回放时下载。因此脚本更小且更容易阅读。
(2)由于只有较少的硬编码脚本,因此只有较少的动态值需要关联。
(3)可以插入图片检查之类的语句以检查结果是否正确。
(4)因为HTML模式回放时需要积极地解析返回的信息,因此它可能会比其他录制模式更加占用资源。
URL-based优缺点:
(1)适用于非browser的应用程序。
(2)录制来自sever的所有请求和资源,甚至抓取非HTML应用程序,因此需要做更多关联,脚本看起来也相当复杂。
综上,选择何种录制方式可以参考如下方案:
(1)如果应用是Web应用,首选是HTML-based录制模式;
(2)如果应用是使用HTTP协议的非Web应用,则首选URL-based录制模式;
(3)如果Web应用中使用了Java applet程序,且applet程序与服务器之间存在通信,则选用URL-based录制模式。

2)AdvancedSupport charset中设置编码格式:UTF-8;
提示:录制Web脚本时,生成的脚本中存在乱码该如何解决?
新建脚本—>选择协议(Http)–>选项–>高级–>选择“支持字符集”并点选“UTF-8”。
在回放脚本之前:Vuser–>运行时设置–>浏览器–>浏览器仿真–>更改–>使用浏览器–>语言下来选择 “中文(中国)”。
在这里插入图片描述

5.录制

在Start Recording对话框,点击OK按钮,开始录制。系统自动弹出IE,加载WebTours系统的注册界面。
在录制的过程中,屏幕上有一个悬浮的录制工具栏,是脚本录制过程中测试人员和VuGen交互的主要平台。
熟悉录制脚本工具栏:
在这里插入图片描述
实例操作:登录系统点击sign up now ==>注册并提交
通过操作被测系统,操作的每一个步骤都被记录,在录制的过程中,可以在相应的步骤插入action、事务、检查点、集合点等信息。录制完成后单击在这里插入图片描述按钮,Loadrunner开始生成脚本,生成的脚本如图所示。
熟悉两种脚本查看方式:
Script View 可以查看全部录制的脚本代码
在这里插入图片描述
Tree View 可以查看每个URL获取来的页面
在这里插入图片描述

  • 1.插入事务
    插入事务是用于把功能分为若干部分,在统计性能指标时,可以对不同的事务分别作统计。如果对脚本不是太熟悉,可以在录制的时候,逐步插入。也可以在录制完成之后,在脚本中插入。
    在录制时插入操作为:录制某个功能开始前单击插入事务的起始点录制,直到某个功能结束插入事务的结束点。
    在脚本的插入方式为:
    插入事务起始点:
    单击某个功能起始前的空白处右键鼠标insert=>start transaction=>命名=>OK。系统自动在脚本语句中插入如下语句:
    lr_start_transaction(“登录”);
    在这里插入图片描述
    插入事务结束点:
    单击某个功能结束后的空白处右键鼠标insert=>end transaction=>命名(与起始点的名字一致)=>OK。
    系统自动在脚本语句中插入如下语句:
    lr_end_transaction(“登录”,LR_AUTO);
    在这里插入图片描述
  • 2.参数化
    参数化的作用是在进行场景执行的时候,每个不同的虚拟用户可以按照参数的读取策略读取到参数值,以模拟不同用户在提交或者读取不同的数据。
    每个用户在界面上读取和提交的信息都不太相同,因此一般都需要参数化,其它与输入信息对应的比如用户id之类的信息也需要参数化;另外,录制环境绝大多数情况下与执行环境不一致,因此一般需要对IP、端口或者域名做参数化。
    下面将分四部分来介绍参数化的方法和实施过程:
    • 确定需要参数化的常量
    • 准备数据
    • 对脚本进行参数化
    • 还原初始字符串

确定需要参数化的常量化
打开脚本后,首先要确定哪些常量需要参数化。例如我们的系统注册的脚本代码:
在这里插入图片描述
可以看出,在web_submit_data函数中,两条语句包含了两个常量:用户名和密码。
“Name=userNumber”, “Value=test201”, ENDITEM,
“Name=password”, “Value=1”, ENDITEM,
当我们想模拟多个不同的用户来运行登录脚本的时候,需要对Value= test201和Value=1进行参数化。
其它还有哪些常量需要参数化,可以根据业务场景来确定。
准备数据
根据实例,我们需要准备用户名、密码、地址这三个参数的数据。

在这里插入图片描述
对脚本进行参数化
以用户名参数化为例,参数化过程如下:
1)选中test201=>右击鼠标=>在右键菜单上选择replace with a parameter。
2)在弹出窗口填写参数名称,或选择一个已经存在的参数名。
在这里插入图片描述
实例中填写参数名称:UserNumber;选择参数类型File,来写入已准备好的数据。
常用的参数类型:
Data/Time:使用当前日期/时间替换所选常量。
Group Name:使用Vuser组的名称替换所选常量。
Load Generator Name:使用Vuser脚本的负载发生器名替换所选常量。
Iteration Number:使用当前的迭代编号替换所选常量。
Random Number:使用一个随机生成的整数替换所选常量,可以通过参数属性设定参数的范围。
Unique Number:使用一个唯一编号替换所选常量,可以通过参数属性设定参数的第一个值和递增的规则。
Vuser ID:使用运行脚本的虚拟用户ID来代替选择的常量。
File:采用外部的数据来代替,可以使用单独的文件,也可以使用现成的数据库中获取数据。
User Defined Function:从用户开发的dll文件中获取数据。

3)单击窗口的properties按钮,设置parameter的properties。
在这里插入图片描述
设置完成后,被参数化的值会被参数名代替。实例中设置参数名为UserNumber,脚本原先220999部分变为了紫红色的{UserNumber}。

文件File:
参数化结束后,脚本保存的根目录下会自动生成一个 以参数名称命名的 参数文件;也可以直接选择一个已准备好的参数文件。
选择参数列Select Column:
By number:以列号为参数列。
By name:以列名为参数列。
文件格式:
Column:参数之间的分隔符:逗号、空格、Tab。
First data:从第几行读取数据。
选择参数分配方法Select next row:
Sequential:顺序的分配Vuser参数值。当正在运行的Vuser访问数据表格时,它将会提取下一个可用的数据行。
Random:当脚本开始运行时,“随机”的为每个Vuser分配一个数据表格中的随机值。
Unique:为Vuser的参数分配一个“唯一”的顺序值。注意,参数数量一定要大于等于“Vuser量*迭代数量”。
选择参数更新方法Update value on:
Each iteration:脚本每次迭代都顺序的使用数据表格中的下一个新值。
Each occurrence:在迭代中只要遇到该参数就重新取值。
Once:在所有的迭代中都使用同一个值。
当超出范围时When out of values:(选择数据为unique时才可用到)
Abort Vuser:中止。
Continue in a cyclic manner:继续循环取值。
Continue with last value:取最后一个值。

4)如果其它地方也用到这个相同的参数,则可以进行替换。
方法一:选中需要被替换的常量=>右键鼠标=>use existing parameter=>选择已经存在的参数名。
在这里插入图片描述
方法二:选中这个设置好的【参数】,右键鼠标=>replace more occurrences=>逐个替换(如果确定所有都需替换可以全部替换)。
在这里插入图片描述
还原初始字符串
通过VuGen,可以还原最初录制的字符串从而撤消参数化。方法为:
在脚本视图中,右键单击该参数并选择“Restore original value()”。
在这里插入图片描述
设置完成后,该参数被还原为初始字符串。实例中的参数{UserNumber},被还原为初始的220999。

3.插入集合点
插入集合点是一种增大并发压力的方式。脚本运行时,只有当到达集合点的虚拟用户数满足设置要求时,才会继续往下运行。 插入集合点可以在录制的时候,逐步插入,也可以在录制完成之后,在脚本中插入。需要注意的是,集合点只能插入Action部分的脚本中,不能插入vuser_init和vuser_end两部分脚本中。
在录制时插入操作为:录制某个功能开始前=>单击插入集合点=>命名=>OK
在脚本的插入方式为:单击需要插入集合点的功能开始前的空白处=>右键鼠标=>insert=> rendezvous=>命名=>OK。
在这里插入图片描述
系统自动在脚本语句中插入如下语句:
lr_rendezvous(“用户注册");
实例中,可以在提交的功能前插入集合点。
4.关联
关联的含义是,在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,以变量的形式替换录制时的静态值,从而向服务器发出正确的请求。最最典型的是用于sessionID。
常用的关联技术有三种:录制中关联、录制后关联、手动关联。
录制中关联
设置录制前的recording options=>correlation,可以勾选LR已有的关联规则,也可以新建规则;录制过程中,关联自动在脚本体现。
在这里插入图片描述
录制后关联
关联的使用可以在脚本录制完成后,回放一次脚本,然后在脚本的菜单的vuser=>scan script for correlations进行设置。

在这里插入图片描述
通过回放脚本和扫描关联,系统尝试找到录制与执行时服务器响应的差异部分,找到需要关联的数据,并建立关联。
在这里插入图片描述
第2种自动关联方式 :
1.回放一次
2.切换到“ConrrelationResults”
3.Ctrl+F8
4.关联窗口中,点击Correlation

手动关联
录制前关联与录制后关联都属于自动关联的范畴。如果出现自动关联不能解决的问题,就需要使用手动关联的方法。手动关联的一般步骤如下:
1)录制两份脚本,保证业务流程和使用的数据相同。
2)使用WinDiff工具比较两份脚本,对两份脚本中不同的地方进行判断,找到需要关联的数据。(Tools>compare with Script)
3)找到左边界和右边界字符串,写出关联函数。
web_reg_save_param(“关联名”,”LB=”,”RB=”,LAST); 放在前面
4)在脚本中‘需要关联的数据’前面插入关联函数。
5)用关联函数中定义的参数取代脚本中‘需要关联的数据’。
==如果配置的字符有" 等需要转义的要在其前面加==
例如:

	web_reg_save_param("verify",
		"LB=type=\"hidden\" name=\"verify\" value=\"",
		"RB=\" />",
		LAST);

当关联的时候,发现左右边界值有多个相同的时候,想要选择其中一个,可以配置ORD

web_reg_save_param("verify",
		"LB=type=\"hidden\" name=\"verify\" value=\"",
		"RB=\" />",
		"ORD=1",    //1代表取第一个
		LAST);

调试代码时使用 lr_output_message(lr_eval_string("{自己设置的值}")); 打印出关联的值是否正确

在这里插入图片描述
4.其他
前面讲解了插入事务、插入集合点、参数化、建立关联的方法,一般的脚本都需要做以上几项的修改工作。此外,还可以通过插入注释、插入检查点来完善脚本。另外脚本出现问题了,也可以通过打印信息来调试脚本。
插入注释:在脚本中插入注释,可以清晰找到需要修改的位置,增强脚本的可读性。(单行//,多行/* */)

插入检查点:在脚本中设置检查点函数,将返回值的结果反映在Controller的状态面板上和Analysis统计结果中,由此可以判断数据传递的正确性。
web_reg_find(“”,LAST);
在这里插入图片描述
在VuGen中,选择 Vuser=>Run-time Settings,可以设定脚本回放过程的一些参数。如Iteration Count (迭代次数)、Think Time (思考时间)、Error Handling(错误处理)、Multithreading(运行方式)等。
RunLogic
1、Iteration Count (迭代次数)
选择General:Run Logic
说明:设定每个Action的迭代次数。
Init 和 End不迭代,只运行1次
在这里插入图片描述
在这里插入图片描述
第1个意为第1次迭代结束后立即开始第2次迭代(完成后马上迭代
第2个意为2次迭代直接有一个随机的时间间隔(迭代完成后间隔时间
第3个意为2次迭代之间有固定的间隔时间 (迭代运行时间+间隔时间

Think Time (思考时间)
选择General:Think Time
说明:设定脚本回放时对思考时间的处理方式。
在这里插入图片描述
Ignore think time
脚本回放时,将不执行lr_think_time()函数,这样会给服务器产生更大的压力。

Replay think time
脚本回放时,执行lr_think_time()函数,具体执行方式有一下3种:
1)按照录制时获取的think time值回放。
2)按照录制时获取值的整数倍数回放脚本。
3)制定一个最大和最小的比例,按照两者之间的随机值回放脚本。
Limit think time to 选项,用于限制think time的最大值,脚本回放过程中,如果发现有超过这个值的,用这个最大值替代。

Error Handling(错误处理)
选择General:Miscellaneous
说明:设定遇到错误时的处理方式。
在这里插入图片描述
Continue on error
遇到错误时继续运行。
Fail open transactions on lr_error_message
执行到事务中调用的lr_error_message()函数时将事务的结果置为Failed。
Generate snapshot on error
对错误进行快照。

4.Multithreading(运行方式)
选择 General:Miscellaneous
说明:设定脚本是以多线程方式运行还是以多进程方式运行。
在这里插入图片描述
Run Vuser as a process
以多进程方式运行。
Run Vuser as a thread
以多线程方式运行。
一般会选择把虚拟用户当做进程来处理,因为系统上线后,用户的操作都是以进程的方式进行。
进程:运行的程序,占资源,1:50,独立运行安全性好,
线程:进程的最小执行单位,占资源少共享进程资源,资源征用

1.脚本录制完毕后,按F5键,或点击菜单中的 在这里插入图片描述按钮,可以试运行脚本。回放过程中VuGen在下方同步打印日志(RepalyLog)。
在这里插入图片描述
2.浏览器设置
在这里插入图片描述

3.如果需要查看不同的日志形式,可以在脚本页面菜单的vuser=>runtime-settings=>log选择不同的项,回放脚本时将打印不同级别的日志。

在这里插入图片描述
4.运行结束后,系统会给出相应的运行结果,可以通过View=>Test Results查看回放结果。
回放后自动打开TestResult设置:
Tools>GeneralOptions>Replay>afterReplay选择visualtestresults
在这里插入图片描述
在VuGen中试运行脚本的作用,主要是查看录制的脚本能否正常通过,如果有问题,系统会给出提示信息,并定位到出错的行上,便于用户查找到错误,修改完善测试脚本。
(报错原因:语法错误(缺少分号或逗号或单词写错或函数写错)
== 脚本修改完善的工作完成后,将脚本以有意义的单词命名保存在约定的目录当中。==

注册脚本

Action()
{
/*
	多行注销方法
    */

//打卡首页
	web_url("webtours",
		"URL=http://192.168.1.102:1080/webtours",
		"TargetFrame=",
		"Resource=0",
		"RecContentType=text/html",
		"Referer=",
		"Snapshot=t29.inf",
		"Mode=HTML",
		LAST);

	web_url("header.html",
		"URL=http://192.168.1.102:1080/webtours/header.html",
		"TargetFrame=",
		"Resource=0",
		"RecContentType=text/html",
		"Referer=http://192.168.1.102:1080/webtours/",
		"Snapshot=t30.inf",
		"Mode=HTML",
		EXTRARES,
		"URL=http://www.bing.com/favicon.ico", ENDITEM,
		LAST);

	web_url("welcome.pl",
		"URL=http://192.168.1.102:1080/webtours/welcome.pl?signOff=true",
		"TargetFrame=",
		"Resource=0",
		"RecContentType=text/html",
		"Referer=http://192.168.1.102:1080/webtours/",
		"Snapshot=t31.inf",
		"Mode=HTML",
		EXTRARES,
		"URL=../favicon.ico", ENDITEM,
		LAST);

	web_url("sign up now",
		"URL=http://192.168.1.102:1080/WebTours/login.pl?username=&password=&getInfo=true",
		"TargetFrame=",
		"Resource=0",
		"RecContentType=text/html",
		"Referer=http://192.168.1.102:1080/WebTours/home.html",
		"Snapshot=t32.inf",
		"Mode=HTML",
		LAST);

  //插入集合点,在有插入事务的情况下,放到事务之前  
	lr_rendezvous("集合");


	//插入开始事务
	lr_start_transaction("注册");

	//思考时间
	lr_think_time(1);

	//插入的检查点
	web_reg_find("Text=Thank you",
		LAST);

	web_submit_data("login.pl",
		"Action=http://192.168.1.102:1080/WebTours/login.pl",
		"Method=POST",
		"TargetFrame=info",
		"RecContentType=text/html",
		"Referer=http://192.168.1.102:1080/WebTours/login.pl?username=&password=&getInfo=true",
		"Snapshot=t33.inf",
		"Mode=HTML",
		ITEMDATA,
		"Name=username", "Value={username}", ENDITEM,  //用户名,参数化
		"Name=password", "Value={password}", ENDITEM,   //密码
		"Name=passwordConfirm", "Value={password}", ENDITEM,  //确认密码
		"Name=firstName", "Value=", ENDITEM,
		"Name=lastName", "Value=", ENDITEM,
		"Name=address1", "Value=", ENDITEM,
		"Name=address2", "Value=", ENDITEM,
		"Name=register.x", "Value=64", ENDITEM,
		"Name=register.y", "Value=1", ENDITEM,
		LAST);

	//插入结束事务
	lr_end_transaction("注册", LR_AUTO);

return 0;
发布了44 篇原创文章 · 获赞 1 · 访问量 1437

猜你喜欢

转载自blog.csdn.net/cc_park/article/details/104175336