初学性能测试时候,第一步必学脚本录制,但一路下来各种录制失败、回放脚本失败的问题层出不穷,究其原因一是LR本身存在对测试环境的兼容性问 题导致录制失败,更深层次的原因是录制者不清楚LR录制脚本的原理,或者不清楚客户端与服务器端之间的请求和应答内容及通信方式,导致一旦出现脚本执行失 败便无从下手。最近在做项目的一个接口测试时候,因请求是合作第3方发起的且不容易让第3方提供他们的平台给我们做测试,所以这种情况是没办法取录制脚本 的,只能选择手动编写脚本实现。得知接口是使用http协议的post方法,想到了web_submit_form()和 web_submit_data()两个函数,它们实现了http请求规则,一看不由地暗喜原来web_custom_request()函数是一个可以用于自定义http请求的 “万能”函数,具有web_link()、web_url()、web_submit_data()函数的功能,可以自由定义需要的http的get和 post请求。网上看到一篇介绍web_custom_requst,写的非常详细,分享一下(当然英文好的直接看LR自带的帮助文档会感觉更原味):

附录:web_custom_request函数语法详解

语法:
Int web_custom_request (const char *RequestName, <List of
Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );

返回值:
LR_PASS(0)代表成功
LR_FAIL(1)代表失败。

参数:
1、RequestName:步骤的名称,VuGen中树形视图中显示的名称。

2、List of Attribute:支持的属性有以下几种:

1)URL:
   页面地址。
2)Method :
   页面的提交方式,POST或GET。
3)EncType:
   编码类型。此参数给出一个内容类型(Content-TypeHTTP请求体的“EncType”,会引发服务端的错误。通常我们建议不要手动修改录制时的“EncType”值。
任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-TypeContent-Type请求头
4)BodyFilePath:
   作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinary,BodyUnicode,RAW_BODY_START或Binary=1。
5)UserAgent:
   用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。
例如:头信息“User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT
5.0)”识别的是Window
NT下的IE浏览器6.0。其他的User-Agent的值用来描述其他的浏览器,或者非浏览器程序。通常,一个应用程序中所有的请求都使用相同的用户代
理,录制者作为一个运行时参数来指定(Run-Time Setting—Browser Emulation—User
Agent)。不管怎么说,即使是在一个简单的浏览器进程中,仍有可能会用到直接与服务器交互的非浏览器组件(例如ActiveX控件),通常他们有着不
同于浏览器的用户代理属性。指定“UserAgent”表示这是一个非浏览器的请求。指定的字符串被HTTP头“User-Agent:”
使用,在某些情况下,它同时会影响回放脚本时的行为。例如,不使用浏览器缓存,假设指定的URL属于资源等等。(LoadRunner本身不检查指定的字符串与浏览器本身的值是否相同)
6)Binary:
 
 “Binary=1”表示页面请求体中的每一个以file://x/##形式出现的值(在这里“##”代表2个十六进制数字),都会被替换为单字节的十
六进制的值。如果“Binary=0”(默认值),所有的字符序列只是按照字面的值传递。需要注意双斜杠的用法。在C编译器中双斜杠被解释为单斜杠。如果
不需要零字节,单斜杠可以在Binary不等于1的情况下使用(例如,使用\x20代替file://x20/)。如果需要零字节,那么只能使用
file://x00/且设置 “Binary=1”,\x00在逻辑上会被截断。
7)ContentEncoding
   指定请求体的使用指定的方式(gzip或者deflate)进行编码(例如,压缩),相应的“Content-Encoding:”
HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。
8)FtpAscii:
   “1”使用ASCII模式处理FTP操作;"0" 使用二进制模式。
9)TargetFrame:
   当前链接或资源所在Frame的名称。除了Frame的名字,还可以指定下面的参数:
_BLANK:打开一个空窗口。
_PARENT:把最新更改过的的Frame替换为它的上级。
_SELF:替换最新更改过的的Frame。
_TOP:替换整个页面。
10)RecContentType:
   录制脚本时响应头的内容类型。例如text/html、
application/x-javascript等。当没有设置Resource属性时,用它来确定目标URL是否是可记录的资源。此属性包含主要的和
次要的资源。最频繁使用的类型是
text、application、image。次要的类型根据资源不同变化很多。例如:"RecContentType=text/html":表示
html文本。"RecContentType=application/msword":表示当前使用的是Msword。
11)Referer:
   当前页面关联的页面。如果已经显式指定了url的地址,此项可以省略。
12)Resource:
   指示URL是否属于资源。1 是;0
不是。设置了这个参数后,RecContentType参数被忽略。“Resource=1”,意味着当前操作与所在脚本的成功与否关系不大。在下载资源
时如果发生错误,是当作警告而不是错误来处理的;URL是否被下载受“Run-Time Setting—Browser
Emulation--Download non-HTML resources”
这个选项的影响。此操作的响应信息是不做为HTML来解析的。“Resource=0”,表明此URL是重要的,不受发送请求(RTS)的影响,在需要时
也会解析它。
13)ResourceByteLimit:
 
 web页面下载资源的极限大小。当达到设置的极限后,无法下载其他资源。仅仅对需要下载的资源有效。下载过程:如果总计下载大小小于极限值,则正常开始
