LoadRunner之自定义HTTP请求

LoadRunner之自定义HTTP请求

性能测试开发脚本时使用的都是同样的模式。对在性能测试规划时指定的典型业务逻辑场景进行录制,形成基本的脚本骨架。

录制脚本后需要对脚本进行编辑,以满足性能测试需求,编辑脚本需要掌握参数化 、关联动态数据、增加逻辑控制等技术。

如果不能处理好脚本的录制和编辑,
就不可能有效和成功的继续进行性能测试。什么是参数化数据和动态数据呢?

这些数据都会做为http请求数据的一部分发送到web服务器,但二者肯定是有区别的。

录制业务逻辑脚本时,生成的脚本包含的是录制期间实际用到的值。

不做参数化这个脚本仍可以重放,不做关联动态数据,重放脚本就会出现问题。在给系

统施加压力的时候,同一个脚本会被很多虚拟用户调用执行,应用系统现在都采用各种各样的

缓存机制设计,不能使用同样的数据,这和应用系统的实际使用环境不一致,这会导致性能测

试结果不可信。为解决这样的问题我们做参数化,使用参数替换已录制的值。参数化数据也有

不同的种类,比如登录用户和密码,这些数据必须是系统支持的注册用户,需要从数据库表中

读取。另一些表单的文本输入框,就可能允许随意输入数据。需要关联的数据是从服务器响应

中获取的,在以后的请求中发送到服务器的数据。可以通过web_reg_save_parm()这个LR API从

服务器响应中获取保存动态数据。动态数据通常在删除一些数据或审核后记录进入以后的流程

环节等情况下出现。

本篇文档会结合实例对动态数据数组和自定义HTTP请求进行介绍。演示使用的性能测试

工具是LR8.0,使用的web应用是工具自带的MercuryTours Web系统,版本不一致,可能导致本

文档中的脚本不能正确运行。Mercury Tours系统功能很简单,提供了航班订票(Flight菜单)

和取消预订航班(Itinerary菜单)两个功能。需要自己注册,登录系统以使用这些功能。其中,

取消预订航班的操作步骤为:登录系统-点击Itinerary菜单-选择一条预订的航班记录-点击按钮

"cancel checked reservations"以取消该航班。如图1:

现在系统中有五条航班预订记录,按上述操作步骤,录制LR脚本取消一条预订记录,如图2:

在试图重放该脚本的时候出现会出现问题,如图3:

我需要对动态数据进行关联。录制脚本的时候取消了一次航班预订,现在有四条记录,

继续录制一次脚本,并比较两次脚本的action.c文件如图4:

从图中,可以看出,loadrunner函数web_submit_form()的参数数目竟然是不一样的。其中,
"Name=1"表示是第几条航班预订记录,"Value=on"表示向服务器发送请求取消对应的航班记录。
试着删除:"Name=4",
"Value=", ENDITEM, 回放脚本这样是成功的。但我们不能每次人
工干预脚本以使脚本回放成功啊。怎么办?我们只能对LR
API函数的参数做参数化或者关联动态

数据,而在参数数目发生变化的情况下,可以使用HTTP自定义请求函数web_custom_request()

来替代函数web_submit_form()。这个演示系统是使用Perl开发的,原来没见过这种情况。却也能

很好的演示web_custom_request()。
简单介绍一下web_custom_request()的参数TODO。。。。。。
下面看一下,向服务器发送的请求的Body部分,如图5:

对应的RecordingLog.txt部分为:

*** [tid=1a8 Action 33] Sending request to host
192.168.1.101:1080 ( 6/5/2009 00:45:15 )

"1=on&flightID=1494-796-kz&flightID=1494-1565-kz&flightID=1494-2334-kz&flightID=1494-3103-kz&fl"
"ightID=1494-3873-kz&.cgifields=1&.cgifields=2&.cgifields=3&.cgifields=4&.cgifields=5&removeFli"
"ghts.x=122&removeFlights.y=11"
其中1=on表示向服务器发送请求取消对应的航班记录,removeFlights.x=122&removeFlights.y=11

记录的是按钮cancel的位置,这个不影响。flightID和.cgifields来自于服务器响应,我们会把这些信息保

