LoadRunner中,常用的函数有很多,这里只介绍编写性能测试脚本过程中那些必然用到的函数。本文重点关注这些典型函数的应用场合及注意点,至于函数详细使用说明请参见LoadRunner帮助文档。

1.1.1.事务相关

1.1.1.1. lr_start_transaction/lr_end_transaction

功能:事务开始/结束标记。

应用场合:需要统计某一段代码块执行所需要的时间,这两个函数需要成对使用。

举例:工作流系统性能测试中有一个需求,300人在线,提交工单操作平均响应时间在3秒以内,则需要在提交工单请求步骤之前插入lr_start_transaction,提交工单请求步骤之后插入lr_end_transaction。

注意点:这两个函数只是标记函数,用于标记事务开始/结束,因此可以嵌套使用,即事务中还可以包含子事务。

1.1.1.2. lr_think_time

功能:模拟思考时间,即等待时间。

应用场合:在线用户测试,为了让每一个虚拟用户模拟一个真实用户的行为,即让一个虚拟用户对系统产生的压力跟真实用户相当,就必须使用这个函数。这是因为,用户在使用系统的过程中,从一个操作转换到另一个操作,是需要时间的,这个时间就是思考时间。

举例:客服3.0工作流系统在线用户测试。对于工单查询操作,输入查询条件后提交查询,从输入查询条件至提交查询的时间间隔就是思考时间。因为LoadRunner无法模拟键盘输入的过程,它只能模拟键盘输入的等待时间,此时需要在提交查询的那个动作前插入lr_think_time函数。

注意点:在录制脚本中,原子事务内不要包含lr_think_time函数,否则该思考时间将被统计到事务响应时间中,造成结果不准确。另外lr_think_time是否启作用,可通过runtime-seting进行设置。

注:原子事务指那些不能再分割为更小事务的事务,它经常指一个单一的业务操作,通常表现为一个URL请求。

1.1.1.3. lr_rendezvous

功能:在Vuser脚本中设置集合点。

应用场合:并发测试。

举例:客服3.0培训考试系统,100人同时打开同一份试卷。则需要在打开试卷的语句前插入lr_rendezvous函数,并在场景中设置集合点策略。

注意点:非并发测试,例如在测试系统的处理能力时,最好不要设置集合点,因为一旦设置了集合点,将导致一些VUser处于等待状态,在这等待过程中服务器将是空闲的,这将导致不能准确的测试出服务器的真实性能水平。集合点更多用于发现系统的并发问题。

1.1.2.参数化/关联

1.1.2.1.lr_save_string/lr_save_int

功能:将某一字符串/整型保存为参数。

应用场合:有些变量的值通过C语言生成,之后在测试脚本中要使用这些变量。

举例:客服3.0业务配置台系统增加业务代表操作,业务代表的工号和姓名使用C语言函数生成。工号和姓名分别保存在staff_no和staff_name变量中,则在脚本中可以使用lr_save_int(staff_no,"staffno"),lr_save_string(staff_name, "stafffname")将工号和姓名参数化。

注意点:无。

1.1.2.2.web_reg_save_param

功能:在服务器返回的文本中查找一个或者多个字符串,并将搜索到的字符串值保存在参数中。

应用场合:在B/S或者C/S系统中,服务器返回给客户端的数据有些是动态改变的,在脚本的下一个步骤中,需要使用该动态数据。这时,就需要使用关联获得该动态数据。

举例:客服3.0工作流系统,工单办理每次都从待办区中打开第一条工单,为打开第一条工单,需要获取第一条工单的完整URL(包括URL中的parameter及其值),而每一次进入待办区,第一条工单有可能是不一样的。为获取第一条工单的URL,将打开工单的URL做关联。已知打开待办区操作获得的HTML有如下片断:

<a href="#"onclick="javascript:openseviceforprocess('/iwflow/FindJspID.jsp?serialNo=2008092200000033&serviceID=0099&nodeID=140004&dealID=2008092200000056&hisFlag=0&skillID=020401&dealSkillID=020101&dealStaff=1200','false');">

可在打开待办区的操作前插入如下语句:

web_reg_save_param("tt_url", "LB=javascript:openseviceforprocess('","RB=','false')", "Ord=1","IgnoreRedirections=Yes", "Search=Body","RelFrameId=1", LAST );

运行脚本后,tt_url的值为:

/iwflow/FindJspID.jsp?serialNo=2008092200000033&serviceID=0099&nodeID=140004&dealID=2008092200000056&hisFlag=0&skillID=020401&dealSkillID=020101&dealStaff=1200

