当前位置:文档之家› Loadrunner学习---脚本编写系列 (1)

Loadrunner学习---脚本编写系列 (1)

Loadrunner学习---脚本编写系列 (1)
Loadrunner学习---脚本编写系列 (1)

Loadrunner学习---脚本编写(1)

下面这个网页的文章原来也是看过的,但发现没几天就忘记了,为了加深学习的印象,特把它翻译出来。上是关于脚本编写的介绍.

下面是第一部分,脚本的开发.

VuGen脚本文件的开发过程

1。定义测试项目的目标,环境,脚本,测试数据,硬件等。脚本应该符合编码规范或编码习惯。

2。创建一个版本文件夹来保存被测应用程序相关的各种不同资源,例如截获的.png/.gif 图形文件,录制过程保存的html文件,录制中的所有html源文件和VuGen的录制日志。3。列出(在表里)每一个手动操作业务过程需要的实际步骤

1)截取每一个屏幕图像(screen image )。

2)为每一个屏幕(screen)分配一个唯一的事务名称。

3)为处理的每一个步骤使用的技术组件(URL或者方法和函数)做注释。

4。创建一个版本文件夹。

注:我不喜欢使用默认位置,我喜欢把所有脚本相关的文件放到一个相同的文件夹中。不幸的是,这意味着如果我在不同的测试间互相交换录制,那我每次都得记住修改默认的设置。注:当录制一个新的脚本时,我喜欢选择多协议而不是单个协议。。。

5。根据你的业务处理列表上指定的用户使用步骤和screen的顺序来使用VuGen录制程序,产生一系列脚本代码。在“开始录制”对话框中

* 使用COM/DCOM 协议时,选择“Win32应用程序“

* 使用Web(HTTP/HTML)时,选择“Internet Application“

6。根据改进脚本方法和脚本语言规则来修改脚本。

改进脚本的方法:

1)为每一个GUI的screen添加事务语句来获得事务时间。

2)添加显示数据来帮助调试。

3)添加验证点来验证是否期望的文本或者图片在每个脚本执行后显示。

4)通过插入新参数和动态获得整个文件的方式对硬编码的URL,用户id,用户密码和其他的变量数据进行参数化。这样脚本中的参数就可以被动态的替换,以此来模拟运行时不同数据的使用。

5)添加重试逻辑(retry logic)来处理不可见的错误。

6)添加随机函数发生器变化脚本来模拟真实的负载。

7)添加if/else逻辑来检查结果,或者进行合适的操作,或者在合适的时候退出脚本。 8)在一个screen中添加语句来捕获需要在其他命令中使用的数据。当使用

Microsoft .NET的web form技术的时候,需要避免习惯性的“脚本超时“错误。

9)添加语句来调用外部库函数,以便保存和检索在内存Virtual Table Server中的数据。

10)处理XML.

11)添加语句来模仿客户端的Javascrīpt问题。

12)添加语句来管理超时。

13)从事务计时器中计算和减去无效的时间。

14)输出日志。

15)添加集合点。

16)添加时间(Timing)。

脚本语言规则:把cookie代码标注出来(因为脚本运行的时候他们被再次执行)。

7。通过在VuGen中运行来调试和调整脚本(单个用户),同时运行时设置的日志能够显示如下信息:

辨别和解决脚本编辑错误。

决定timing.

设置初始运行设置的场景。

8。在控制器中使用full test Runtime Settings来运行脚本。

脚本录制和产生:

建立一个新脚本的第一步是选择一个单协议或多协议。

* 一些协议可能在多协议模式下不能用。

* 只有在多协议的GUI下你才能重新排列action

在使用Java协议之前,确保你在环境变量的路径下有JDK,否则你可能会遇到这个错误: Error: Failed to find javac.exe Java Compiler in Path and JDK installation folder in registry. [MsgId: MERR-22981]

Error: Failed to get JRE version. Check that your PATH environment variable contains\bin directory. [MsgId: MERR-22986]

当选择Java协议的时候:

* 只有选择了“RMI Java”才能录制。

* 如果选择“Java user”,“开始录制”图标或菜单是灰色的。

当你打开一个新的脚本时,默认的脚本名称为“noname1”。下一个新的脚本名称为“noname2”,以此类推。

注:有顺序的录制多个动作(而不是录制一个动作,然后停止开始另一个动作)。这样能使你识别出在你脚本中需要关联的序列码(在例如PeopleSoft的程序中)。

注:每次修改脚本后,脚本都需要重新编译。

脚本文件的调用:

VuGen是默认在你双击.usr后缀文件的时候被调用。

在这个文件里,Javascrīpt被指定为“Type=General-Js”。为了避免重新编译,我使用命令行的变量和值得组合这样的批处理文件来调用控制器。例如:

REM LoadRun from LoadRunner 8.0 default installation location:

SET LR80=C:\Program Files\Mercury Interactive\Mercury LoadRunner\bin

cd %LR80%

wlrun.exe -TestRun c:\Temp\Scenario1.lrs-port 8080

脚本文件Action

主机上的代理发送的到服务器的请求是由虚拟用户生成器创建的(VuGen.exe)action的回放实现的。

Loadrunner创建的脚本有三部分:

*vuser_init 来初始化 Vuser。执行在这部分的虚拟用户的状态是"Init"

*Action用来重复多次迭代执行到这部分的虚拟用户的状态是"Running"

*vuser_end 退出虚拟用户。执行到这部分的虚拟用户的状态是"Exiting"

如果你的脚本只需要执行一次,你仍然需要把这些脚本写到Action部分,因为在其他部分(vuser_init 和vuser_end)有些命令是不合法的或者会忽略掉。

VuGen允许脚本包含多个action。所以我为每一个screen创建一个新的action。

注:如果你想使用不同的用户登录,就不要把登录操作放到vuser_init中,而是放到action 部分。

VuGen根据选择脚本协议的不同来添加不用的引用到“.h”头文件。

C的.h头文件

对于Web(HTTP/HTML)协议,

创建globals.h,包含内容:

#ifndef _GLOBALS_H

#define _GLOBALS_H

//--------------------------

// Include Files

#include "lrun.h"

#include "web_api.h"

#include "lrw_custom_body.h"

// recorded for web_custom_request functions.

//--------------------------

// Global Variables

#endif // _GLOBALS_H

对于COM/DCOM协议:略

C脚本语言的格式:

LoadRunner使用的没有进行微软扩展的ANSI C语法。任意最小的action代码块如下:

#include as_web.h // from LoadRunner's include folder.

Action1()

{

/* comment block

*/

// comment line

return 0;

}

C脚本编译/类库

当VuGen编译脚本时,产生一个"pre_cci.ci"文件,这个文件包含了所有action的代码和包含文件。这就是为什么会有语法错误“not writing pre_cci.ci”的原因。

控制器编译这些.ci文件为机器目标码。

VuGen在每一个脚本文件中自动创建一个lib文件夹,这个文件夹中包含了combined_lib.c 文件。该文件包含了所有引用文件。

#include "lrun.h" 来定义 UNIX或者Windows的函数。

#include "globals.h" LoadRunner'的模版文件夹的其中一个。

#include "vuser_init.c"

#include "Action.c"

#include "vuser_end.c"

警告:当你使用类库中的函数却没有正确包含该类库的时候,你会收到一条错误信息:Error -- Unresolved symbol

C类库

LoadRunner 使用1994 GNU C Pre-Processoroptions 和1995 LCC-win32 Retargetable C Compiler/Linkerfrom the Free Software Foundation via Chris Fraser of AT&T and Dave Hanson of Princeton.

附加的函数定义在ANSI C library中。

外部的没有返回整型数的C函数需要在脚本的开头进行显式声明。例如,string函数中的string tokenizer:extern char*strtok(char *token, const char *delimiter);

Java语法:略

OK,先到这里,休息一下,下期接着翻译LR脚本相关知识.

loadrunner学习系列---脚本编写(2)

VUser_Init部分

这里是Vuser_init部分的一些例子:

操作系统的User ID

下面显示了使用advapi32.dll的GetUserNameA函数获得的操作系统的用户ID

char sUserID[1024]; // Maximum possible UserID length.

