LoadRunner中的常用函数(二)

来源:互联网 发布:淘宝直播的东西可靠吗 编辑:程序博客网 时间:2024/05/21 18:32

参考资料:

LoadRunner函数大全之中文解释.pdf

 前言:

在使用Loadrunner做性能测试的过程中,发现Loadrunner的函数库真的很强大,很多时候遇到的问题,只需要通过某一个Loadrunner自带的函数就可以解决。就跟很多编程语言自带的库一样,Loadrunner也有这么一个庞大的库,而且在Loadrunner中可以直接调用,不需事先加载。

这里就对一些常用的函数进行了整理,部分函数也是C语言自带的函数,但用处和Loadrunner的函数一样广泛。熟练使用这些函数,既能简化脚本代码,同时也可以有效地监控脚本运行的过程和结果。

 

 

 

与操作有关的函数

1.      web_url()

web_url函数是一个操作函数,它可以加载指定的网页(GET 请求)。函数web_url

可以加载 URL 属性指定的 URL。函数web_url不需要上下文。

该函数是应用最广泛的一个函数,一般不需要手写,通过LR使用浏览器录制HTTP协议的脚本基本上都是使用该函数与http服务器进行交互。

定义:

intweb_url (const char *Name, const char * url, , [EXTRARES,

Resource Attributes>,] LAST );

 

例子:

       web_url("favicon.ico",

                   "URL=http://www.grandcloud.cn/favicon.ico",

                   "Resource=0",

                   "RecContentType=text/html",

                   "Referer=",

                   "Snapshot=t2.inf",

                   "Mode=HTML",

                   LAST);

 

 

2.      web_custom_request()

web_custom_request函数是一个操作函数,通过它可以使用任意方法创建自定义 HTTP 请求或创建正文。默认情况下,VuGen只为无法用其他 Web 函数解释的请求生成该函数。

    这个函数通常是手工编写脚本用的,当与http服务器交互不是通过浏览器进行交互,就会用到该函数,比如基于soap协议的xml格式或者json格式的消息交互。

定义:

intweb_custom_request (const char *RequestName, , [EXTRARES,

Resource Attributes>,] LAST );

 

例子:

基于xml格式的消息交互:

web_custom_request("services4",

                       "URL=http://172.16.91.251:8080/web/tr069",

                       "Method=POST",

                       "Resource=0",

                       "RecContentType=text/xml",

                       "Mode=HTML",

                       "EncType=text/xml; charset=utf-8",

                       "Body="

""

         ""

                   "3"

         ""

         ""

                   ""

                            "PicUpdate"

                            ""

                                     "9010"

                                     ""

                            ""

                            "{DATE}T{begin_time1}"

                            "{DATE}T{TIME}"

                   ""

         ""

"",                                                                                                  

                   "Snapshot=t1402309446.inf",

                       LAST);

 

 

基于json格式的消息交互:

         web_custom_request("BOOT",

            "URL=http://172.16.37.201:8080/Qcs/acs/boot",

                 "Method=POST",

            "TargetFrame=",

            "Resource=0",

            "RecContentType=text/xml",

            "Referer=",

            "Mode=HTTP",

                            "Body={"eventType":{"eventCode":"1","subEvent":"0"},"

                            ""deviceId":{"serviceUser":"{service_user}","mac":"{mac}","

                            ""manufacturer":"{Manufacturer}","oui":"00D0D0","productClass":"STB","

                            ""serialNumber":"00100199007011400002D0154AD783F2"},"

                            ""errorcode":"-1","currentTime":"2013-11-06 01:47:07","

                            ""baseParameterList":{"connectionURL":"http://172.16.18.203:7070","

                            ""pppoeUser":"not used","version":"2.06.05.07","

                            ""epgServerUrl":"http://58.223.255.211:8080","FEC":"0"},"

                            ""hardwareVersion":"ZXB600V4A(STBSD-ST5205-000)","softwareVersion":"V40232961"}",

                            LAST);

 

使用web_custom_request发送一个空消息:

         web_custom_request("nullmessage",

                                                  "Method=POST",

                                                        "URL=http://172.16.37.151:8080/web/tr069",

                                                        "RecContentType=text/xml",

                                                  "Snapshot=t4.inf",

                                                  LAST);

 

 

