LR实现http协议性能测试脚本

1.  GET方式的HTTP请求性能测试脚本

Action()
{
    web_set_max_html_param_len("10000");
    web_reg_save_param("retCode",
        "LB=retCode\":\"",
        "RB=\"",
        "NotFound=WARNING",
        LAST);
    lr_start_transaction("test");
    web_custom_request("test ",        "URL=http://127.0.0.1/test?channelno=1&phoneno=12345678912",
        "Method=GET",
        "Resource=0",
        "Referer=",
        "Mode=HTTP",
        "EncType=txt/html; charset=UTF-8",
        "Body=",
        LAST);
if (!strcmp(lr_eval_string("{retCode}"),"000000"))
    {
      lr_output_message("Successfull, retcode is:%s", lr_eval_string("{retCode}"));
    lr_end_transaction("test", LR_PASS);
    }
else{
    lr_error_message("Failed, retcode is:%s", lr_eval_string("{retCode}"));
    lr_end_transaction("test", LR_FAIL);
    }
return 0;
}

2.  POST格式的json串请求

Action()
{

    web_reg_save_param("retCode",
        "LB=retCode\":\"",
        "RB=\"",
        "NotFound=WARNING",
        LAST);

    lr_start_transaction("test");

   web_add_header("Content-Type" ,"application/json");
    web_custom_request("test",
        "URL=http://127.0.0.1/test ",
        "Method=POST",
        "Resource=0",
        "Referer=",
        "Mode=HTTP",
        "EncType=application/json; charset=UTF-8",
        "RecContentType=application/json",
        "Body={\"channelNo\":\"{channelNo}\",\" phoneno \":12345678900,\"createdTime\":\"{createdTime}\"}",
       LAST);

if (!strcmp(lr_eval_string("{retCode}"),"000000"))
    {
    lr_output_message("Successfull, retcode is:%s", lr_eval_string("{retCode}"));
    lr_end_transaction("test ", LR_PASS);
    }
else{
    lr_error_message("Failed, retcode is:%s", lr_eval_string("{retCode}"));
    lr_end_transaction("test ", LR_FAIL);
    }

return 0;
}

说明:在编写json串时,注意保证body内容的正确性,字符串必须在\" \"之间,参数名称与参数值之间是:,参数与参数之间用逗号分隔

3.  web_reg_save_param函数

3.1  方法介绍

语法:

int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);

参数说明:

ü  ParamName: 存放得到的动态内容的参数名称

ü  list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写

Notfound: 当在返回信息中找不到要找的内容时应该怎么处理

Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值

Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。

LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。

RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。

RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。

Search : 返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。

ORD : 说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。

SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0。

SaveLen :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。

说明:如果左右边界中含有中文字符,请在Tool->Recording Options,Advanced中勾选Support Charset为utf-8

3.2  常见问题以及解决方法

MsgId: MERR-26377

报错信息:"Check whether the requested boundaries exist in the response data. Also, if the data you want to save exceeds 1592 bytes, use web_set_max_html_param_len to increase the parameter size [MsgId: MERR-26377]"。

错误原因及解决办法:

ü  左右边界取值不正确:Vuser->scan action for correllations 在correlation results中选中需要关联信息,点crete rule查看左右关联字符。

ü  关联函数的位置放置错误:Vuser->scan action for correllations 将脚本切换到script下并在correlation results中双击需要关联信息,光标会在scrip中定位在需要关联的位置。

ü  服务器返回的报文过长,超出了LoadRunner默认的参数保存长度(1024字节),在设置关联的语句之前加上如下语句:web_set_max_html_param_len(“10000″);(web_set_max_html_param_len函数用于设置需要保存的HTML字符串的长度);

4.  web_custom_request 函数

这个函数的作用是自定义http请求规则,可以自由定义需要的http的get和post请求。具有web_link()、web_url()、web_submit_data()函数的功能

4.1  方法介绍

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

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

参数说明:

ü  RequestName:步骤的名称,VuGen中树形视图中显示的名称。

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

(1)URL:页面地址

(2)Method:页面的提交方式,POST或GET。

(3)Resource:指示URL是否属于资源。1 是;0 不是。设置了这个参数后,RecContentType参数被忽略。Resource=1,意味着当前操作与所在脚本的成功与否关系不大。在下载资源时如果发生错误,是当作警告而不是错误来处理的;URL是否被下载受Run-Time Setting—Browser Emulation--Download non-HTML resources 这个选项的影响。此操作的响应信息是不做为HTML来解析的。“Resource=0”,表明此URL是重要的,不受发送请求(RTS)的影响,在需要时也会解析它。

(4)Referer:当前页面关联的页面。如果已经显式指定了url的地址,此项可以省略。

(5)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这些函数。这种方法更为灵活,但是生成的脚本不够直观。