long lUserIDSize = sizeof(sUserID)-1;

int rc;

rc=lr_load_dll("advapi32.dll");

if( rc != 0 ){

lr_error_message("lr_load_dll of advapi32.dll failed. Aborted for rc=%d",rc);

lr_abort();

}else{

GetUserNameA(sUserID, &lUserIDSize);

lr_message("UserID='%s'", sUserID);

}

所有的变量声明需要一块放到最上方。在vuser_init 部分创建的本地C变量(如 int或char)对其他部分的脚本是不可见的。所以使用lr_save_string函数来创建对所有脚本可用的全局参数。例子:

char *itoa ( int value, char *str, int radix );

vuser_init(){

int x = 10;

char buffer[10];

lr_save_string(itoa( x, buffer, 10) , "pX" );

lr_message ( "int x = %s", lr_eval_string("{pX}" ));

return 0;

}

运行时设置的附加属性(Additional Attribute)

8.0版本引进了一个非常有价值的特性:在运行时设置中指定属性,这个属性可以对不同的虚拟用户组设置不同的值。

下面的代码是从运行时设置的附加属性中读取名为“usertype”的参数。然后使用参数值来对应的设置全局的"thinktime1"变量。

int thinktime1=0;

vuser_init()

{

LPCSTR strUsertype; // Define *str.

strUsertype =lr_get_attrib_string("usertype");

if (strUsertype==NULL){

lr_output_message("### Run-time Settings Additional Attribute usertype not specified. Cannot continue.");

lr_abort();

}else{

lr_message("### Run-time Settings Additional Attribute usertype=\"%s\"", strUsertype );

if( strcmp( strUsertype,"advanced") == 0 ){ thinktime1=2; }

Else

if( strcmp( strUsertype,"intermediate") == 0 ){ thinktime1=4; }

else

if( strcmp( strUsertype,"basic") == 0 ){ thinktime1=8; }

else{

lr_error_message("### ERROR: Value not recognized. Aborting run." );

lr_abort();

}

}

return 0;

}

Time Structure Fix(不知道怎么翻译,呵呵,“时间结构的解决“?)

根据知识库34195的文章,默认当前时间戳的毫秒部分不被更新,除非ftime使用的时间结构被重新定义:

typedef long time_t;

struct _timeb {

time_t time;unsigned short millitm;short timezone;

short dstflag;

};

struct _timeb t;

_tzset(); \\ 使用ftime设置变量

_ftime( &t );