soap_request()

soap_request函数执行一个 SOAP请求。它向指定的 URL 发送 SOAP 包,并接收服务器响应。

除了上面可以使用web_custom_request函数模拟soap消息发送以外,通过soap_request函数也可以模拟soap消息发送。该函数只有在协议选择Web Services的脚本里面才可以使用,它区别于Web(HTTP/HTML)协议, 如果选择Web(HTTP/HTML)协议,则需要使用web_custom_request函数。使用Web Services协议的一个好处是可以直接将xml文件导入到脚本当中,而Web(HTTP/HTML)协议不支持导入xml格式文件。但坏处是使用Web Services协议的Vuser属于GlobalVuser,默认的Global Vuserlicense只有100,而使用Web(HTTP/HTML)Web User, 则可以达到10000。因此对于soap协议消息交互,还是建议使用Web(HTTP/HTML)协议,手工编写脚本。

定义:

intsoap_request (const char *StepName, URL, , LAST]);

 

例子:

         soap_request("StepName=SOAP Request",                                                                                                 "URL=http://172.16.37.151:8080/web/tr069",                                                                              "SOAPEnvelope="

                   ""

                            ""

                                     "1234"

                            ""

                            ""

                                     ""

                                               "0"

                                     ""

                            ""

                   "",                                                                                         

                   "SOAPAction=",                                                                                           

                   "ResponseParam=response",                                                                                     

                   "Snapshot=t1400577097.inf",                                                                                   

                   LAST);

 

3.      web_link()

web_link函数是一个操作函数,它模拟鼠标单击由属性定义的链接。web_link只能在上一个操作的上下文中执行。

该函数可以通过脚本录制自动生成,对于web页面链接性质的页面元素,就可以使用该函数。比如一个下载链接。

定义:

intweb_link (const char *StepName, , [EXTRARES,

Attributes>,] LAST );

例子:

         web_link("update.zip",

                   "Text=update.zip",

                   LAST);

 

4.      web_cleanup_cookies()

web_cleanup_cookies函数删除脚本使用的所有当前存储的Cookie

定义:

intweb_cleanup_cookies ( );

与日志有关的函数

5.      lr_message

lr_message函数将消息发送到日志文件和输出窗口。在VuGen中运行时,输出文件为 output.txt

 

定义:

intlr_message (const char * format, exp1, exp2,...expn.);

 

例子:

lr_message("The begin time is %s",begin_time);

 

 

6.      lr_output_message

lr_output_message函数将带有脚本部分和行号的消息发送到输出窗口和日志文件。

 

定义:

intlr_output_message (const char * format, exp1, exp2,...expn.);

例子:

lr_output_message("The begin time is %s",begin_time);

 

7.      lr_error_message

lr_error_message函数将错误消息发送到输出窗口和Vuser日志文件。要发送不是特定错误消息的特殊通知,请使用lr_output_message

定义:

intlr_error_message (const char * format, exp1, exp2,...expn. );

例子:

lr_error_message("Error 2:The response is not null before updating");

 

 

8.      lr_log_message

lr_log_message函数将消息发送到Vuser或代理日志文件(取决于应用程序)。通过向日志文件发送错误消息或其他信息性消息,可以将该函数用于调试。

定义:

intlr_log_message (const char * format, exp1, exp2,...expn.);

例子:

lr_log_message("The begin time is %s",begin_time);

 

四者的关系和区别:

四个日志函数都会记录日志到mdrv.logoutput.txt文件当中,所不同的是,lr_log_message由日志开关控制,其他三个不由日志开关控制。只有在Run-time Setting中选中”enable logging”才会日志lr_log_message的日志。lr_error_log除了日志错误日志以外,还会在controller中生成响应的error记录,因此,当需要记录某个异常的时候,建议使用lr_error_messagelr_messagelr_output_message的区别在于后者会显示脚本信息和行数,前者则不会显示。

如:

The begin time is 09:44:12                // 对应lr_ message

before_update.c(19): The begin time is 09:44:12   // 对应lr_output_message

 

 

 

与事务有关的函数

9.      lr_start_transaction

lr_start_transaction 函数标记事务的开始。要指明要分析的事务,请使用函数 lr_start_transaction lr_end_transaction。应紧接事务前后插入这些函数。