(6)EncType: 编码类型。此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content-Type”请求头的值,例如“text/html”。Web_custom_request函数不处理未编码的请求体。请求体参数将会使用已经指定的编码方式。因此,如果指定了不匹配HTTP请求体的“EncType”,会引发服务端的错误。通常我们建议不要手动修改录制时的“EncType”值。

任何对于EncType的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当指定了EncType=(空值)时,不会产生Content-Type请求头。当省略了EncType时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有web_add_[auto_]header函且Method=POST,application/x-www-form-urlencoded会做为默认值来使用。其他情况下,不会产生Content-Type请求头。

(7)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中定义的。

(8)BodyFilePath:  作为请求体传送的文件的路径。它不能与以下属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinary,BodyUnicode,RAW_BODY_START或Binary=1。

(9)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本身不检查指定的字符串与浏览器本身的值是否相同)

(10)Binary: Binary=1表示页面请求体中的每一个以file://x/##形式出现的值(在这里“##”代表2个十六进制数字),都会被替换为单字节的十六进制的值。如果Binary=0(默认值),所有的字符序列只是按照字面的值传递。需要注意双斜杠的用法。在C编译器中双斜杠被解释为单斜杠。如果不需要零字节,单斜杠可以在Binary不等于1的情况下使用(例如,使用\x20代替file://x20/)。如果需要零字节,那么只能使用file://x00/且设置 “Binary=1”,\x00在逻辑上会被截断。

(11)ContentEncoding:  指定请求体的使用指定的方式(gzip或者deflate)进行编码(例如压缩),相应的Content-Encoding: HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。

FtpAscii: 1使用ASCII模式处理FTP操作;0"使用二进制模式。

TargetFrame:当前链接或资源所在Frame的名称。除了Frame的名字,还可以指定下面的参数:

_BLANK:打开一个空窗口。

_PARENT:把最新更改过的的Frame替换为它的上级。

_SELF:替换最新更改过的的Frame。

_TOP:替换整个页面。

(12)RecContentType: 录制脚本时响应头的内容类型。

例如text/html、 application/x-javascript等。当没有设置Resource属性时,用它来确定目标URL是否是可记录的资源。此属性包含主要的和次要的资源。最频繁使用的类型是 text、image application。次要的类型根据资源不同变化很多。例如:RecContentType=text/html:表示html文本。RecContentType=application/msword:表示当前使用的是Msword。

(13 ResourceByteLimit: web页面下载资源的极限大小。当达到设置的极限后,无法下载其他资源。仅仅对需要下载的资源有效。下载过程:如果总计下载大小小于极限值,则正常开始下载。如果当下载时达到了设置的极限值,资源大小可知(在HTTP响应头中指定了Content-Length),这种情况下,如果只需要一个缓冲区,那么下载可以正常完成。如果需要的不止一个缓冲区,或者资源大小不可知,下载就会中断同时关闭当前连接。这个特性可以用来模拟用户不等待一个页面下载完成时导航到另一个页面的情况。在HTTP模式中无法使用,在Concurrent Groups(Vuser脚本中的一个区,此区中的所有函数并发执行)区中也无法使用。仅仅适用于Sockets的回放,WinInet也是不适用的。

(14)Snapshot:快照的文件名。

(15)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。

(16)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}")不能被正确的替代为相应的值,只会以字面值发送。

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

ü  LAST :结尾的标示符。

ü  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 选项中,可以设置把这些资源录制在当前的操作中(默认是此设置)还是作为单独的步骤来录制。

4.2  常见问题

POST格式的json串报错Error -26631: HTTP Status-Code=400 (Bad Request) for

一般都是发送的http请求错误导致,建议使用监控工具抓包看下(WireShark、Fiddler等),检查body中字段的大小写是否正确,符号使用格式是否正确等,之前遇到过赋值使用了=,应该是:

5.  lr_eval_string函数

返回脚本中的一个参数当前的值,返回值类型:char

6.  web_add_header函数

在下面的http请求中增加header头信息

7.  参考资料

http://www.cnblogs.com/Automation_software/p/3482094.html

http://blog.csdn.net/juanmantou/article/details/8291196

http://www.tuicool.com/articles/aAvyIb

http://blog.csdn.net/yong_sun/article/details/6733096

http://blog.csdn.net/dfbrt56/article/details/3321558

时间: 2024-10-29 00:02:37

LR实现http协议性能测试脚本的相关文章

【JMeter4.0学习(三)】之SoapUI创建WebService接口模拟服务端以及JMeter测试SOAP协议性能测试脚本开发

目录: 创建WebService接口模拟服务端 下载SoapUI 新建MathUtil.wsdl文件 创建一个SOAP项目 接口模拟服务端配置以及启动 [阐述]:首先应该遇到了一个共同的问题,JMeter3.2之后就没有WebService(SOAP) Request,后来经过查询网上资料得知其实可以用HTTP请求来操作,结果是一样的. 具体资料大家可以参照原文<Jmeter测试SOAP协议(Jmeter 3.3)>感谢作者:stone9159 [步骤]: 一.创建WebService接口模拟