lr_message( "Plus milliseconds: %u", https://www.doczj.com/doc/469121851.html,litm );

控制信息的显示:

在运行时,当脚本的事务失败后继续,你怎么知道哪个用户失败了?

在每个失败的事务之后,发出一个能够唯一确定该用户的信息。

Loadrunner提供了一些函数来在运行时显示信息:

// 往输出日志上发送消息,这个消息前边会带有action 的名称和行数

lr_output_message("an output message");

例子:

Actions.c (4): an output message

// 往输出日志和虚拟用户日志上发消息:

lr_message("*** a message"+"\r"+"A new line.");

把");"放到另一行,这样可以容易的在命令上添加或者删除代码项。

在UNIX/Linux机器上,使用 "\n"来添加一个换行。

在Windows机器上,使用"\r"来添加一个换行。

// 往输出日志上发送不带action名称和行数的信息

lr_log_message("number\t"+ numvar +"\t");

// 只给控制器上的虚拟用户状态区域发送信息(当在VuGen中运行时,只是简单的显示): lr_vuser_status_message("a vuser status message");

// 给LoadRunner控制器或者Tuning模块的控制台输出窗口显示一个红色高亮度显示的

-17999 信息。

lr_error_message("an error message");

使用lr_error_message将会使日志信息堆栈在每个新的action开始时被自动清空。如果选择了"当错误发生时才发送消息"

LoadRunner学习---脚本编写(4)(比较重要)

今天接着来翻译https://www.doczj.com/doc/469121851.html,/中关于LoadRunner脚本编写部分,下面该翻译脚本编写中一些比较重要的部分了。

Web用户Action

在VuGen中,脚本产生的默认模式是基于HTML的--“描述用户的动作的脚本”直接与用户的动作是对应的:

*web_url是浏览器地址栏的URL.

*web_link是点击在之间的文本超链接。

*web_image是点击HTML的

*web_submit_form是在前面操作的上下文中的GET或POST表单上点“提交”--可能前面的操作被VuGen在基于HTML模式下录制下来了。

*web_submit_data是在GET或POST表单上点“提交”,而没有带前面操作的上下文--可能是在基于URL模式下录制,或者是基于HTML模式,并且选择了“A scrīpt containing explicit URLs only”选项。

不用HTML产生的资源是.gif和.jpg图片。资源属性的列表只能当对这些资源的录制选项设置成“Record within the current scrīpt step”时被插入。这也是默认的设置。

如果你在“T ools > Internet Procotol > Recording”中选择“a scrīpt containing explicit URLs only”,这将会产生URL-based的脚本录制,只使用web_url和

web_submit_data函数,将不会使用 web_link 和 web_image函数,或包含在 applets, XML, ActiveX或javascrīpt中的非HTML元素。

在进行下一页录制之前(如点击链接或者图标),暂停录制,把该页屏幕的标题拷贝下来粘贴到注释中。录制完成之后,这将会在后面的给事务命名上用到。

在每一个页面显示之后,暂停录制,把决定是否是期望页的文本拷贝下来,粘贴到注释中。录制完成之后,这将会用到文本验证检查点的脚本编写中。

录制中产生的各种信息都保存在RecordingLog.txt文件中,删除它不会对脚本的回放产生影响。

额外录制的Action脚本

录制脚本的时候,当浏览器没有安装SSL根证书的时候,会捕获的下面这些代码行。这个信息意思是“这个证书不能被信任证书验证”。

web_url("authrootseq.txt",

"URL=https://www.doczj.com/doc/469121851.html,/msdownload/update/v3/static/t

rustedr/en/authrootseq.txt",

"Resource=1",

"RecContentType=text/plain",

"Referer=",

LAST);

web_url("authrootstl.cab",

"URL=https://www.doczj.com/doc/469121851.html,/msdownload/update/v3/static/t

rustedr/en/authrootstl.cab",

"Resource=1",

"RecContentType=application/octet-stream",

"Referer=",

LAST);

录制脚本的时候,但浏览器遇到Macromedia flash组件的时候,会产生下面的代码行:

web_url("version_en_win_ax.xml",

"URL=https://www.doczj.com/doc/469121851.html,/pub/flashplayer/update/curr

ent/xml/version_en_win_ax.xml",

"Resource=0",

"RecContentType=text/html",

"Referer=",

"Snapshot=t8.inf",

"Mode=HTML",

LAST);

如果你安装有Google Toolbar,即使你没有访问Google,也会录制上发到Google的请求。

脚本语言规则:

在LoadRunner中,大小写是敏感的,甚至在被检验的值中。所以上面的脚本会因为大写字母的原因,不会识别“Welcome”的。所以Steve Cheney 建议使用“ic”忽略大小写的文字标志:

web_reg_find("Text/ic=Welcome",LAST);

括号里的参数包含了LAST是为了指定最后的一个参数。这样做是很方便的,因为上面的例子漏掉了一个指定期望是“found”还是“notfound”的属性。默认是“found”,所有我经常忽略它。

另一个文本标志是“/BIN”用来指定是二进制的字符集。例如,查找“Adams”:web_reg_find("Text/BIN=\\x00A\\x00d\\x00a\\x00m\\x00s",LAST);

注意两个反斜杠,一个是转义字符,代表是使用了一个符号。如果错误的只使用一个反斜杠,LR会认为它是一个空的终止。

下面的例子脚本是在UTF8服务器上支持获得newquoteuid为UTF-16编码。因为LoadRunner中,UTF16编码的“Red”用ASCII是 R\x00e\x00d\x00 这样的,所以需要把它保存到buffer中。

lr_eval_string_ext("{newquoteuid_temp}",

strlen("{newquoteuid_temp}") + 2,

&Buf, &BufLen, 0, 0, -1);

对字符数组变量NewBuf使用lr_save_var函数来去掉额外的填充(x00):

for (i=0; i if (Buf[i]!=0) NewBuf[NewBufLen++]=Buf[i];

lr_save_var(NewBuf, NewBufLen-1, 0, "newquoteuid");

注:lr_save_var 需要四个参数(不需要使用LAST)

1.param_value 参数值

2 value_len 参数的长度。

3 options 参数的选项,一般为0

4。param_name 参数名称

LoadRunner 7.8不支持正则表达式,但是有他自己的通配符:

为了使任何[0-9] 的数字在指定的数字位置,使用/DIG做标志:

web_reg_save_param("pSer","LB/DIG=Serial XXX-###-ZZZZ","RB=\r\n", LAST );

有三种使用^做通配符的方法:

* 忽略大小写,并且允许在指定的字符位置使用任意字符:

web_reg_find("Text/ALNUM IC=^ercury", LAST);

* 允许任何小写字符[a-z] 在指定位置:

web_reg_find("Text/ALNUM LC=^ercury", LAST);

* 允许任何大写字符[A-Z]在指定的字符位置:

web_reg_find("Text/ALNUM UC=^ercury", LAST);

把一个字符串变成大写:strupr()

错误信息:

请添加一些其他的错误信息来帮助其他人:

Could not resolve address of host ... [MsgId: MERR-27798]

如果网络不能用或者域没有注册的话,显示一个404的DNS错误

Contents unexpectedly not in cache. [MsgId: MERR-26549]

当一个文件为空时会显示该错误。在空文件中添加空格来满足LoadRunner的错误检查。BTW,因为当创建的iframe没有文件时,IE会产生一个错误,这样就指定了一个空文件。

事务时间脚本编写:

我更喜欢给一个action命名事务,而不是一个结果页面。

lr_start_transaction("00.1 Invoke URL");

...

lr_end_transaction("00.1 Invoke URL",LR_AUTO);

...

lr_start_transaction("01.2 Top menu");

...

lr_end_transaction("01.2 Top menu",LR_AUTO);

lr_start_transaction("02.0 Updating");

lr_start_sub_transaction("02.1 Update menu","02.0 Updating");

web_url( ...

lr_end_sub_transaction("02.1 Update menu",LR_AUTO);

lr_start_sub_transaction("02.2 Update submit","02.0

Updating");

web_submit_form( ...

lr_end_sub_transaction("02.2 Update submit",LR_AUTO);

lr_start_sub_transaction("02.3 Update OK","02.0 Updating");

web_url( ...

lr_end_sub_transaction("02.3 Update OK",LR_AUTO);

lr_end_transaction("02.0 Updating",LR_AUTO);

我喜欢在一个层次结构中使用0填充的事务名称,这样来确保控制器能够正确的给事务排序。

我对不同类型的action上的事务名称上加不同的关键字

?Contact Link= Click "Contact" link on Menu

?Contact Icon= Click "Contact" Icon

?Regis.Sub= Page Submit

OK= Pop-up dismiss with OK

事务名可以是变量,但是它只能被VuGen作为字符串来编译,不能在控制器的接口中显示。无论如何,他们会显示在分析结果文件中。

对于web脚本,LR自动创建和决定事务的的持续时间,但是C语言脚本可以使用这些函数:

使用lr_start_transaction_instance函数来显式获得指定事务实例的句柄,事务名称在函数lr_user_data_point_instance或lr_user_data_point_instance_ex中使用。

使用 lr_start_sub_transaction在一个事务中来操作思考时间和消耗的时间。

好了,脚本编写部分基本已经翻译了一半了,该睡觉了,下面会接着翻译检查点,操作字符串,从流中获得数据,参数化,如何使用文件,关联,集合点等,内容还是很多的。哈哈

LoadRunner脚本编写(5)-- 检查点,关联等函数

本文接着前面脚本编写

4https://www.doczj.com/doc/469121851.html,/?34866/action_viewspace_itemid_70224.html来继续翻译

wilsonmar的文章。其中在翻译过程中,都以zibeike注的方式添加了自己对相关知识点的一些经验和理解。转载请注明作者zibeike和出处,谢谢。

1.错误预防和恢复

参数默认是用{}括起来的,但也可以指定用<>

NTLM或用户登录验证

web_set_user("X\\Y", "Z", "https://www.doczj.com/doc/469121851.html,:80");

在域与X上的用户名为Y的用户,使用密码Z来登录到https://www.doczj.com/doc/469121851.html,:80。在windows基本验证的时候这个脚本被默认录制下来,但如果web服务器需要更安全的NTLM或更深层次的验证,需要手动的添加这个函数到脚本中。对于NTML验证,用户名必须在域名之后,并且以\分割。使用\等符号,需要使用\\,前面的\用来做转义用,否则会出现警告提示。

zibeike注:在论坛中也看到了一些朋友讨论windows弹出登录框的操作LR无法录制到,导致回放出错,一般出错信息多为“Error -26547: Authentication required, please use web_set_user, e.g. web_set_user("domain\\user", "password",

"host:port"); [MsgId: MERR-26547]”,其实这种情况错误信息已经很明显的给你提示了,需要往脚本中添加web_set_user函数即可。

2. IP欺骗(略)

3.验证检查点

通常脚本录制完后需要手动添加些脚本来来确保预期的操作确实进行了正确的响应(如在操作之后后验证显示的一段文本或者图片)。这些检查可以使用正则表达式。

Web虚拟用户脚本中不会录制到检查点,需要手动添加或者使用VuGen的用户接口来添加函数代码。

最常用的检查点函数是web_reg_find。这个注册函数会查找脚本中下一个操作如

web_url后产生的一段文本。它是从返回的缓冲区扫描而不是在接收的页面中查找。这是比web_find更高效的一个函数。

可以使用下面的代码来验证文本出现的次数:

web_reg_find("Text=ABC", "SaveCount=abc_count", LAST);

web_url("Step", "URL=...", LAST);

if (strcmp(lr_eval_string("{abc_count}"), "0") == 0)

lr_output_message("not found");

else

lr_output_message("{abc_count} found");

如果想保存并且显示找到的文本,可以使用web_reg_save_param界定左右边界把找到的信息保存到参数中。如下:

char *str1,*str2;

str1="desired text";

// Register the left and right beacons sought:

web_reg_save_param("param","LB/ic=xxx","RB=xxx");

// Do the monitored deed:

web_url("some url","URL=https://www.doczj.com/doc/469121851.html,",LAST);

// Compare:

str2=lr_eval_string("{param}");

if(strcmp(str1,str2)==0) {

lr_output_message("param found");

}else{

lr_output_message("Value found is %s",str2);

}

zibeike注:1)这里想跟大家说下注册函数,在web/http协议的脚本中,注册函数均以web_reg为前缀,这种注册型的函数都是从缓冲区扫描或者获得数据,因此需要提前声明即需要在能获得该查找信息的函数之前添加这些注册函数。例如,web_url()请求了一个页面,我需要验证该页面中是否有某个特定的文本,那需要在web_url()函数之前加上

web_reg_find,类似的还有关联的函数web_reg_save_para是一样的,需要放到能获得想要

的数据的请求的函数之前。但如果想查看这些函数最终保存的结果,如想打印关联函数web_reg_save_para中保存的参数内容,打印的操作就需要放到请求的函数之后了。

2)web_find和web_reg_find的区别:前面的是查找页面显示的数据,因此需要放在请求页面的函数之后,而且查找的信息是显示的web页面上的信息。后者是注册型函数,需要放到请求的页面之前,而且查找的内容是服务器返回的缓冲数据中查找,所以查找内容应该看html源代码的内容。

基于HTML录制方式的代码,可以使用web_image_check对HTML页面中包含的图片进行验证。并且需要注意的是只有在Runtime Settings > Internet Protocol Preferences选择了"Enable Image and text check"检查点才有效。

下面会讲到数据类型转换,字符串操作等LoadRunner脚本编写知识,今天就到这里了。LoadRunner脚本编写(6)—数据类型转换和字符串操作

一,数据类型转换

没有使用过C编程的LoadRunner脚本编写者会发现在数据类型转化方面比较困难。下面介绍这方面的知识。

1.相似函数的输出在不同的位置

象很多C函数一样,使用atoi函数的结果即为返回值

如intResult = atoi( charY );

而:itoa的返回结果为第二个参数。

itoa( intX, charY, 10);

第一个参数是需要转换的数字,第二个参数是转换后存储的字符数组,需要注意的是数组必须定义为固定的长度,如:char chary[20];

数组的最大长度为32064(32K),否则会出现“too many variables”编译错误。

如果定义为变长的字符串如char *charY,则程序会出错。

第三个参数不是数组的长度,而是数字的基数,10进制是最常用的,其他还有二进制,八进制,十六进制。

2.有一些函数实现了同样的功能

itoa不是一个标准的ANSI C函数但是是C的stdlib.h中的一个函数。所以它不被包括在unix机器上的LibC中。我们可以使用标准的sprintf函数来代替:

sprintf(charY,“%d”,intX);

3.是用%X来转换一个十六进制数

int intNum;

sscanf(“ffff”,“%X”,&Num);

lr_output_message(“%d”,intNum); //打印65535 ,ffff的整数值

4.从文本中提取数字的规则

如果第一个字符不是数字或者为空,atoi返回0,即“e24”会返回0

atoi转换一个非数字的字符会返回组成这个字符的数字,如“-3.2”返回-3.0。“123XXX345”返回123。

5. LoadRunner脚本中的参数必须转换成C字符串。有两种方式来转化LR的参数为C语言的数字。

i = atoi( lr_eval_string("{pX}") );

sprintf( intX, "%d", lr_eval_string("{pX}") );

6.参数的算术运算

LoadRunner没有提供对参数的算术运算的函数。所以LR的参数必须:

1)转换成C的整数

2)使用C的函数来运算最后返回一个C的字符串

3)把返回的字符串保存成参数

char cBuf[10];

int i;

// 1. Evaluate parameter into a C integer:

i = atoi( lr_eval_string("{pNum_in}") );

// 2. Do the math and output the result to a C string:

sprintf( cBuf, "%d", i+1);

// 3. Save the string as a parameter to be passed on:

lr_save_string( cBuf, "pNum_out");

//Print out the parameter value after incrementing it.

lr_message("**** Parameter from %s to %s",

lr_eval_string("{pNum_in}"));

lr_eval_string("{pNum_out}"));

