51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2318|回复: 2
打印 上一主题 下一主题

Loadrunner脚本编程

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-5-11 16:40:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 VuGen脚本基本信息
1.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-2
2981]
   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的程序中)。

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

Java:略

脚本文件的调用:
    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


1.2  函数介绍
一:通用函数
LoadRunner的通用函数以lr为前缀,可以在任何协议中使用。可以如下分类:

信息相关的函数:
lr_error_message lr_output_message

事务函数:

lr_start_transaction   lr_end_transaction
运行时函数:

lr_think_time        lr_exit
参数相关的函数:
lr_save_datetime lr_advance_param lr_eval_string lr_save_string lr_get_attrib_string
一些函数的详细解释:
1.lr_error_message
往VuGen的回放日志和Controller的输出窗口发送错误信息,例子:

lr_error_message("string");

2.lr_abort()
中止脚本的执行。如果在Action中使用,就会中止Action的执行,而去执行vuser_end.

3.lr_exit
退出脚本,action或者迭代。
lr_exit(intcontinuation_option, intexit_status);

4.lr_save_string

保存指定的非空字符串到一个参数。
lr_save_string(const char *param_value, const char *param_name);
5.lr_save_date_time
保存日期和时间到参数中。

lr_save_datetime(const char *format,intoffset,const char *name);
在lr_save_datetime中使用偏移量

lr_save_datetime(“Tomorrow is %B %d %Y", DATE_NOW+ONE_DAY, “nextDate");

DATE_NOW+ONE_DAY:当前日期的偏移量

如果现在的时间是:2008年二月27
nextDate中保存的时间为:Tomorrow is二月28 2008

6.lr_advance_param
lr_advance_param (const char *param);
其中参数用双引号,但不用括号。
7.lr_eval_string

lr_eval_string("{parameter_name}");
返回指定参数的当前字符串值。

检索参数值,可以使用来下面的函数打印该输出到输出信息中。
lr_output_message或者lr_error_message

8.lr_get_attrib_string

lr_get_attrib_string (const char *argument);

二.特定协议的函数
这类函数跟录制的协议类型有关系。

Web协议:以web为前缀

lrd是数据库相关的函数,lrs是window socket协议的函数。

web_reg_save_param(const char *ParamName,LB,RB,ORD,SaveLen,SaveOffset, LAST);
例子:
web_reg_save_param("flight_name", "LB=Select your departure ", "RB="", LAST);
web_reg_find:
web_reg_find(“Text=Welcome”, SaveCount, LAST);


1.3  关联函数的通用学习
Loadrunner脚本中进行关联的时候,用到了一些函数,作用是把字符串保存到参数中,并且在需要的时候检索出来.
C Vusers中用到的函数有:
lr_eval_string  所有出现参数的地方用它的当前值来代替.
lr_save_string   把null-terminated字符串保存到参数中.其中,null-terminated的意思,我从网上查了下是:"以空字符
为结束标志的字符串",也就是以"\0"结束的字符串,其中的0是ASCII码的0,是不能用显示字符表示出来的,只有用
转义字符表示了.
lr_save_var 把变长字符串保存到参数中.
下面再来看下每个函数的具体解释(参考帮助):

lr_eval_string:
C Language
char *lr_eval_string (const char *instring);
返回内嵌参数赋值后的字符串。
instring:需要赋值的字符串。
lr_eval_string函数返回任何内嵌参数赋值后的输入字符串。如果字符串变量只包含一个参数,函数返回参数的当
前值。内嵌参数必须在括号中。

注:lr_eval_string是内部地分配内存。在每一次迭代之后会释放。如果你在循环中给参数赋值,不要使用lr_eval
_string保存内存。你需要使用lr_eval_string_ext,并且在每个循环迭代中使用lr_eval_string_ext_free释放内存。
这里我再补充一下:lr_eval_string_ext在关联的数据是二进制数据,例如,数据包含嵌入的NULL字符时是非常有用的。

例子:下面的例子使用lr_eval_string来代替参数row_cnt的当前值。使用lr_output_message把这个值输出到输出窗口。
  1. lrd_stmt(Csr1, "select count(*) from employee", -1, 1 /*Deferred*/, 2 /*Ora V7*/, 0);
  2. lrd_bind_col(Csr1, 1, &COUNT_D1, 0, 0);
  3. lrd_exec(Csr1, 0, 0, 0, 0, 0);
  4. lrd_save_col(Csr1, 1, 1, 0, "row_cnt");
  5. lrd_fetch(Csr1, 1, 1, 0, PrintRow2, 0);
  6. lr_output_message("value : %s",
  7. lr_eval_string("The row count is: {row_cnt}"));

  8. lr_save_string:
  9. C Language
  10. intlr_save_string (const char *param_value, const char *param_name);
  11. param_value:给参数赋值的值,参数值
  12. param_name:参数名称
  13. lr_save_string函数把指定的以空结束的字符串赋值给参数。这个函数在关联查询的时候非常有用。需要使用lr_eval_string来确定参数的值。
  14. 例子:
  15. 在下面的例子中,lr_save_string给参数emp_id赋值为777。然后这个参数被用在另一个查询中。
  16. lrd_stmt(Csr1, "select id from employees where name='John'", ...);
  17. lrd_bind_col(Csr1,1,&ID_D1,...);
  18. lrd_exec(Csr1, ...);
  19. lrd_fetch(Csr1, 1, ...);







  20. ID_D1

  21. 0

  22. 777



  23. lr_save_string("777", "emp_id");
  24. lrd_stmt(Csr1,"select salary from payment where id ='{emp_id}'",...);
  25. lrd_exec(Csr1, 0, 0, 0, 0, 0);
  26. lr_save_var
  27. C Language

  28. intlr_save_var (const char *param_value, unsigned long constvalue_len, unsigned long constoptions, const char *param_name);
  29. param_value:参数值
  30. value_len:值的字节长度
  31. options:参数选项,一般为0。
  32. param_name:参数名称。
  33. lr_save_var函数把指定的变长字符串赋值给参数。这个函数在关联查询的时候非常有用。需要使用lr_eval_string来确定参数的值。
  34. 例子:
  35. 在下面的例子中,lr_save_var 用来限制参数的长度。
  36. Action()
  37. {
  38.    #define MAX_NAME_LEN 4
  39. // 创建参数, InName
  40.        lr_save_string("Fitzwilliam", "InName");
  41. // 把 "InName"的前四个字节保存到 "ShortName"
  42. lr_save_var( lr_eval_string("{InName}"),
  43.         MAX_NAME_LEN, 0, "ShortName");
  44. return 0;
  45. }
  46. Output:

  47. Action.c(8): Notify: Saving Parameter "InName = Fitzwilliam"
  48. Action.c(10): Notify: Saving Parameter "ShortName = Fitz"
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-6 11:24 , Processed in 1.401661 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表