web_custom_request

初学性能测试时候,第一步必学脚本录制,但一路下来各种录制失败、回放脚本失败的问题层出不穷,究其原因一是LR本身存在对测试环境的兼容性问题导致录制失败,更深层次的原因是录制者不清楚LR录制脚本的原理,或者不清楚客户端与服务器端之间的请求和应答内容及通信方式,导致一旦出现脚本执行失败便无从下手。最近在做项目的一个接口测试时候,因请求是合作第3方发起的且不容易让第3方提供他们的平台给我们做测试,所以这种情况是没办法取录制脚本的,只能选择手动编写脚本实现。得知接口是使用http协议的post方法,想到了web_submit_form()和web_submit_data()两个函数,它们实现了http请求中的post方法,问题来了,它们都提交表单到某个页面,但现在被测试的仅是个http接口,显然这两个函数都无法满足需要。

于是想到了web_custom_request(),这个函数的作用是自定义http请求规则,一看不由地暗喜原来web_custom_request()函数是一个可以用于自定义http请求的“万能”函数,具有web_link()、web_url()、web_submit_data()函数的功能,可以自由定义需要的http的get和post请求。网上看到一篇介绍web_custom_requst,写的非常详细,分享一下(当然英文好的直接看LR自带的帮助文档会感觉更原味)



=================


一、以下是HTTPWATCH录制的HTTPRequest数据

POST /member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1 HTTP/1.1

Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, ……

Referer: http://bbs.gfan.com/forum.php

Accept-Language: zh-cn

User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; ……)

Content-Type: application/x-www-form-urlencoded

Accept-Encoding: gzip, deflate

Host: bbs.gfan.com

Content-Length: 109

Connection: Keep-Alive

Cache-Control: no-cache

Cookie: pgv_si=s6847084544; Hm_lpvt_6790309a725fc338d4fe3efb72d4a6ea=1370165750;……

 

fastloginfield=username&username=abcd&password=e2fc714c4727ee9395f324cd2e7f331f&quickforward=yes&handlekey=ls

 

二、用web_custom_request()函数实现提交数据:

web_custom_request("gfan",

"Method=POST",

"URL=http://bbs.gfan.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes",

"body=fastloginfield=username&username=abcd&password=e2fc714c4727ee9395f324cd2e7f331f&quickforward=yes&handlekey=ls",

LAST);

==============================


web_custom_request方法可以发送POST和GET类型的请求

web_submit_data只能发送POST类型的请求

所有web_submit_data方法发送的请求都可以使用web_custom_request来实现

web_custom_request可以实现web_submit_data无法实现的请求,

比如“查询所有邮件并删除”这个案例中,查询时我们使用关联把所有邮件对应的标识抓取成一个数组,如果使用web_submit_data来完成这个删除的请求,需要很多个web_submit_data请求才能完成,但使用web_custom_request就可以通过一个请求完成,方法是自己写代码拼一个web_custom_request 方法POST请求的Body值。

web_submit_data请求中提交的数据是以这样的方式存在的

“Name=属性名称,”,“Value=属性值” 

如:
          “Name=locale”, “Value=L2″, ENDITEM, 
         “Name=dataCenter”, “Value=yh”, ENDITEM, 
        “Name=username”, “Value=12044″, ENDITEM,

 如果我们想提交的某个属性包含包含多个值(上文的例子中就是这样的情况),它就无法处理了,只能通过多个web_submit_data来处理。

 下面是一个典型的web_submit_data和web_custom_request请求,可以看到web_custom_request中提交的数据(body)是以这样的方式存在的

“Body=属性名称=属性值&属性名称=属性值&……”

       web_submit_data(“login”, 
               “Action=http://192.168.14.21:78……ndex_sso.jsp”, 
               “Method=POST”, 
               “RecContentType=text/html”, 
               “Referer=http://192.168.14.21:7888…=/index_sso.jsp”, 
               “Mode=HTML”, 
               ITEMDATA, 
               “Name=locale”, “Value=L2″, ENDITEM, 
               “Name=dataCenter”, “Value=yh”, ENDITEM, 
               “Name=username”, “Value=12044″, ENDITEM, 
               “Name=password”, “Value=”, ENDITEM, 
               “Name=_eventId”, “Value=submit”, ENDITEM, 
               “Name=isPureWeb”, “Value=true”, ENDITEM, 
               “Name=solutionName”, “Value=eas”, ENDITEM, 
               “Name=dbType”, “Value=1″, ENDITEM, 
               “Name=easSessionId”, “Value=eas;yh;L2;12044;BaseDB”, ENDITEM,               
               “Name=userAuthPattern”, “Value=BaseDB”, ENDITEM, 
               “Name=loginFlow”, “Value=true”, ENDITEM, 
               LAST);

    web_custom_request(“CommonQueryDialog.jsf_3″,
        “URL=http://192.168.14.21:7888/ea…ueryDialog.jsf”,
        “Method=POST”,
        “Resource=0″,
        “RecContentType=text/javascript”,
        “Referer=http://192.168.14.21:7888/…DailyLoanUERc+ihtml”,
        “Mode=HTML”,
        “EncType=application/x-www-form-urlencoded;charset=UTF-8″,
        “Body=queryDialog:selectSolutionList=查询&queryDialog:j_iduserFilterPanel_3_value=Kd5QoAEPEADgAAf8wKgEDMznrtQ=&=湖南亚华乳业有限公司&queryDialog:j_iduserFilterPanel_6=&queryDialog:j_iduserFilterPanel_9_value=3&=大于等于&queryDialog:j_iduserFilterPanel_11=0&queryDialog:j_iduserFilterPanel_14_value=&=&queryDialog:j_iduserFilterPanel_17_value=&=&queryDialog:j_iduserFilterPanel_20_value=&=&queryDialog:j_iduserFilterPanel_23_value=&=&queryDialog:j_iduserFilterPanel_26_value=&=&queryDialog:j_iduserFilterPanel_29_value=&=&queryDialog:j_iduserFilterPanel_32=&queryDialog:j_iduserFilterPanel_35_value=&=&queryDialog:j_iduserFilterPanel_38=2008-08-01&queryDialog:j_iduserFilterPanel_41=2008-08-28&queryDialog:filterGrid_modifiedData=[]&queryDialog:filterGrid_removedData=[]&queryDialog:_postback=&queryDialog:userFilterPanel=/cp/bc/dailyLoanBillCommQuery.xhtml&javax.faces.ViewState={vs2}”,
        LAST);

通过我的观察,发现有两种情况下的POST请求会被LoadRunner录制为web_custom_request,

1.   上文提到的批量提交多条同属性名称的数据的请求
2.   header属性x-requested-by值为XMLHttpRequest的POST请求

这两种实现请求的方法还有一个需要注意的地方就是web_custom_request中body中的属性值如果包含一些特殊字符,必须通过URL编码,否则Web服务器会返回500错误,一个典型的例子是如果Body中包含ViewState,ViewState中常常有“=”之类的特殊字符,此时必须通过URL编码,LoadRuner中提供了一个这样的编码转换函数

       web_convert_param(“vs1″, “SourceEncoding=HTML”,  “TargetEncoding=URL”, LAST);

除LoadRunner外,你可以在Fiddler中按Ctrl+E来转换


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值