这个URL就是打开第一条工单的URL,有了URL,便可打开工单。

注意点:

(1)LoadRunner工具只能识别文本,在HTTP协议中只能识别HTML文档,因此关联的依据是HTML源码,而不是经过浏览器解析后的可视化文本。这一点很重要。

(2)关联还能将多个匹配的参数保存在数组中,方法是指定ORD的属性值为ALL,之后通过“{参数名_1}”, “{参数名_2}”, “{参数名_3}”格式可获得数组元素的值。

(3)该函数有一个属性NOTFOUND,默认值为ERROR,也就是说,如果找不到要查找的数据,将报出错误,在必要的时候,例如脚本逻辑控制需要,可以将NOTFOUND的属性值设为WARNING,这样LoadRunner将不产生错误。

1.1.2.3.lr_save_searched_string

功能:在某一个字符缓冲区中搜索指定的字符串,并将搜到的字符串保存在参数中。

应用场合:可配合LoadRunner的关联功能,灵活获取服务器端返回的数据。

举例:客服3.0工作流系统,工单处理每次都从待办区中打开第一条工单,打开工单的URL已经通过关联保存在tt_url参数中,在工单处理提交时,需要使用serviceNo,serviceID,nodeID,dealID,tt_url的值如下:

/iwflow/FindJspID.jsp?serialNo=2008092200000033&serviceID=0099&nodeID=140004&dealID=2008092200000056&hisFlag=0&skillID=020401&dealSkillID=020101&dealStaff=1200

可使用以下函数保存serviceNo,serviceID,nodeID,dealID的值。

//保存serialNo,serviceID,nodeID,dealID参数

int getTTData(){

int i = 0;int j=0;

char *tt_url = lr_eval_string("{tt_url}");

int len= strlen(tt_url);

while(tt_url[i]!='='){i++;} while(tt_url[j]!='&'){j++;}

lr_save_searched_string(tt_url,len,0,"serialNo",1,j-i-1,"serialNo");

i++;j++;while(tt_url[i]!='='){i++;} while(tt_url[j]!='&'){j++;}

lr_save_searched_string(tt_url,len,0,"serviceID",1,j-i-1,"serviceID");

i++;j++;while(tt_url[i]!='='){i++;}  while(tt_url[j]!='&'){j++;}

lr_save_searched_string(tt_url,len,0,"nodeID",1,j-i-1,"nodeID");

i++;j++; while(tt_url[i]!='='){i++;}  while(tt_url[j]!='&'){j++;}

lr_save_searched_string(tt_url,len,0,"dealID",1,j-i-1,"dealID");

return 0;

}

注意点:

1.1.2.4.lr_save_datetime

功能:将时间保存为参数。

应用场合:应用系统需要把时间数据提交给服务器端。

举例:客服3.0工作流系统活动工单查询,默认查询从当天开始的最近三天工单。 则查询的开始时间和结束时间可用lr_save_datetime获取。

lr_save_datetime("%y-%m-%d00:00", DATE_NOW-2*ONE_DAY, "queryBeginTime");

lr_save_datetime("%y-%m-%d23:59", DATE_NOW, "queryEndTime");

注意点:

 

1.1.2.5. web_save_timestamp_param

功能:将当前时间戳保存为参数。

应用场合:应用系统需要把时间戳提交给服务器端。

举例:多媒体坐席客户端,在向MClient提交信息时,需要附带客户端的时间戳,则可以使用该函数获取当前时间戳。

注意点:与lr_save_datetime不同的是,本函数保存的是时间戳,而lr_save_datetime保存的是日期和时间。

 

1.1.2.6.lr_eval_string

功能:将某一字符串中包含的所有参数替换为真实值,并返回替换后的字符串。

应用场合:欲查看某一参数的值,可使用该函数。

举例:客服3.0工作流系统,生成工单时打开工单页面准备工单提交,提交之前想查看已通过关联保存的serialNo参数的值。方法如下:

lr_output_message(lr_eval_string("TheserialNo is {serialNo}"));

注意点:如果不存在该参数,将把“{参数名}”当作普通字符串输出。如本例,如果不存在serialNo参数,则输出:The serialNo is {serialNo}。

 

1.1.3.验证点

1.1.3.1.web_reg_find

功能:在HTML文档中查找指定的字符串。

应用场合:该函数是检查点函数,在脚本中需要插入检查点的地方使用。