二.字符串操作

在C语言中,字符串是固定长度的,因为他们本身由独立的字符组成的字符数组。数组是只读的。任何修改字符串长度的函数调用都会报错:

Error: "C interpreter runtime error - memory violation error during replay.

在LoadRunner的as_web.h库中的字符串函数可以使用“prototyping”声明的方式读写内存:

char *strtok(char *, char *); // tokenizer prototype

char *strstr(char *, char *); // substring prototype

LoadRunner脚本编写教程

LoadRunner生成脚本的方式有两种,一种是自己编写手动添加或嵌入源代码;一种是通过LoadRunner提供的录制功能,运行程序自动录制生成脚本。这两种方式各有利弊,但首选还是录制生成脚本,因为它简单且智能化,对于测试初学者来说更加容易操作。但是仅靠着自动录制脚本,可能无法满足用户的复杂要求,这就需要手工添加函数,进行必要的手动关联或在函数中进行参数化来配合,增强脚本的实用性。手写添加增强脚本的独特之处在于: 1.可读性好,流程清晰,检查点截取含义明确。业务级的代码读起来总比协议级代码更容易让人理解,也更容易维护,而且必要时可建立一个脚本库。而录制生成的代码大多没有维护的价值,现炒现卖。 2.手写脚本比录制的脚本更能真实地模拟应用运行。因为录制的脚本是截获了网络包,生成的协议级的代码,而略掉了客户端的处理逻辑。 3.手写脚本比录制脚本更能提高测试人员的技术水平。LoadRunner提供了Java user、VB user、C user等语言类型的脚本,允许用户根据不同的测试要求自定义开发各种语言类型的测试脚本。 增强脚本的好坏关系到这个脚本是否能在实际运行环境中更真实地进行模 拟操作。 至于具体使用哪种方式来生成脚本,还应该以脚本模拟程序的真实有效为准。例如,有些程序只需要执行迭代多次操作,没有特殊要求,选择自动生成的脚本就可以了;有些程序需要加入参数化方可满足用户的要求,此时应该使用增强的手工脚本。再就是结合项目进度、开发难易程度等因素综合考虑。 3.1 插入检查点 在进行Web应用的压力测试时,经常会有页面间数据传递的操作,如果做性能测试时传递次数逐渐增多,页面间就会发生传递混乱的情况,或者客户端与服务端数据传输中断或不正确的现象。为了解决这些问题,LoadRunner提供了在脚本中插入检查点的方法,就是检查Web服务器返回的网页是否正确。在每次脚本运行到此检查点时,自动检查该处的网页是否正确,省去执行结束后人工检查的步骤和时间,进而加快了测试进度。 插入检查点的方法,在工作原理上说就是在VuGen中插入“Text/Image”检查点。这些检查点验证网页上是否存在指定的Text或者Image,还可以测试在比较大的压力测试环境中,被测的网站功能是否保持正确。VuGen在进行Web测试时,有“Tree View”和“Script View”两种视图方式。前面我们见到的一直都是“Script View”,但在插入“Text/Image”检查点时,使用“Tree View”(树视图)视图方式会比较方便。这种视图之间切换,可以通过菜单或者工具栏的方式进行,如图3-1所示。

loadrunner学习总结

Loadrunner学习总结 LoadRunner,是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。企业使用LoadRunner能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。 LoadRunner可适用于各种体架构的自动负载测试,能预测系统行为并评估系统性能。操作流程如下: 1.录制脚本: 选择适当的协议,web服务器一般选择http协议。 录制方式一般选择HTML-based Script,但有下列情况选择URL-based Script:不是基于浏览器的应用程序,应用程序中包含javaScript脚本且产生了请求,基于浏览器的应用程序使用了https协议

默认设置记录的浏览器为IE,不要使用其他浏览器 在录制过程中不要后退页面 2.录制结束后点绿色方块按钮结束录制,系统会自动生成录制脚本。

3.录制完之后就是对脚本的回放处理,可以在运行时设置界面设置回放的设置, 如:迭代(重复次数)、步(开始新迭代时候的时间设置)、思考时间(录制时间的停留时间)等,设置好之后就开始回放。 4.回放结束后,回放的情况会显示出来,没有错误表示录制的进程没有问题。 5.负载测试运行

选择录制的脚本添加,然后确认。

可以在场景计划 可以在场景计划这里设置要测试的参数,比如开始用户数,持续时间,停止方式等。 如果想测定某个操作的响应时间,可以在脚本中插入事务,使用事务把该操作包装起来。分析执行结果的时候可以查看到该事务的响应时间。 插入集合点,可以使多个用户并发进行同一操作,提高操作的并发程度,以对服务器增加负载,测试并发能力。 在Run-Time Setting设置中,设置网络带宽以模拟不同带宽的网络;设置block、action的迭代次数。 对脚本进行参数化,设置参数变更方式

LoadRunner 操作技巧(个人经验总结)