下载。如果当下载时达到了设置的极限值,资源大小可知(在HTTP响应头中指定了Content-Length),这中情况下,如果只需要一个缓冲区,那
么下载可以正常完成。如果需要的不止一个缓冲区,或者资源大小不可知,下载就会中断同时关闭当前连接。这个特性可以用来模拟用户不等待一个页面下载完成时
导航到另一个页面的情况。在HTTP模式中无法使用,在Concurrent
Groups(Vuser脚本中的一个区,此区中的所有函数并发执行)区中也无法使用。仅仅适用于Sockets的回放,WinInet也是不适用的。

14)Snapshot:
   快照的文件名。
15)Mode:
 
 两种录制级别HTML、HTTP。HTML级别--在当前Web界面上录制直观的HTML动作。以一步步的web_url、web_link、
web_image、web_submit_form来录制这些动作。VuGen仅仅录制返回HTML页面的请求,不处理脚本和应用程序。HTTP级别
--VuGen把所有的请求录制为web_url指令,不生成web_link、web_image、web_submit_form这些函数。这种方法
更为灵活,但是生成的脚本不够直观。
16)ExtraResBaseDir:
 
 根URL,放在EXTRARES组里。它是用来解析相对URL的(译者加:类似于Windows的相对路径和绝对路径)。URL可以是绝对路径(例如
http://weather.abc.com/weather/forecast.jsp?locCode=LFPO),也可以是相对路径(例如
“forecast.jsp?locCode=LFPO”)。真正的URL的下载是通过绝对路径进行的,所以相对URL路径必须使用根路径URL去解析。
例如,使用http://weather.abc.com/weather/做为根路径来解析“forecast.jsp?locCode=LFPO”,
最后的URL是:http://weather.abc.com/weather/forecast.jsp?locCode=LFPO。如果没有指定
“ExtraResBaseDir”,默认的根URL是主页面的URL。

17)Body:
   请求体。不同的应用中,请求体分别通过Body、BodyBinary或者BodyUnicode参数来传递。请求体可以只使用其中一个参数,也可以使用一连串的分开的参数组成多请求体。例如:
web_custom_request(

……

"BodyUnicode=REPRICE"

"BodyBinary=\\x08\\x00\\xCC\\x02\\x00\\x00"

"Body=.\r\n"

"-dxjjtbw/(.tp?eg:ch/6--\r\n",

LAST);
   
在上面的代码中,使用了3个参数来划分请求体,一个是Unicode段,一个是二进制段,最后一个是常规的字符串。最终的请求体是这3个参数按照在函数中
的顺序连接起来的值。还有一个很少用到的参数,Binary。它也能描述二进制请求体,但只允许函数中只有一个请求体参数。所有的请求体都是ASCII字
符,以null结束。
   
Body--表示规则的,可打印的字符串。无法表示空字节。所有的字符都以一个反斜杠表示。注意:在旧的脚本中,可以看见不可打印的字符在请求体中以16
进制方式进行编码。(例如
“\\x5c”),在这种情况下,必须使用“Binary=1”来标识。空字节使用"file://0.0.0.0/"来表示。
相反,新脚本则会把把请求体分开放在不同的参数中("Body=...", "BodyBinary=...", Body=...")。
    BodyBinary--表示二进制代码。不可打印的字符在请求体中以16进制方式file://xhh/进行编码。在这里HH 表示十六进制值。空字节使用"file://0.0.0.0/"来表示。
   
BodyUnicode--美国英语,特指拉丁UTF-16LE(little-endian)编码。这种编码方式会在在每个字符末尾附加一个0字节,以
便使字符更可读。但是在VuGen中实际的参数把所有的0字节都去掉的。但是在发送给Web服务器之前,
web_custom_request函数会重新添加0字节的。对于不可打印的字符,使用单反斜杠表示,无法表示空字节。

注意:如果请求体大于100K,会使用一个变量来代替Body参数。变量是在 lrw_custom_body.h中定义的。

18)Raw Body:
   请求体是作为指针传递的,此指针指向一串数据。 二进制的请求体可以使用BodyBinary 属性来发送(或者使用Body 属性来传递,前提是必设置
"Binary=1"
)。无论如何,这种方法需要使用转义字符反斜杠把不可打印的字符转换为ASCII字符。为了能有一种更简便的表现原始数据的方式,Raw
Body属性应运而生,可以传递指向二进制数据的指针。使用4个连续的参数集来表示指针,而且必须按照顺序排列:
RAW_BODY_START
指向数据缓冲区的指针
(int) 长度
RAW_BODY_END

例子:
char *abc= .../* a pointer to the raw data */
web_custom_request("StepName",
"URL=http://some.url ",
"Method=POST",
RAW_BODY_START,
"abc",
3,
RAW_BODY_END,
LAST);
   