定义:

intlr_start_transaction ( const char * transaction_name );

例子:

lr_start_transaction("download");

 

 

10.  lr_end_transaction

lr_end_transaction函数标记事务的结束,并录制执行事务所用的时间量。要指明希望分析的事务,请在事务之前放置lr_start_transaction函数,并在事务之后放置lr_end_transaction函数。

定义:

intlr_end_transaction (const char * transaction_name, int status ) ;

例子:

lr_end_transaction("download", LR_PASS);

lr_end_transaction("download", LR_FAIL);

lr_end_transaction("download", LR_AUTO);

 

自动录制的脚本是不会生成该函数的,如果不添加该函数,可以在Run-time Setting中的miscellaneous中选择”define each action as a transaction”,但不建议这样做。添加事务函数可以更加精确的定义某个事务的起始结束时间点,这个时间点不一定是某个action的起始结束时间。还可以配合if条件语句有效控制该事务是成功还是失败。

 

 

与返回消息有关的函数

11.  web_reg_save_param()

web_reg_save_param是一个注册类型的函数。它注册一个请求,以在检索到的响应消息中查找并保存一个文本字符串。只有在执行了下一个操作函数(如web_url)后才会执行该操作。

其主要作用是将返回消息中的某个字符串存入一个参数,用来做后续使用。比如发送下一条消息必须携带上一条消息中返回的session id,这个函数就能派上用场。或者对返回的消息的某个字段进行校验

定义:

intweb_reg_save_param (const char *ParamName, , LAST);

例子:

web_reg_save_param("return_length2",

                       "LB=Content-Length: ",

                       "RB=\r\n",

                       "Ord=ALL",

                        LAST);

 

其中LR为左边界,RB为右边界,Ord为查找到匹配值的顺序,默认为1。如果Ord=ALL表示会将所有查找到的匹配值保存到一个list当中。

比如返回消息如下:

HTTP/1.1 200 OK\r\n

Server: Apache-Coyote/1.1\r\n

X-Powered-By: Servlet/3.0; JBossAS-6\r\n

Content-Length: 0\r\n

Date: Fri, 18 Jul 2014 02:35:47 GMT\r\n

\r\n

则上述函数会将Content-Length的长度0存到return_length2这个参数当中。

 

12.  web_get_int_property

web_get_int_property函数返回关于最后一个 HTTP 请求的指定信息。如果一个操作函数返回所条响应消息,则只取最后一个响应详细的结果。

该函数可以指定的返回消息类型:

HTTP_INFO_RETURN_CODE   HTTP请求响应码,如200,404

HTTP_INFO_DOWNLOAD_SIZE   HTTP请求响应大小  包含消息头和消息体

HTTP_INFO_DOWNLOAD_TIME   最后一个http请求返回的下载时长,单位为毫秒

定义:

intweb_get_int_property (constintHttpInfoType);

例子:

intflen;

flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);

 

13.  web_reg_find

web_reg_find函数注册一个请求,以在下一个操作函数(如web_url)检索到的网页上搜索一个文本字符串。

这个与web_reg_save_param有些类似,也是从下一个操作函数中从返回中取出一个文本字符串,所不同的是从返回的消息当中查找某个字符串,而并不需要该字符串位于某个特定位置,也就是存在固定的左右边界。而且可以将查找到的次数保存在相应的参数当中。需要注意的是,如果查询的字符为中文字符,在录制前,需要在option中选择编码格式为UTF-8

定义:

intweb_reg_find (const char *attribute_list, LAST);

例子:

web_reg_find("Text=知道","SaveCount=para_count",LAST);

 

与参数有关的函数

14.  lr_eval_string

lr_eval_string函数在评估任何嵌入的参数之后返回输入字符串。如果字符串实参 (argument) 只包含一个形参(parameter),该函数返回形参的当前值。

这个函数主要用来取出某个参数的值。在Loadrunner中,对于参数替换,是无法在除了操作函数以外直接使用参数的,必须将参数放入这个函数才能表示该参数的值。

定义:

char * lr_eval_string (const char * instring );

例子:

begin_time= lr_eval_string("{TIME}");    //取出时间参数在本次迭代的值,并存入begin_time