LR基于HTTP协议的WebService测试

最近发现之前做过的东西,在未掌握牢固的情况下,很快就会忘掉,所以,通过这些东西来保留下一些测试方法,以便以后能够回顾. WebService的最后一种测试方法,也就是通过HTTP协议来手写脚本完成测试,这里虽说手写脚本,其实完成的大部分还是复制粘贴的工作,很简单,下面简要记录. 这种方式和soap_request一样,都是找到接口文档的请求,利用这些请求书写函数. 首先,LR新建HTTP协议的脚本. 第二,脚本中用web_custom_request();函数,其中参数url为我们的天气预报的地

性能测试脚本开发(LR.NET控件)

版权声明:本文为兄弟连IT教育原创文章,未经博主允许不得转载. 性能测试过程中,最耗费经历的就是编写性能测试脚本的过程,在大部分的测试工具中都是采用录制的方式,通过录制产生脚本,然后根据需要进行修改,以及参数化.有些时候为了能够完成某一个功能的脚本,需要将录制下来的脚本进行"大手术",给编写脚本的人带来了很大的麻烦. 这篇文章向大家介绍了一种新的方式产生脚本,对于 ISV (独立软件开发商)和一些有 代码的测试厂商带来了很大的方便,特别是一些 C/S 结构的产品采用此种方式更加有效.文

LR破解版录制手机脚本

LR破解版录制手机脚本 最近在网上听到好多童鞋都在问如何用LR做手机性能测试,恰好自己对这方面也挺感兴趣,经过查阅很多资料,形成此文档以做备注~!如果有感觉我写的不对的地方,敬请指正,谢谢~!        其实自从LR12出来之后,大家已经可以借助android HP LoadRunner Mobile Recorder在手机上录制脚本并上传到LR12解析手机脚本(具体过程不多说,感兴趣的童鞋可自行百度),但是这种方法的缺点就是LR12不支持破解!!!        废话不多说,切入正题! 一

LoadRunner 性能测试脚本

1   概述 脚本录制编写是性能测试的一个重要环节.在性能测试过程中,虚拟用户模拟真实用户使用被测系统,这个"模拟"的过程正是通过性能测试脚本来实现的.因此,编写一个准确无误的脚本对性能测试有至关重要的意义.完成性能测试脚本包括两个步骤:脚本录制和脚本编写,本文重点关注脚本编写. 2   脚本录制 2.1.录制方式 HTTP协议脚本录制可选两种方式:基于HTML和基于URL.选择哪种录制方式的原则如下:基于浏览器的HTTP应用系统选择HTML,基于其他方式的HTTP应用系统选择URL.

自行控制loadrunner的socket协议性能测试 (转)

一前言 二任务的提出 三实现方案讨论 四技术要点讲解 如何开始录制一个最简单的收发数据包脚本 写日志文件 一行一行读数据包文件 字符串转换为十六进制数据包 发送自己定义的数据包 接收数据包到自定义缓冲区 从自定义缓冲区读出数据 如何释放自定义缓冲区 如何根据数据包返回计算为十进制数 五小节 摘要:通过实例讲解loadrunner中的socket协议性能测试的一种测试方法,如何不依赖loadrunner既定规则,自行控制收发数据包 关键词:Loadrunner,socket,自行控制,收发数据包

品味性能之道&lt;九&gt;:利用Loadrunner编写socket性能测试脚本简述

一.概述 Loadrunner拥有极为丰富的工具箱,供予我们制造出各种奇妙魔法的能力.其中就有此次要讨论的socket套接字操作. 二.socket概述 socket是操作系统中I/O系统的网络延伸部分,它扩展了操作系统的基本I/O到网络通信,使进程和机器之间的通信成为可能.如果想完全地理解socket在Loadrunner中如何工作的,熟悉一些关于它的历史会很有帮助. 当前常用的socket,最早起源于BSD UNIX类的操作系统.在UNIX系统上,比如BSD,把对网络的支持加入操作系统,以一

sockt-浅谈接口性能测试脚本编写

平时我们做的都是http请求的接口测试,初次接触socket接口还是有点不知如何下手,其实他如http接口请求区别并不是很大,也是接口的链接-发送数据-断开连接这三大步骤来实现: 以下文章转载自:http://lovesoo.org/how-to-use-loadrunner-to-write-socket-protocol-script.html   因为其介绍的更为形象,便于理解 本文主要介绍使用LoadRunner手工编写Windows Socket协议测试脚本的方法. 通过LoadRun

mongodb写入性能测试脚本记录

一.逐条写入性能测试脚本 [[email protected] bin]# ./mongo 172.27.8.118:40000 SHARDING_2:PRIMARY> use admin  switched to db admin  SHARDING_2:PRIMARY> db.auth('wlan','wlan') SHARDING_2:PRIMARY> use estestdbnew switched to db estestdbnew SHARDING_2:PRIMARY>