在应用中,即使设置了数据的长度为0,指针也必须有值,不能为空。在“Binary=1”时,不能使用上面的语法传递原始数据。数据缓冲区中的数据不能使
用参数化。也就时说,缓冲区中的任何参数(例如 "{MyParam}")不能被正确的替代为相应的值,只会以字面值发送。

3、EXTRARES:表明下面的参数将会是List Of Resource Attributes了。

4、LAST :结尾的标示符。

5、List of Resource Attributes

    仅仅当Recording Options--Recording --HTML-based script-- Record
within the current script step选项被选中时,List of Resource
Attributes才会被插入到代码中。Web页面中的非HTML机制产生了资源列表,包含了Javascript, ActiveX, Java
applets and Flash所请求的资源。VuGen's 的Recording
选项中,可以设置把这些资源录制在当前的操作中(默认是此设置)还是作为单独的步骤来录制。

彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义的更多相关文章

  1. 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求

    初学性能测试时候,第一步必学脚本录制,但一路下来各种录制失败.回放脚本失败的问题层出不穷,究其原因一是LR本身存在对测试环境的兼容性问题导致录制失败,更深层次的原因是录制者不清楚LR录制脚本的原理,或 ...

  2. LR破解版录制手机脚本(一)模拟器录制

    最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~!     其实自从LR12出来之 ...

  3. LR破解版录制手机脚本

    LR破解版录制手机脚本 最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~!     ...

  4. 【Loadrunner】LR破解版录制手机脚本

    LR破解版录制手机脚本          最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正 ...

  5. LR脚本录制方式说明

    1.LR脚本录制方式说明1)HTML-based script基于HTML的脚本从内存中读取并下载资源,较少的关联处理,可以加入图片检查,回放时需要解析返回的信息a-基于用户行为的方式 web_lin ...

  6. LR之Oracle 2tier协议录制Oracle脚本

    在一次测试中,需用到sql去查询Oracle数据,并去使用改数据时,查阅各种资料终于实现LoadRunner对Oracle数据库进行操作,分享给大家,也与大家共同进步~   同时也可用Loadrunn ...

  7. LR录制测试脚本

    1.录制的业务流程 2.录制脚本 3.查看脚本

  8. 【LR】录制测试脚本中的基本菜单

    学习来源: MBoo,小强老师性能测试及Loadrunner培训  ——录制测试脚本: 1.Vuser -> run-time settings ->General Run Logic : ...

  9. Loadrunner脚本录制常见问题整理

    1.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开Inter ...

随机推荐

  1. PHP Unit资料收集

    ThinkPHP Unit https://github.com/gaoermai/ThinkPHPUnit PHPUnit入门http://blog.csdn.net/fly_heart_yuan/ ...

  2. 如何使用VisualStudio2013编写和调试c语言程序

    觉得很多基础学习者对VS不太熟悉,我就转一篇觉得还不错的.转自:http://jingyan.baidu.com/article/f3ad7d0fe7ca0d09c3345b84.html 现在大多数 ...

  3. go语言之进阶篇Read的使用

    1.read的使用(备注:读文件) 示例: package main import ( "fmt" "io" "os" ) func Wri ...

  4. go语言之进阶篇数组越界导致panic

    1.数组越界导致panic 示例: package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaa ...

  5. 轻松搞定 easyui datagrid 二次加载的问题(转)

    对于使用url方式的初学者,经常碰到重复请求的问题,这个问题的根源是因为一旦设置了url参数,Datagrid组件在实例化的时候就会做请求,如何避免二次加载这样问题呢,个人觉得注意以下两点基本就可以防 ...

  6. iOS开发-UIScreenEdgePanGestureRecognizer实战

    UIScreenEdgePanGestureRecognizer名字很长,而且关于其文档也是少的的可怜,苹果官方给的唯一的一个属性是edges,文档中的解释是这样的: A UIScreenEdgePa ...

  7. Laravel 5 中使用 JWT(Json Web Token) 实现基于API的用户认证

    在JavaScript前端技术大行其道的今天,我们通常只需在后台构建API提供给前端调用,并且后端仅仅设计为给前端移动App调用.用户认证是Web应用的重要组成部分,基于API的用户认证有两个最佳解决 ...

  8. 【Eclipse】Eclipse-Build-缓慢-卡住

    Eclipse-Build-缓慢-卡住 eclipse building workspace 卡主_百度搜索 解决building workplace 导致的卡死,使得eclipse加速 - CSDN ...

  9. 【应用】R--判断类别型属性之间是否有相关性(相互之间是否独立)

    检验某学区所有在售房源中,小区与楼栋类别(低层:多层;小高层:高层)是否相关 导入数据: > house<- read.table("house_data.txt", ...

  10. 【转】BFC是什么

    原文:https://www.cnblogs.com/mlw1814011067/p/10397999.html ------------------------------------------- ...