举例:客服3.0工作流系统,提交工单生成后,需要验证工单是否提交成功。则可根据页面提示“工单生成成功”进行验证。在提交生成工单步骤前插入:

web_reg_find("Text=工单生成成功",LAST);

注意点:该函数是注册型参数,需要在请求服务器数据步骤之前插入该函数。与该函数功能类似的函数是web_find,但是web_find只对HTML方式的脚本起作用,对URL方式脚本则不起作用,而且web_find函数效率低下,已被废弃。

 

1.1.3.2. web_image_check

功能:判断某一个图片是否存在HTML页面中。

应用场合:同web_reg_find函数一样,该函数也是检查点函数,在脚本中需要插入检查点的地方使用。

举例:客服3.0培训考试系统并发测试,50个人同时打开试卷,为了验证打开试卷成功,根据试卷中的图片public/images/onexam.gif进行验证:

web_image_check("web_image_check","Src=public/images/onexam.gif",LAST);

注意点:要使该函数生效,需要在runtime-seting中将打开。与web_reg_find不一样的是,该函数不是注册型函数,因此需要在请求返回步骤之后插入该函数。上文提过,LoadRunner只能识别文本,因此web_image_check函数其本质仍然是文本验证,完全可以用web_reg_find替代,而且强烈推荐使用web_reg_find作为检查点函数。

 

1.1.4.日志输出

1.1.4.1. lr_output_message

功能:将VUser的消息打印到日志文件和输出窗口中,打印的消息带有脚本行信息。

应用场合:方便查看运行信息,辅助问题定位。

举例:客服3.0系统,登录工号已经参数化,调试脚本时将当前的登录工号输出到Replay Log窗口中。代码如下:

lr_output_message("Thestaffno is %s",lr_eval_string("{staffno}"));

注意点:与该函数具有类似功能的还有:lr_debug_message,lr_log_message lr_message,lr_error_message它们之间的不同之处这里不作详细介绍,请参见LoadRunner帮助文档。

1.1.4.2. lr_vuser_status_message

功能:将VUser的消息输出到场景运行的VUser状态窗口。

应用场合:将一些关键信息输出到VUser运行状态窗口,方便场景执行时查看。

举例:在场景运行过程中,出现了错误。根据错误窗口提示,该错误属于VUser ID为2的虚拟用户,为了方便将系统登录用户名与VUser ID对应起来,以方便问题定位。可以使用以下代码:

lr_vuser_status_message("Thelogin username is %s", lr_eval_string("{username}"));

场景执行时,可方便查看到VUserID与登录用户名的对应关系,如下图:

注意点:

1.1.5.其它实用函数

1.1.5.1. lr_get_vuser_ip

功能:获得VUser的IP地址。

应用场合:在使用IP欺骗时,为了验证IP欺骗是否成功,可以使用该函数。

举例:在场景运行过程中,将每一个VUser的IP在VUser运行状态窗口中显示出来。

char *ip;

ip = lr_get_vuser_ip();

if (ip)

{

lr_vuser_status_message("The IP addressis %s", ip);

}

注意点:为了使IP欺骗成功,使用IP欺骗向导设置好IP后,还要将打开才可。

1.1.5.2. lr_load_dll

功能:加载外部DLL。

应用场合:脚本需要使用外部DLL时,使用该函数加载DLL。

举例:函数getDateTime(char * time,int seconds,char * resultTime)已封装在timeutil.dll中,getDateTime的功能是根据传入的日期字符串time(如2008-09-24 16:56:24),秒偏移量seconds,计算返回结果日期字符串resultTime,代码如下:

int hours =atoi(lr_eval_string("hours"));

char acceptEndTime[20];

lr_load_dll("../timeutil.dll");

getDateTime(lr_eval_string("{acceptBeginTime}"),3600*hours,acceptEndTime);

注意点:该函数为LoadRunner提供了调用外部接口的能力。