Load Runner 相关概念解析 集合点 1)集合点用以同步虚拟用户以便恰好同一时刻执行任务。在没有性能测试工具 之前,要实现用户的并发是很困难的,最常见的方法就是把公司的所有或者部分员工召集起来,有一个同志喊123开始。然后大家一起提交数据。 2)Load Runner的集合点则可以完全实现用户的同步问题,而且可以模拟成千 上万的用户操作是轻而易举的事情。 3)集合点的设置方法 A.在录制过程中可以设置集合点。 B.在使用Load Runner的Controller进行负载时,可以通过依次选择【Scenario】>【Rendezvous…】项实现。 C.可以选择某个虚拟用户后单击enable rendezvous或disable rendezvous. 可以设置许启用或者禁止某个集合点. D.可以设置集合点策略,在Rendezvous information,点击Policy按钮。这个很重要。有三种情形。 E.在集合点设计策略窗体中也可以设计集合点释放比例。还可以设置Timeout between Vusers虚拟用户之间的超时间隔。一般默认是30秒。 可以根据实际情况进行设置。 事务 事务是要度量其服务器响应时间的任务或操作集。一个完整的事务由事务开始、事务结束以及一个或多个业务操作/任务构成。 重点提示 事务必须是成对出现,即一个事务有事务开始,必然要求有事务结束。 不要将Lr_think_time放在事务里,影响分析和统计,除非有特殊的情况需要这么做。 检查点 检查点的作用是在回放脚本期间搜索特定的文本字符串或者图片等内容,从而验证服务器响应内容的正确性。 添加检查点方法: 切换到脚本数视图,然后在左侧切换到“Server response”页,然后添加一个文本Add a Text check。也可以检查图片。P14 重点提示 检查点设置完成后,要保证检查点能使用,需要在Run Time settings –Preferences >Enable Image and Text check 复选框选上,否则的话检查点失效。

LoadRunner性能测试实战教程

LoadRunner性能测试实战讲解 内容介绍: 很多使用LoadRunner的测试人员经常面临两个难题:脚本开发与性能测试分析。本书就是基于帮助测试人员解决这两个问题而编写,致力于使读者学精LoadRunnner这一强大的性能测试工具。 全书共分为四部分:入门篇、基础篇、探索篇、实战篇。第一篇入门篇的内容包括第1章和第2章,着重于讲解性能测试与LoadRunner的基础理论知识。第二篇基础篇的内容包括第3章至第5章,是LoadRunner 的基本使用部分,着重讲解Virtual User Generator、Controller、Analysis的使用方法。第三篇探索篇的... 第1部分入门篇.. (1) 第1章性能测试基础知识.. 3 1.1 性能测试基本概念 (4) 1.1.1 什么是性能测试 (4) 1.1.2 性能测试应用领域 (6) 1.1.3 性能测试常见术语 (8) 1.2 全面性能测试模型 (11) 1.2.1 性能测试策略模型 (14) 1.2.2 性能测试用例模型 (17) 1.2.3 模型的使用方法 (20) 1.3 性能测试调整基础 (21) 1.4 如何做好性能测试 (24) 1.5 本章小结 (28) 第2章LoadRunner基础知识.. 29 2.1 LoadRunner简介 (29) 2.1.1 LoadRunner主要特点 (29) 2.1.2 LoadRunner常用术语 (31) 2.2 LoadRunner工作原理 (32) 2.3 LoadRunner测试流程 (33) 2.4 LoadRunner的部署与安装 (35) 2.5 本章小结 (41) 第2部分基础篇 (43) 第3章脚本的录制与开发.. 45 3.1 Virtual User Generator简介 (45)

LoadRunner常见问题分析及解决办法

LoadRunner常见问题分析及解决办法 2010-09-23 08:02 在运行脚本回放过程中,有时会出现错误,这在实际测试中是不可避免的,毕竟自动录制生成的脚本难免会有问题,需要运行脚本进行验证,把问题都解决后才加入到场景中进行负载测试。下面结合常用的协议(如Web、Web Services协议)录制的脚本进行回放时出现的问题介绍一下解决的方法。 需要注意的是,回放脚本时出现的错误有时是程序自身的原因导致的,因此在解决脚本回放问题前必须保证程序录制出的脚本是正确的。 1.LoadRunner超时错误:在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同。 错误现象1:Action.c(16): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s)。 错误分析:对于HTTP协议,默认的超时时间是120秒(可以在LoadRunner 中修改),客户端发送一个请求到服务器端,如果超过120秒服务器端还没有返回结果,则出现超时错误。 解决办法:首先在运行环境中对超时进行设置,默认的超时时间可以设置长一些,再设置多次迭代运行,如果还有超时现象,需要在“Runtime Setting”>“Internet Protocol:Preferences”>“Advanced”区域中设置一个“winlnet replay instead of sockets”选项,再回放是否成功。 错误现象 2:Action.c(81):Continuing after Error -27498: Timed out while processing URL=http://172.18.20.70:7001/workflow/bjtel/leasedline/ querystat/ subOrderQuery.do 错误分析:这种错误常常是因为并发压力过大,服务器端太繁忙,无法及时响应客户端的请求而造成的,所以这个错误是正常现象,是压力过大造成的。 如果压力很小就出现这个问题,可能是脚本某个地方有错误,要仔细查看脚本,提示的错误信息会定位某个具体问题发生的位置。 解决办法:例如上面的错误现象问题定位在某个URL上,需要再次运行一下场景,同时在其他机器上访问此URL。如果不能访问或时间过长,可能是服务器或者此应用不能支撑如此之大的负载。分析一下服务器,最好对其性能进行优化。 如果再次运行场景后还有超时现象,就要在各种图形中分析一下原因,例如可以查看是否服务器、DNS、网络等方面存在问题。 最后,增加一下运行时的超时设置,在“Run-Time Settings”>“Internet Protocol:Preferences”中,单击“options”,增加“HTTP-request connect

loadrunner常见问题及解决方法

loadrunner常见问题 1..关于loadrunner11录制脚本时IE打不开问 1、ie浏览器去掉启用第三方浏览器扩展 2、loadrunner11 键盘F4,在browser Emulation点击change,在弹出的提示框中Browser version 选择8.0,platform. 选择windows7 3、loadrunner11 键盘ctrl+F7在弹出的提示框中选择最后一项Correlation,将Enable correlation during recording 下面的勾全去掉,有需要的再勾 4、退出杀毒软件(金山啊360啊什么的都退了) 5、退出迅雷软件 6、计算机——属性——高级系统设置——性能里的设置——数据执行保护——选择“为除下列选定程序之外的所有程序和服务启用”——添加IE浏览器——应用——确定 1.2.controlle打开失败: controller一添加完脚本就崩溃了,报错:试读执行系统不支持的操作;Runtime error!c:\Program Files\hp\LoadRunner\bin\Wlrun.exe abnormal program termination。 解决方案:1.E:\Program Files (x86)\HP\LoadRunner\bin文件下将wlrun.exe文件删除,2.进入“我的电脑”下---控制面板\卸载或更改程序中---右击HP Loadrunner修复。 1.3.设置并发数: User generator tools—create controller scenario—number of vusers 1.4.Loadrunner11安装: 1. 安装完成后,退出loadrunner 2. 把下载的lm70.dll,mlr5lprg.dll 拷贝到../HP/Loadrunner/bin覆盖掉原来的 3. 使用注册表删除工具,点击deletelicense.exe 删除注册表信息 4. 再次打开loadrunner, configuration->loadrunner license->new license,在弹出的输入框中输入license序列号

精通软件性能测试与loadrunner实战

最新版LoadRunner性能测试实战 内容介绍: 很多使用LoadRunner的测试人员经常面临两个难题:脚本开发与性能测试分析。本书就是基于帮助测试人员解决这两个问题而编写,致力于使读者学精LoadRunnner这一强大的性能测试工具。 全书共分为四部分:入门篇、基础篇、探索篇、实战篇。第一篇入门篇的内容包括第1章和第2章,着重于讲解性能测试与LoadRunner的基础理论知识。第二篇基础篇的内容包括第3章至第5章,是LoadRunner 的基本使用部分,着重讲解Virtual User Generator、Controller、Analysis的使用方法。第三篇探索篇的... 第1部分入门篇.. (1) 第1章性能测试基础知识.. 3 1.1 性能测试基本概念 (4) 1.1.1 什么是性能测试 (4) 1.1.2 性能测试应用领域 (6) 1.1.3 性能测试常见术语 (8) 1.2 全面性能测试模型 (11) 1.2.1 性能测试策略模型 (14) 1.2.2 性能测试用例模型 (17) 1.2.3 模型的使用方法 (20) 1.3 性能测试调整基础 (21) 1.4 如何做好性能测试 (24) 1.5 本章小结 (28) 第2章LoadRunner基础知识.. 29 2.1 LoadRunner简介 (29) 2.1.1 LoadRunner主要特点 (29) 2.1.2 LoadRunner常用术语 (31) 2.2 LoadRunner工作原理 (32) 2.3 LoadRunner测试流程 (33) 2.4 LoadRunner的部署与安装 (35) 2.5 本章小结 (41) 第2部分基础篇 (43) 第3章脚本的录制与开发.. 45