存在一个数组里面,如何判断和操作web_reg_save_parm()参考其他资料,不再叙述。在 web_url("welcome.pl",

前添加:

//added by the Tester manually.start:

int
i,ii,k;
char tmp[32],tmpp[32];
char
str[1024],strr[1024];
web_reg_save_param("flight_name",
"LB/IC=
"RB=\">",
"Ord=ALL",
LAST);

web_reg_save_param("cgi_field",
"LB/IC=
"RB=\">",
"Ord=ALL",
LAST);

//added by
the Tester manually.end!

其中
"Ord=ALL"表示会把所有的复合左右边界的数据保存在数组里面。
下面对保存的动态数据进行解析,封装成http请求的body部分:

i =
atoi(lr_eval_string("{flight_name_count}"));
ii=atoi(lr_eval_string("{cgi_field_count}"));

//lr_error_message("fff
%d",ii);
strcpy(str,"body=1=on&flightID=");
//lr_error_message("str :
%s",str);

for
(k=1;k<=i;k++)
{
sprintf(tmp,"{flight_name_%d}",k);
sprintf(tmpp,"{cgi_field_%d}",k);
//lr_error_message("str
tmp :
%s,%s",tmp,lr_eval_string(tmp));
//lr_save_string(lr_eval_string(tmp),tmpp);
//lr_error_message("str
tmpp : %s",tmpp);

strcat(str,
lr_eval_string(tmp));
strcat(str,"&flightID=");
strcat(strr,"&.cgifields=");
strcat(strr,
lr_eval_string(tmpp));
//lr_error_message("str 2 :
%s",str);
//lr_error_message("str 22 :
%s",strr);
}
strcat(str,strr);
strcat(str,"&removeFlights.x=122&removeFlights.y=11");
//lr_error_message("str
2 : %s",str);
lr_output_message(str);
//return
0;

我们需要自定义http请求函数为:
web_custom_request("itinerary.pl",
"Method=POST",
"URL=http://192.168.1.101:1080/MercuryWebTours/itinerary.pl",
"RecContentType=text/xml",
"Snapshot=t4.inf",
str,
LAST);

现在我们再进行回放该脚本就不会出现问题了。脚本回放成功,我们的文字也
到此就结束了,我们不再对该脚本进行场景调度,已经分析性能测试运行的结果。我们的
目的只是演示动态数据数组的保存、使用及http自定义请求函数web_custom_request()。

时间: 2024-10-17 14:05:01

LoadRunner之自定义HTTP请求的相关文章

LoadRunner:关联HTTP请求

LoadRunner:关联HTTP请求 本例通过一个使用HTTP/HTML协议发送.获取服务器数据的vuser脚本,分析LoadRunner如何进行HTTP关联. 下面这个例子包括两个事务:上传数据到服务器.下载服务器数据,通过关联将服务器返回的数据保存下来,方便就行分析. 1.定义变量 在Action最前面定义变量,否则会报错. 代码: merc_timer_handle_t timer; double wasteTime=0; char *ActualBuffer; int NumberOf

jmeter之自定义java请求性能测试

写在前面 最近个人情绪不稳定.心情很不美丽,特别懒,没有博客和技术文章更新,这个文章也是迟到了周多的时间,啰嗦完了,开始正题吧. 我们在实际做性能测试的时候,一般会采用jmeter.Lr进行测试,但是很少有同学用jmeter的测试Java请求,也可以这么说,一般是开发自己搞的多一些. 准备工作 自己编写一个接口(我用springboot随便写了一个,需要的可以加我好友) 新建一个maven工程 pom文件引用ApacheJMeter_core.jar     ApacheJMeter_java.

Ajax中自定义发送请求和处理响应对象

Ajax中自定义发送请求和处理响应对象 JavaScript内置一个称为XMLHttpRequest的对象,用于发起Ajax请求并处理Ajax响应.这个对象非常复杂,包含许多支持Ajax的特性和方法. readyState:请求的状态代码[0(未开始).1(开启).2(已传送).3(接收中).4(已载入)] status:HTTP的请求状态代码[404(找不到文件).200(OK)] onreadystatechange:请求状态改变时会被调用的函数引用,这个函数事件处理器就是处理响应的地方.

【原创】Loadrunner使用json格式请求数据并参数化

(2015-04-10 16:10:41) 转载▼ 标签: loadrunner json 参数化 web_custom_request 分类: 性能测试 请求自定义的http文件用函数:web_custom_request  这个函数. 因为Json使用{}进行配对,但是Loadrunner使用{}进行参数化,存在冲突. 所以先修改Tools---General Options---Parameterization--Parameter Braces,左右边界改为尖括号<> 然后在编写相关代

在LoadRunner中设置HTTP请求time-out的时间

Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s) [MsgId: MERR-27728] LR默认使用120秒作为每一个HTTP请求连接和接收和timeout时间,如果一个HTTP下载页面的时间超过120秒,那么就会碰到上面的错误提示.   Step Download Timeout means that the step needed to perform

Loadrunner模拟JSON接口请求进行测试

一.loadrunner脚本创建 1.Insert - New step -选择Custom Request - web_custom_request 2.填入相应参数 3.生成脚本,并修改如下(参数中的引号"前需要加斜杠\转译) Action() { web_custom_request("web_custom_request", "URL=http://urlhead/CpcService.ashx?Method=checkXXXed", "

laravel5.4中自定义ajax请求响应类

本人小白在it界混迹一年之久暂时没有什么成绩只是把所以到的和大家分享一下,在工作和学习的过程中一直追求美观,但是对于我来说毕竟实力有限,每当遇到一些返回或者是网站或者项目中的返回给用户的友好提示的时候总是感觉头痛不已,直接alert吧显得真的是太low了所以结合所使用的laravel5.4分享给大家一个自定义的提示类 首先我们先来看一下官方提供的文档 文档中已经明确的表示出在config的文件夹下包含了所有的配置文件,那么我们的配置文件同样的可以放到配置文件中,所以命名一个文件为constant

Ueditor实现自定义conttoller请求或跨域请求

UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.我们在做网站文字编辑的时候会经常用到它.但是ueditor默认支持保存图片在网站的根目录下面.但是,对于网站来说,我们大多数的时候都要把静态资源保存到另外的服务器上,与应用服务器分开,以增加网站的性能 下面介绍一下这个方法: 一, ueditor 1.4.2+ 推荐使用唯一的请求地址,通过GET参数action指定不同请求类型. 但很

angular 自定义服务封装自定义http请求

在angular中将http请求,放置在一起封装成服务,可减少代码重复,方便使用 var ngpohttprest = angular.module('ngpohttprest', []); ngpohttprest.factory('httpItemCore', function ($http, $q) { return { search: function (params) { var defer = $q.defer(); $http({ method: 'get', params: pa