LoadRunner-常用的函数的更多相关文章

  1. LoadRunner常用函数列表

    LoadRunner常用函数列表 Web相关函数 函 数 功  能  描  述 web_custom_request 用户可以通过该函数自行创建一个HTTP请求的函数 web_image 模拟用户单击 ...

  2. loadrunner常用函数集锦

    一.三个复制函数的区别: strcpy 原型:extern char *strcpy(char *dest,char *src);用法:#i nclude功能:把src所指由NULL结束的字符串复制到 ...

  3. oracle(sql)基础篇系列(一)——基础select语句、常用sql函数、组函数、分组函数

        花点时间整理下sql基础,温故而知新.文章的demo来自oracle自带的dept,emp,salgrade三张表.解锁scott用户,使用scott用户登录就可以看到自带的表. #使用ora ...

  4. php常用字符串函数小结

    php内置了98个字符串函数(除了基于正则表达式的函数,正则表达式在此不在讨论范围),能够处理字符串中能遇到的每一个方面内容,本文对常用字符串函数进行简单的小结,主要包含以下8部分:1.确定字符串长度 ...

  5. php常用数组函数回顾一

    数组对于程序开发来说是一个必不可少的工具,我根据网上的常用数组函数,结合个人的使用情况,进行数组系列的总结复习.里面当然不只是数组的基本用法,还有相似函数的不同用法的简单实例,力求用最简单的实例,记住 ...

  6. byte数据的常用操作函数[转发]

    /// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...

  7. WordPress主题模板层次和常用模板函数

    首页: home.php index.php 文章页: single-{post_type}.php – 如果文章类型是videos(即视频),WordPress就会去查找single-videos. ...

  8. Python 常用string函数

    Python 常用string函数 字符串中字符大小写的变换 1. str.lower()   //小写>>> 'SkatE'.lower()'skate' 2. str.upper ...

  9. MySQL之MySQL常用的函数方法

    MySQL常用函数 本篇主要总结了一些在使用MySQL数据库中常用的函数,本篇大部分都是以实例作为讲解,如果有什么建议或者意见欢迎前来打扰. limit Select * from table ord ...

  10. Delphi常用系统函数总结

    Delphi常用系统函数总结 字符串处理函数 Unit System 函数原型 function Concat(s1 [, s2,..., sn]: string): string; 说明 与 S : ...

随机推荐

  1. 笔记本怎么设置WIfi热点

    随着手机的发展,流量的消耗也是大大地增加.虽然很多手机支持wifi,但是不加密或者知道密码的wifi热点却寥寥无几.笔记本的无线网卡显出神通了.那么,如何在笔记本上建立wifi热点呢? 工具/原料 一 ...

  2. 解决导入protobuf源代码Unity报错的问题

    将源代码导入Assets目录后, unity引擎会出现以下报错: 解决办法: 在 unity项目Assets目录中创建smcs.rsp文件,内容为-unsafe,其作用为可编译不安全代码.     然 ...

  3. windows下dubbo-admin和zookeeper安装部署

    1.   概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...

  4. 【jersey】 spring 整合jersey 实现RESTful webservice

         Jersey是一个RESTFUL请求服务JAVA框架,与常规的JAVA编程使用的struts框架类似,它主要用于处理业务逻辑层.与Struts类似,它同样可以和hibernate,sprin ...

  5. 7 -- Spring的基本用法 -- 4... 使用 Spring 容器:Spring 容器BeanFactory、ApplicationContext;ApplicationContext 的国际化支持;ApplicationContext 的事件机制;让Bean获取Spring容器;Spring容器中的Bean

    7.4 使用 Spring 容器 Spring 有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext 是 BeanFactory ...

  6. HQL的执行过程

    解释器.编译器.优化器完成HQL查询语句从词法分析.语法分析.编译.优化以及查询计划(Plan)的生成.生成的查询计划存储在HDFS中,并在随后有mapreduce调用执行. 举个例子: 第一步:输入 ...

  7. Array遍历的小技巧

     如果在遍历中删除或增加了部分元素,就会导致遍历失败,因为对象数组的长度发生了变化,索引随之而变,遍历的结果不完整或者引发运行时错误.其实不需要任何复杂的判断,最简单的方法是:倒过来遍历,像这样: f ...

  8. .Net内存溢出 System.OutOfMemoryException

    内存溢出常见的情况和处理方式: http://outofmemory.cn/c/dotNet-outOfMemoryException MSDN中关于processModel的文档 https://m ...

  9. Linux 启动文件、设置环境变量的位置

    系统级启动文件  ==================================== 1./etc/rc  主启动文件,不要修改它 2./etc/rc.conf  决定启动哪些系统自带的守护进程 ...

  10. TCP协议的基本规则和在Java中的使用

    TCP协议是面向连接的,相对于UDP协议来说效率较低,但是比较安全,数据不容易丢失.TCP协议类似打电话的过程,在一端拨号时必须等待对方回应,确定两端建立了连接通道才能传送信息. 在Java中TCP被 ...