LoadRunner设置检查点的几种方法介绍

LoadRunner设置检查点的几种方法介绍 前段时间在群里跟大家讨论一个关于性能测试的问题,谈到如何评估测试结果,有一个朋友谈到规范问题,让我颇有感触,他说他们公司每次执行压力测试的时候,都要求脚本中必须有检查点存在,不然测试结果将不被认可,这是他们公司的规范。其实,在做压力测试过程,我们很容易忽略很多东西,而且随着自身的技术演变,我们很容易去丢失掉一些很好的习惯,当我们再碰到这些问题的时候,我们才发现其实是我们太粗心大意了,所以说好的习惯要保持。这次我刚好也要接手一些性能工作,因此就如何规范设置检查点来谈谈一些基本的流程和方法。 使用LoadRunner做压力测试,大致如下几个流程: 1、明确测试目标 2、录制测试脚本 3、脚本优化、调试 4、场景运行 5、分析测试结果 当然这里都是概况性的标题,但从这里我们可以明确的是测试脚本是整个压力测试过程中的重点步骤,如果测试脚本都不能确保正确与否,后面的测试过程就无从说起了。很多时候我们把脚本调试就简单的认为是脚本回放没有错误就认为脚本是没有问题的,这当然不能这么肯定,脚本调试是一个非常严谨的过程,我大致归纳如下几步: 1、明确每一行脚本的作用,也就是说每一行脚本执行的功能是什么; 2、删减不需要的脚本语句,比如在录制过程由于LR默认设置导致录制之后出现很多冗余的脚本,这些个脚本对我们的测试过程没有用途的应该删除掉,至于哪些是冗余就要具体分析了,所以说脚本录制完之后要分析脚本运行的过程,方能理解脚本执行的用途,不然在后面施压时运行错误,就会开始到处找问题,而又找不出问题; 3、查找存在的关联并进行相关设置 4、设置检查点,设置检查点的目的就是为了验证页面每次运行之后是否正确,设置检查点的过程总要通过不能的回放来进行验证检查点设置是否正确。 5、通过测试目标明确脚本执行的目标事务,并添加事务; 6、对需要进行并打操作的功能设置集合点 7、根据实际情况设置ThinkTime 8、在以上所有脚本调试步骤完成之后,设置迭代次数,通过在V user中设置多次迭代来验证脚本在多次循环运行时是否存在错误 注意:在V user中运行和回放脚本的过程,要密切关注replay log,也就是回放日志,很多问题通常都暴露在回放日志中,只不过我们没有认真去检查,所以没发觉。因为大多数情况是我们在回放脚本之后只观察回放日志中有没有红色的错误提示信息,如果没有我们就认为我们的脚本是ok的,其实不然,很多时候一些隐藏的错误就在回放日志中可以被

Loadrunner脚本的录制与调试

Loadrunner脚本的录制 与调试

目录 Loadrunner简介 (3) 脚本的录制 (3) 选择协议 (3) 脚本结构 (4) 查看日志 (6) 脚本的回放 (7) 脚本中的关联 (8) 录制前关联(Correlation) (8) 录制后关联 (10) 手动关联 (11) 脚本中的参数化(Parameters) (13) 参数的创建 (14) 定义参数的属性 (19)

Loadrunner简介 LoadRunner是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题。 LoadRunner是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。LoadRunner的测试对象是整个系统,它通过模拟实际用户的操作行为和实行实时性能监测,来更快的查找和发现问题。此外,LoadRunner能支持广泛的协议和技术,为特殊环境提供特殊的解决方案。 使用LoadRunner的Virtual User Generator,能很简便地创立起系统负载。该引擎能够生成虚拟用户,以虚拟用户的方式模拟真实用户的业务操作行为。它先记录下业务流程,然后将其转化为测试脚本。 下面就来介绍一下LoadRunner是如何录制脚本的。 脚本的录制 VU通过录制用户在客户端软件的操作来直接生成脚本,用户的每个协议级的操作以LoadRunner的API函数方式记录在脚本里。回放脚本的时候,通过执行API函数来模拟最初用户的操作动作。 选择协议 根据客户端和服务器间的会话所使用的网络协议来选择使用何种协议录制脚本。当创建一个新的Vuser的时候,就会弹出协议选择对话框,如下图所示。

loadrunner性能脚本的常用设置

一、关于脚本 1.当脚本代码很长时,为了显示更清晰,可以在脚本中点击右键如下图,选择Expand All/Collapse All。脚本函数就会以“-”展开或“+”折叠。 2.快速定位日志: 在脚本中选择函数—>右键,选择Go to Step in Replay Log,就能在Replay Log中找到相应函数输出的日志。

3.快速定位代码行: 在脚本中点击右键,选择Go to Line,在弹出框中输入数字,即能定位到指定的代码行。 4.快速打开脚本文件所在位置: 在脚本中点击右键,选择Open Script Directory,即能打开脚本文件所在的文件夹。

5.插入断点: 在光标停留的代码行处,按下"F9",或通过下图操作。 6.单步调试:按下"F9",或通过下图操作。

二、通用页设置 通用页设置位置:VuGen—>Tools—>General Option 1.运行脚本时,函数间等待的时间间隔(单位毫秒)设置:操作如下图。 主要实现脚本减速运行。 2.修改脚本字体设置:操作见下图。 由于LR是英文版的,当有些字符显示有问题时(如“/”会显示成“¥”),可考虑设置该选项。

3.选择脚本比较工具设置:操作见下图。 如果不选,默认使用的是WinDiff工具。 4.回放时浏览器与脚本同步显示设置:操作如下图。

三、运行时设置 运行时设置位置:VuGen—>Vuser—>Run-time Settings,或打开脚本后直接按“F4” 1.脚本迭代次数设置:操作见下图。 每个脚本部分都可插入Actions、Block,但只有Run部分的属性可以修改运行的方式,主要用于控制Action间运行的顺序。

LoadRunner压力测试

LoadRunner压力测试

一、环境准备 优化操作系统(centOS) 1、执行命令 sudo modprobe -r xt_NOTRACK nf_conntrack_netbios_ns nf_conntrack_ipv4 xt_state sudo modprobe -r nf_conntrack 2、使用文本编辑器打开 /etc/sysctl.conf 修改net.ipv4.tcp_max_tw_buckets的值 net.ipv4.tcp_max_tw_buckets= 16000 修改nginx配置 (只在压力测试使用,测试完毕后恢复) 1、找到以下条目,修改值 proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; 2、修改 upstream 中的值 server 192.168.0.254:8003 max_fails=15 fail_timeout=160s weight=1 srun_id=03; jvm_route $cookie_JSESSIONID reverse; 修改 LEAP.xml (只在压力测试使用,测试完毕后恢复) 在RPCServices 节点中添加disablesid="true" 例: 修改项目登录页面 去除登录页面的图片验证码

二、Loadrunner安装之前 安装要求 1、Loadrunner(主控机和压力机)必须安装在windows2003 server 版本下 2、必须安装IE浏览器,建议为IE6版本,其他版本在脚本录制过程中会出现打不开IE的情况 安装虚拟光驱

脚本录制及优化 loadrunner

添加文本检查点-搜索 web_reg_find("Fail=NotFound", "Search=Body", "SaveCount=CHECK", "Text=Don't forget to sign off when\n" "you're done", LAST); 文本检查判定语句 if (atoi(lr_eval_string("{para_count}"))>0) //验证是否找到了页面上的要检查的字符串lr_output_message("we find the string!"); else lr_output_message("sorry,don't find the string!"); 用户名的日志输出: Lr_log_message(“用户名:%s”,lr_eval_string(“{username}”)); 脚本校验——检查点 数据分析: SD 标准偏差值 Transaction 场景 Init 初始化 Scale 比例 Additional 额外的 Granularity 间隔尺寸 Filters 筛选 throughout 吞吐量 Transaction summary 事务摘要