lr_vuser_status_message("beforeiteration%s,MAC is %s",lr_eval_string("{iteration}"),lr_eval_string("{MAC}"));  //取出当前迭代次数并打印在消息中。

 

 

15.  lr_save_string

lr_save_string函数将指定的以 null 终止的字符串赋给参数。该函数可用于关联查询。要确定参数值,请使用函数lr_eval_string

这个参数跟lr_eval_string正好相反,是将某个值存入参数当中,以在消息中使用该参数。

定义:

intlr_save_string (const char *param_value, const char *param_name);

例子:

begin_time= lr_eval_string("{TIME}");

lr_save_string(begin_time,"begin_time1");

 

这里需要解释下,这样用的原因。因为TIME参数设置的是每次出现都做一次更新,每次调用TIME参数都会返回不同的值,为了使用最初的TIME值,则必须将TIME参数值取出来以后保存在另一个参数当中。

 

 

16.  lr_save_int

lr_save_int函数将指定的数值型变量赋给字符串参数。

定义:

intlr_save_int( intvalue, const char *param_name);

例子:

 lr_save_int(time(&t),"times");

上述函数的意义是将当前时间距离1970-01-01的秒数存入times参数当中。

 

 

与时间有关的函数

17.  lr_save_datetime

lr_save_datetime函数将当前日期和时间,或具有指定偏移的日期和时间保存在参数中。如果达到MAX_DATETIME_LEN 个字符,结果字符串将截断。

定义:

voidlr_save_datetime(const char *format, int offset, const char *name);

例子:

lr_save_datetime ("%Y-%m-%d %H:%M:%S",DATE_NOW+TIME_NOW,"times");

上述例子中的函数将当前时间以固定格式存储在字符串变量times中。

 

18.   time

C语言自带函数。根据系统时钟,time 函数返回从世界标准时间1970 1 1 日子夜(00:00:00)作为开始所经过的秒数。返回值存储在timeptr所给出的位置。如果timeptrNULL,则该值不会被存储。

定义:

time_t time ( time_t *timeptr );

例子:

typedef long time_t;

    time_t t;

    // Get system time and display as number and string

    lr_message ("Time in seconds since 1/1/70: %ld\n", time(&t));

    lr_message ("Formatted time and date: %s", ctime(&t));

 

 

19.   ctime

C语言自带函数。在 Unix 下,ctime 不是线程级安全函数。所以,请使用 ctime_r。有关详细信息,请参阅平台相关文档。

定义:

char *ctime ( consttime_t *time );

例子:

typedef long time_t;

    time_t t;

    // Get system time and display as number and string

    lr_message ("Time in seconds since 1/1/70: %ld\n", time(&t));

lr_message ("Formatted time and date: %s", ctime(&t));

 

 

 

20.   lr_think_time

lr_think_time可以在运行期间暂停测试执行。这对于模拟思考时间非常有用,思考时间是真实用户在操作之间停下来思考的时间。单位为秒

定义:

voidlr_think_time (double time);

例子:

lr_think_time(60);     //脚本暂停运行60s

 

其他Loadrunner函数

21.  lr_vuser_status_message

lr_vuser_status_message函数向控制器或优化模块控制台的Vuser窗口的“状态”区域发送字符串。它还将该字符串发送到Vuser日志。从VuGen运行时,消息被发送到 output.txt。该函数在场景运行时非常实用,可以直接在Controller里面的Vuser窗口当中查看到当前Vuser运行的各种状态,比如已经迭代的次数,所使用的参数值等等。

定义:

intlr_vuser_status_message (const char * format);

例子:

lr_vuser_status_message("before iteration  %s,MAC is %s",lr_eval_string("{iteration}"),lr_eval_string("{MAC}"));

其他C语言函数

22.   atoi

atoi函数将数值字符串转换成数值。

定义:

intatoi ( const char *string );

例子:

if (atoi(lr_eval_string("{return_length2}")) == 0)

 

23.  strcmp

比较string1 string2 以确定字母排序的次序。字符串比较只能使用该函数,而不能直接用“==”进行比较。

定义:

intstrcmp ( const char *string1, const char *string2 );

例子:

if (strcmp(lr_eval_string("{is_update}"),"Download")==0)

如果上述语句改成if (lr_eval_string("{is_update}")=="Download"),则该条件永远为假。