性能测试 递增 1、创建场景 分析: 问:事务相应时间先缓慢上升再平衡再下降说明什么? 答:缓慢上升说明事务响应时间变长说明系统处理能力在下降 再平衡并发用户数已经饱和 再下降并发用户数下降了 如果系统没有此类机制则响应时间不断上升直至宕机 Java 创建对象的时候不释放内存创建太多会导致该问题 问:业务失败情况但是其他的都正常 答:数据库可能被锁住,数据库有互斥性,需要修改数据库 系统要求 1、支持同时多少个并发登录? 2、登录响应时间不超过3秒 3、CPU使用率不应超过80% 4、内存使用率不应超过75% 关键指标分析: Transactions per Second 针对场景运行过程中的每个时间点取样一次,显示在这个时间点上的每个事务的通过、失败、停止的个数 我还在 Analysis 里面找了一下,发现图表的时间显示粒度也是可以设置的。具体方法为:在 图表上点击右键 -> 选择“ Set Granularity ”或者直接按Ctrl+G 。我试着把时间粒度调成以毫秒为单位,结果LoadRunner 提示当前不支持以毫秒为显示粒度,由此我推断LoadRunner 对于 Transactions perSecond 这张图,最小的取样粒度为1 秒

LoadRunner回放脚本失败

在运行脚本回放过程中,有时会出现错误,这在实际测试中是不可避免的,毕竟自动录制生成的脚本难免会有问题,需要运行脚本进行验证,把问题都解决后才加入到场景中进行负载测试。下面结合常用的协议(如Web、Web Services协议)录制的脚本进行回放时出现的问题介绍一下解决的方法。 需要注意的是,回放脚本时出现的错误有时是程序自身的原因导致的,因此在解决脚本回放问题前必须保证程序录制出的脚本是正确的。 1.LoadRunner超时错误:在录制Web协议脚本回放时超时情况经常出现,产生错误的原因也有很多,解决的方法也不同。 错误现象1:Action.c(16): Error -27728: Step download timeout (120 seconds) has expired when downloading non-resource(s)。 错误分析:对于HTTP协议,默认的超时时间是120秒(可以在LoadRunner中修改),客户端发送一个请求到服务器端,如果超过120秒服务器端还没有返回结果,则出现超时错误。 解决办法:首先在运行环境中对超时进行设置,默认的超时时间可以设置长一些,再设置多次迭代运行,如果还有超时现象,需要在“Runtime Setting”>“Internet Protocol:Preferences”>“Advanced”区域中设置一个“winlnet replay instead of sockets”选项,再回放是否成功。 错误现象2:Action.c(81):Continuing after Error -27498: Timed out while processing URL=http://172.18.20.70:7001/workflow/bjtel/leasedline/ querystat/ subOrderQuery.do 错误分析:这种错误常常是因为并发压力过大,服务器端太繁忙,无法及时响应客户端的请求而造成的,所以这个错误是正常现象,是压力过大造成的。 如果压力很小就出现这个问题,可能是脚本某个地方有错误,要仔细查看脚本,提示的错误信息会定位某个具体问题发生的位置。 解决办法:例如上面的错误现象问题定位在某个URL上,需要再次运行一下场景,同时在其他机器上访问此URL。如果不能访问或时间过长,可能是服务器或者此应用不能支撑如此之大的负载。分析一下服务器,最好对其性能进行优化。 如果再次运行场景后还有超时现象,就要在各种图形中分析一下原因,例如可以查看是否服务器、DNS、网络等方面存在问题。 最后,增加一下运行时的超时设置,在“Run-Time Settings”>“Internet Protocol:Preferences”中,单击“options”,增加“HTTP-request connect timeout” 或者“HTTP-request receive”的值。

使用LoadRunner进行压力测试

实验二. 使用LoadRunner进行压力测试一.LoadRunner 概要介绍 1.1简介 LoadRunner 是一种预测系统行为和性能的工业标准级负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。目前企业的网络应用环境都必须支持大量用户,网络体系架构中含各类应用环境且由不同供应商提供软件和硬件产品。难以预知的用户负载和愈来愈复杂的应用环境使公司时时担心会发生用户响应速度过慢,系统崩溃等问题。这些都不可避免地导致公司收益的损失。Mercury Interactive 的LoadRunner 能让企业保护自己的收入来源,无需购置额外硬件而最大限度地利用现有的IT 资源,并确保终端用户在应用系统的各个环节中对其测试应用的质量,可靠性和可扩展性都有良好的评价。LoadRunner 是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。LoadRunner 的测试对象是整个企业的系统,它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快的查找和发现问题。此外,LoadRunner 能支持广范的协议和技术,为您的特殊环境提供特殊的解决方案。 1.2基本步骤 使用LoadRunner 完成测试一般分为四个步骤: 1)Vvitrual User Generator 创建脚本 ?创建脚本,选择协议 ?录制脚本 ?编辑脚本 ?检查修改脚本是否有误

2)中央控制器(Controller)来调度虚拟用户 ?创建Scenario,选择脚本 ?设置机器虚拟用户数 ?设置Schedule ?如果模拟多机测试,设置Ip Spoofer 3)运行脚本 ?分析scenario 4)分析测试结果 二.项目背景介绍 2.1 背景概述 “LMS网校考试平台”是一个典型的三层B/S架构的MIS系统(客户端/应用服务器/数据库管),中间层是业务逻辑层,应用服务器处理所有的业务逻辑,但应用服务器本身不提供负载均衡的能力,而是利用开发工具提供的ORB(对象请求代理)软件保证多个应用服务器间的负载均衡。本次测试的目的是:进行应用服务器的压力测试,找出应用服务器能够支持的最大客户端数。方法是:按照正常业务压力估算值的1~10倍进行测试,考察应用服务器的运行情况。 2.2压力测试用例 场景描述一: 1.用户登录的lmm模块,总共登陆24个用户,所有用户都同时并发操作。 2.用户点击“登记的教程” 3.用户点击“启动”,进行课程学习,进入DS模块 4.在DS模块中进行学习,过程包括:首先,点击一次课程结构树;然后,进行课程内容的学习。 5.点击“返回LMS”按钮,返回到lmm模块,点击“退出”按钮,退出系统 场景描述二:

LoadRunner 性能测试脚本

LoadRunner 性能测试脚本 1 概述 Yoyo老师认为脚本录制编写是性能测试的一个重要环节。在性能测试过程中,虚拟用户模拟真实用户使用被测系统, 这个“模拟”的过程正是通过性能测试脚本来实现的。因此,编写一个准确无误的脚本对性能测试有至关重要的意义。完成性能测试脚本包括两个步骤:脚本录制和脚本编写,本文重点关注脚本编写。 2 脚本录制 2.1.录制方式 HTTP协议脚本录制可选两种方式:基于HTML和基于URL。选择哪种录制方式的原则如下:基于浏览器的HTTP应用系统选择HTML,基于其他方式的HTTP应用系统选择URL。 2.2.录制注意点 取消录制期间自动关联功能; 如果部分测试脚本出现问题,需要重新录制,可以只录制存在问题的片断脚本,方法是不选中录制启动对话框中的Record the application startup。 3 脚本编写 3.1.常用技术 LoadRunner性能测试脚本编写常用的技术包括参数化,关联,逻辑控制和脚本模块化。 3.1.1.参数化 参数化就是将脚本中的常量转化为变量的过程。通过录制生成的脚本所有的数据都是常量,为了达到向服务器发送的数据多样化的目的,需要将一些数据常量转化为变量。 3.1.2.关联

关联就是查找动态数据,并把查询到的数据以参数的形式保存起来。在B/S 或者C/S系统中,服务器返回给客户端的数据有些是动态改变的,例如客服系统的人工来话流水号和工作流系统的工单流水号。当打开工单生成页面后,工单流水号已经从服务器端获取到了,而在提交工单步骤,需要将该流水号返回给服务器。因此,在提交工单之前,在脚本中必须获得流水号。获得流水号的方法就是关联。 使用关联功能动态保存的参数跟直接通过参数化生成的参数是一致的。唯一不同的是,通过参数化生成的参数在脚本中可以高亮显示。 3.1.3.逻辑控制 业务系统在实际应用中,业务操作步骤间往往存在逻辑。比如,客服3.0工作流系统,业务代表处理工单,如果待办区没有工单等待处理,则先从工单池中提取工单到待办区,然后进行处理,并且需要优先处理超时或即将超时的工单。在工单处理的性能测试脚本中,也必须遵从这种业务逻辑。 LoadRunner性能测试脚本采用C语言,因此脚本逻辑控制同C语言一致,使用if,switch,while/for/do控制结构。 3.1. 4.脚本模块化 脚本模块化的目的是:提高脚本可读性、可重用性和脚本生产效率。脚本模块化的本质是抽取函数,一些很通用的函数甚至可以封装为DLL。模块化性能测试脚本的思想跟自动化测试的ActionWord有相似之处。 例如:客服3.0系统的登录功能,无论是工作流、知识库、公告便签还是培训考试,它们都使用相同的登录页面。我们可以把登录脚本抽取为一个函数csp_login(char *staffno,char * password),需要登录操作时,不需要录制和拷贝脚本,只要调用这个函数就可以了。 注意:并不是所有的脚本代码块都需要做模块化处理,只有那些稳定不变、并且经常用到的代码块才需要做模块化处理。不做得不偿失的事。 3.2.典型函数 LoadRunner中,常用的函数有很多,这里只介绍编写性能测试脚本过程中那些必然用到的函数。本文重点关注这些典型函数的应用场合及注意点,至于函数详细使用说明请参见LoadRunner帮助文档。 3.2.1.事务相关 3.2.1.1. lr_start_transaction/lr_end_transaction

Loadrunner使用教程

LoadRunner使用教程 1. 了解LoadRunner 1.1 Loadrunner简介 LoadRunner 是一种预测系统行为和性能的工业标准级负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。目前企业的网络应用环境都必须支持大量用户,网络体系架构中含各类应用环境且由不同供应商提供软件和硬件产品。难以预知的用户负载和愈来愈复杂的应用环境使公司时时担心会发生用户响应速度过慢、系统崩溃等问题。这些都不可避免地导致公司收益的损失。Mercury Interactive 的LoadRunner 能让企业保护自己的收入来源,无需购置额外硬件而最大限度地利用现有的IT 资源,并确保终端用户在应用系统的各个环节中对其测试应用的质量,可靠性和可扩展性都有良好的评价。LoadRunner 是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。LoadRunner 的测试对象是整个企业的系统,它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快的查找和发现问题。此外,LoadRunner 能支持广范的协议和技术,为您的特殊环境提供特殊的解决方案。 1.2 为什么应进行自动性能测试? 自动性能测试是一项规范,它利用有关产品、人员和过程的信息来减少应用程 序、升级程序或修补程序部署中的风险。自动性能测试的核心原理是通过将生产 时的工作量应用于预部署系统来衡量系统性能和最终用户体验。构造严密的性能 测试可回答如下问题: ?应用程序是否能够很快地响应用户的要求? ?应用程序是否能处理预期的用户负载并具有盈余能力? ?应用程序是否能处理业务所需的事务数量?

LoadRunner脚本录制方法

LoadRunner脚本录制方法 这篇文章性能测试工具LR进行简单介绍,LR的安装和如何录制简单的脚本并对录制好的脚本进行加压等内容,主要目的是让大家对LR有一个基本的了解,同时也掌握录制一个简单脚本的方法。 在学习过程中的问题可以在此帖中发帖询问,心得也可在此帖中跟帖进行交流,共同进步。如果有更好的资料希望可以贴到帖子中,共同分享。 Loadrunner的简介 LoadRunner? 是一种预测系统行为和性能的工业标准级负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。目前企业的网络应用环境都必须支持大量用户,网络体系架构中含各类应用环境且由不同供应商提供软件和硬件产品。难以预知的用户负载和愈来愈复杂的应用环境使公司时时担心会发生用户响应速度过慢,系统崩溃等问题。这些都不可避免地导致公司收益的损失。Mercury Interactive 的 LoadRunner 能让企业保护自己的收入来源,无需购置额外硬件而最大限度地利用现有的IT 资源,并确保终端用户在应用系统的各个环节中对其测试应用的质量,可靠性和可扩展性都有良好的评价。 LoadRunner 是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。LoadRunner 的测试对象是整个企业的系统,它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快的查找和发现问题。此外,LoadRunner 能支持广范的协议和技术,为您的特殊环境提供特殊的解决方案。 1.1 轻松创建虚拟用户 使用LoadRunner 的Virtual User Generator,您能很简便地创立起系统负载。该引擎能够生成虚拟用户,以虚拟用户的方式模拟真实用户的业务操作行为。它先记录下业务流程(如下订单或机票预定),然后将其转化为测试脚本。利用虚拟用户,您可以在Windows ,UNIX或Linux 机器上同时产生成千上万个用户访问。所以LoadRunner 能极大的减少负载测试所需的硬件和人力资源。另外,LoadRunner 的TurboLoad 专利技术能提供很高的适应性。TurboLoad 使您可以产生每天几十万名在线用户和数以百万计的点击数的负载。用Virtual User Generator 建立测试脚本后,您可以对其进行参数化操作,这一操作能让您利用几套不同的实际发生数据来测试您的应用程序,从而反映出本系统的负载能力。以一个订单输入过程为例,参数化操作可将记录中的固定数据,如订单号和客户名称,由可变值来代替。在这些变量内随意输入可能的订单号和客户名,来匹配多个实际用户的操作行为。LoadRunner 通过它的Data Wizard 来自动实现其测试数据的参数化。Data Wizard 直接连于数据库服务器,从中您可以获取所需的数据(如定单号和用户名)并直接将其输入到测试脚本。这样避免了人工处理数据的需要,Data Wizard 为您节省了大量的时间。为了进一步确定您的Virtual user 能够模拟真实用户,您可利用LoadRunner 控制某些行为特性。例如,只需要

LoadRunner11实例性能测试

LoadRunner11实例性能测试 1.LoadRunner8.1基础2 1.1术语2 1.2组件与测试流程2 2.生成脚本4 2.1应用程序要求4 2.1录制脚本5 2.2运行脚本7 2.3脚本优化8 2.3.1关联8 2.3.2参数化10 3.运行负载测试12 3.1生成负载12 3.2运行负载测试13 3.3运行视图概述14 4.分析结果16 4.1 Analysis 窗口概述16 4.2分析窗口数据17 4.2.1查看事务平均响应时间18 4.2.2 研究Vuser的行为19 5.一些体会23 1.LoadRunner11基础 1.1术语 ?场景:场景是一种文件,用于根据性能要求定义在每一个测试会话运行期间发生的事件。 ?Vuser:在场景中,LoadRunner 用虚拟用户或Vuser 代替实际用户。Vuser 模拟实际用户的操作来使用应用程序。一个场景可以包含几

十、几百甚至几千个 Vuser。 ?Vuser脚本:Vuser 脚本用于描述 Vuser 在场景中执行的操作。 ?事务:要度量服务器的性能,需要定义事务。事务表示要度量的最终用户业务流程。 1.2组件与测试流程 LoadRunner 包含下列组件: ?虚拟用户生成器:用于捕获最终用户业务流程和创建自动性能测试脚本<也称为虚拟用户脚本)。 ?Controller:用于组织、驱动、管理和监控负载测试。 ?负载生成器:用于通过运行虚拟用户生成负载。 ?Analysis:有助于查看、分析和比较性能结果。 ?Launcher:为访问所有 LoadRunner 组件的统一界面。 负载测试通常由五个阶段组成:计划、脚本创建、场景定义、场景执行和结果分析。 ?计划负载测试:定义性能测试要求,例如并发用户的数量、典型业务流程和所需响应时间。 ?创建 Vuser 脚本:将最终用户活动捕获到自动脚本中。 ?定义场景:使用LoadRunner Controller 设置负载测试环境。 ?运行场景:通过LoadRunner Controller 驱动、管理和监控负载测试。 ?分析结果:使用LoadRunner Analysis 创建图和报告并评估性能。

相关主题
文本预览
相关文档 最新文档