-
loadrunner中运行java代码
2008-10-15 10:17:23
概要步骤:
1.在eclipse建立java工程,编译要使用的java方法;
2.打开loadrunner,新建立脚本选择java脚本模式;
3.找到脚本存放的文件夹,把步骤1中整个的编译后的目录(class文件所在的整个目录)放如脚本文件夹中,
loadrunner就可以使用该java方法;
Java脚本开发基础
要想掌握Java虚拟用户的使用,测试脚本开发人员至少需要两方面的技能:一是具有Java语言方面的技能,并熟练使用至少一种Java集成开发工具,例如Eclipse;二是掌握LoadRunner的Java API,Java API是访问Vuser函数的基础,通过LoadRunner的Java API可以在脚本中很容易地创建事务与并发点、获取用户信息等功能。
不难看出,Java虚拟用户要求测试脚本开发人员具有良好的开发基础,否则Java Vuser很难发挥应有的作用。限于篇幅,本节在Java测试开发基础部分,仅对Java语言方面的知识做概要介绍,读者可以通过Java方面的书籍进行学习;在LoadRunner的Java API部分,将会介绍一些相对重要的方法。
1 Java虚拟用户开发基础
Java语言基础
Java语言博大精深,即使资深的Java开发工程师也未必敢自称精通,测试人员就更不容易成为“高手”了。但是如果仅仅为了满足测试开发,还是很容易快速入门的。表7-1列出了一些进行Java虚拟用户开发的知识点,读者可以自行学习。
表7-1 Java语言基础知识
知识点
详细内容
Java背景知识
² Java历史及发展、语言特点
² Java开发环境、程序工作原理
续表
知识点
详细内容
Java语言基础
² Java数据类型
² Java运算符与表达式、控制语句
² Java类定义规范
² Java数组
² Java的包
Java与面向对象技术
² 面向对象的概念
² Java中的类、方法和变量
² Java名字空间及访问规则
² Java中的抽象类、接口和程序包
² 对象的构造方法
Java中的数据结构
² Java数组
² 向量
² 字符串
输入/输出处理
² I/O流概述
² 字节流
² 字符流
例外处理(Exception)
² 例外的概念
² 例外的分类
² 捕获例外
² 声明例外
² 抛出例外
多线程
² 多线程基本概念
² 创建线程的方式
² 线程的生命周期及控制
² 线程的调度
² 多线程的互斥与同步
² 线程组
Java基本网络编程
² Java与Internet
² 使用InetAddress
² 使用URL
² Socket通信、数据报通信
JDBC
² JDBC基础、JDBC驱动程序
² JDBC编程
续表
知识点
详细内容
Java Servlet
² Servlet基本概念
² Servlet API
² Servlet执行过程与生命周期
² 容器、部署与运行
Java Server Page(JSP)
² JSP基础、JSP语法
测试人员在掌握了上面这些技能后,基本可以进行Java虚拟用户的开发了。同时,本着学无止境的原则,测试人员仍要以积极的态度来学习Java开发知识。
Java集成开发工具Eclipse
Eclipse是一个与NetBeans、Sun ONE Studio和Borland Jbuilder类似的,一种基于Java的整合型可扩展开发平台,也是目前最著名的开源项目之一。IBM一直在大力支持该项目的发展,并在2001年 11月宣布投入4千万美元到该项目的研发,这也是Eclipse项目发展较快的原因之一。
Eclipse专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目组成,具体包括四个组成部分:Eclipse Platform、JDT、CDT和PDE。JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。
Eclipse SDK(软件开发包)是Eclipse Platform、JDT和PDE所生产的组件合并,它们可以从eclipse.org网站(http://www.eclipse.org /downloads)上下载。这些组件提供了一个具有丰富特性的开发环境,允许开发者有效地建造可以无缝集成到Eclipse Platform中的工具。Eclipse SDK由Eclipse项目生产的工具和来自其他开放源代码的第三方软件组合而成。
在接下来的内容里,将介绍用Eclipse创建与编译Java类文件的过程以及如何在Java虚拟用户中调用编译好的类文件。关于Eclipse更深入的内容请读者参考其相关书籍。
l 创建Java项目
启动Eclipse后,依次选择菜单的“文件”→“新建”→“项目”,进入图7-7所示的界面。
图7-7 新建项目
在图7-7中选择Java项目,单击“下一步”,进入图7-8所示的界面。
图7-8 配置项目
在图7-8的“项目名称”输入“LoadRunnerDev”,“位置”下选择“在外部位置创建项目”,目录下选择“D:\LoadRunner”。然后点击“配置缺省值(O)...”,进入图7-9所示的界面。
图7-9 配置缺省值
在图7-9的“源和输出文件夹”处选择“文件夹(F)”,“源文件夹名(S):”默认为“src”,无须改变,在“输出文件夹名(O):”处输入“classes”,完成后返回图7-8所示界面。在图7-8中点击“下一步”,进入图7-10所示的界面。
图7-10 配置结果界面
在图7-10中,单击“完成”,新建Java项目工作完成。在图7-11中可以看到新建的项目“LoadRunnerDev”。
图7-11 包资源管理器
l 建立Java文件
如图7-12所示,在LoadRunnerDer中选中“src”,点击鼠标右键,进入“新建”,点击“类”,进入图7-13所示的新建Java类文件设置界面。
图7-12 新建Java类文件
在图7-13中,输入包名称“com.lr.test”、类名称“HelloWord”,其他各项设置默认即可。点击“完成”,进入源代码编辑界面,如图7-14所示。
图7-13 文件基本配置信息
图7-14 文件编辑界面
在源代码编辑界面,输入测试语句“System.out.println("HelloWord!");”如图7-14所示。代码编辑完成后,按照图7-15编译与运行程序。如果编译执行成功,可以在Eclipse的控制台看到输出结果,如图7-16所示。
图7-15 执行Java程序
图7-16 查看编译结果
l 编译与运行Java程序
编译后的class文件可以在“D:\LoadRunner\classes\com\lr\test”下找到,如图7-16所示。需要注意的是,类文件的存放路径是根据建立项目的设置来决定的。
l 开发虚拟用户脚本
进入到“D:\LoadRunner\classes”目录下,把整个“com”文件夹复制到“C:\j2sdk1.4.1\lib”,这样LoadRunner创建的所有Java Vuer脚本均可以直接调用;如果放到虚拟用户脚本的当前路径下,则只有当前的虚拟用户脚本可以调用。多台主机进行并发测试时,应该把编译好的类文件放到对应的虚拟用户脚本目录下。根据图7-1和图7-2所示新建一个Java虚拟用户脚本,并对照图7-17,输入同样的测试脚本,尤其要在代码开始处输入包的导入语句“import com.lr.test.*;”。
图7-17 Java虚拟用户示例脚本
l 运行虚拟用户脚本
点击Virtual User Generator 工具栏上的 图标开始执行脚本。正确的执行结果如图7-18所示,可以看到执行日志中有“System.out: HelloWord!”。如果运行不正确,读者可以参照前面的过程进行分析,同时检查JDK的路径设置。
图7-18 正确执行的虚拟用户脚本
与 C Vuser脚本相比,Java Vuser 脚本是先编译再执行,而C Vuser脚本是解释性的。VuGen在JDK安装路径内查找javac编译器,并在脚本内编译Java代码。该阶段由VuGen窗口底部的“正在编译... ”状态消息来指示。如果在编译期间出错,则这些错误将在执行日志中列出。
测试脚本保存后,接下来可以放到Controller中来运行,读者可以自己进行实验。需要注意的是,如果进行多台计算机联机测试,则所有运行测试脚本的客户机必须安装JDK环境并正确设置路径,否则将会出现如图7-19所示的提示。
图7-19 JDK环境不正确的提示
要想正确使用Java虚拟用户,首先要保证测试环境配置正确。执行测试时,可以先用本节的示例程序来检查环境是否正确,然后再进行复杂功能的开发。
2 LoadRunner的Java API
LoadRunner为访问Vuser函数提供了特定的 Java API,这些函数都是lrapi.lr类的静态方法。借助Java API可以大大增强Java虚拟用户脚本的可用性。本节将介绍常用的Java API的用法,更多的函数及其用法读者可以参考LoadRunner联机手册。
在Java虚拟用户中,Java API函数的用法与Vuser函数中的用法基本一致,只是写法稍稍不同,更符合Java语言的特点。
1. 事务函数(Transaction Functions)
(1)int lr.start_transaction( String transaction_name ):标记事务开始;
(2)int lr.end_transaction ( String transaction_name, int status ):标记事务结束。
2. 信息函数(Informational Functions)
(1)String lr.get_group_name( ):返回 Vuser 组的名称;
(2)String lr.get_host_name( ):返回执行 Vuser 脚本的负载生成器的名称;
(3)String lr.get_master_host_name ( ):返回运行Controller计算机的名称;
(4)int lr.get_scenario_id( ): 返回当前方案的ID;
(5)int lr.get_vuser_id( ) :返回当前 Vuser 的ID。
3. 运行时函数(Run-Time Functions)
(1)void lr.peek_events ( );:指示可以暂停Vuser 脚本的位置;
(2)int lr.rendezvous( String rendezvous_name ):在 Vuser 脚本中设置集合点;
(3)void lr.think_time( double time ):暂停脚本执行,模拟实际用户操作之间的思考时间。
4. 字符串函数(String Functions)
(1)String lr.eval_string ( String instring ):用当前值替换参数;
(2)int lr.eval_int ( String name ):用整型值替换参数;
(3)int lr.next_row ( String dat_file ):指示使用指定参数的下一行数据。
5. 消息函数(Message Functions)
(1)int lr.debug_message( int message_level, String message):向输出窗口发送测试过程的调试消息;
(2)int lr.error_message ( String message ):向Vuser日志文件和输出窗口发送错误消息以及位置的详细信息;
(3)int lr.log_message ( String message ):向 Vuser 日志文件发送消息;
(4)int lr.message ( String message ):向输出窗口发送消息;
(5)int lr.output_message ( String message ):向日志文件和输出窗口发送消息和位置信息;
(6)int lr.vuser_status_message ( String message ):向Controller窗口中的“Vuser状态”区域发送消息。
-
(转)loadrunner中Lr_save_string()函数和Itoa()函数的使用
2008-10-15 10:12:46
Lr_save_string()函数和Itoa()函数的使用/*
目的:使用for循环添加多条有规律的数据,比如说:a1、a2、a3......a1000
方法:从上面看1-1000是一个有序序列,并且前面的a都是固定的,所以只需要用for循环将1-1000循环出来就可以了。
但是loadrunner使用的是C语言的语法,所以不能向在java中一样,将两个变量直接相加(+)(+:连字符)
所以这个时候就需要将首先将int变量转换成string,然后再用lr_save_string()函数将该变量用loadrunner可以识别的参数化方式保存起来,再应用到录制的脚本中就可以了
函数简介:
int itoa ( int value, char *str, int radix );
函数目的:将int类型转换成string
参数介绍:value: 要转换的int型的值
str: 目标字符串,即将转换成的string值保存到str中
radix:转换数字时所用的基数 10:十进制;2:二进制……
int lr_save_string (const char *param_value, const char *param_name);
函数目的:将param_value值保存到param_name变量中
参数介绍:param_value:要保存的值
param_name: 变量名称
问题:为什么要用itoa()和lr_save_string()两个函数相结合使用呢?
因为lr_save_string()中的两个参数都是char类型的指针,int类型的值必须经过转换才能在lr_save_string()函数中使用,所以此处就要将itoa()和lr_save_string()两个函数相结合使用。
*/
Action()
{
int i;
char str[100]; //定义一个数组用来保存int类型转换后的值
for(i=0;i<=9;i++){
itoa(i,str,10);
lr_save_string(str,"ID");
lr_output_message("==str:=%s==ID:=%s====",str,lr_eval_string("{ID}"));
}
/*
用lr_save_string()将数组保存到变量中以后就可以应用到Loadrunner录制的脚本中了
{ID}:是loardrunner识别参数的方式
web_url("login",
"URL=http://server0.im.sonoro.cn:18001/login?username=a{ID}&password=test&autoLogin=false&1211433835878&1211433835878",
"TargetFrame=",
"Resource=0",
"RecContentType=text/html",
"Referer=http://server0.im.sonoro.cn:18001/proxy.html?1211433821547",
"Snapshot=t6.inf",
"Mode=HTML",
LAST);
*/
return 0;
}
-
(转)LoadRunner如何设置文本和网页图像的检查点
2008-10-15 10:07:21
通过 VuGen 可在网页上添加搜索文本字符串的检查。可以在录制期间或录制之后添加文本检查。在创建文本检查时,需要定义检查的名称、检查范围、要检查的文本和搜索条件。
要在录制之后添加文本检查,请执行下列操作:
1.在 VuGen 主窗口中,右键单击与要对其执行检查的网页相应的步骤。从弹出菜单中选择“在之后插入”。将打开“添加步骤”对话框。
2.在“步骤类型”树中,展开“Web 检查”。
3.选择“文本检查”,然后单击“确定”。将打开“文本检查属性”对话框。请确保“规格”选项卡可见。
4.在“搜索”框中,键入要验证其存在与否的字符串。ABC 图标表示尚未为“搜索”框中的字符串分配参数。有关分配参数的详细信息,请参阅第 7 章“定义参数”。
5.要相对于邻近文本指定搜索字符串的位置,请选中“其右侧”或“其左侧”复选框。然后,在适当的字段中键入文本。例如,要验证字符串support@mercuryinteractive.com是否出现在单词“e-mail:”的右侧,请选中“其右侧”,然后在“其右侧”框中键入“e-mail:”。ABC 图标表示尚未为“其右侧”或“其左侧”框中的字符串分配参数。
6.命名文本检查。单击“常规”选项卡,然后在“步骤名”框中键入文本检查的名称。使用一个以后容易识别该检查的名称。
7. 属性表显示其他用于定义检查的属性。清除“仅查看活动属性”复选框可以查看活动和非活动属性。要启用某个属性,请单击该属性名左侧的单元格。在“值”列中为属性分配一个值。有关分配属性值的详细信息,请参阅第 454 页的“定义其他属性”。
8.单击“确定”接受设置。代表新文本检查的图标将被添加到脚本中的关联步骤中。在脚本视图中,“文本检查”图标显示为 web_find 函数。要在录制期间添加文本检查,请执行下列操作:
1.使用鼠标标记所需的文本。
2.单击录制工具栏上的“插入文本检查”图标。
除了使用 web_find 函数外,还可以使用两个其他的增强函数来搜索 HTML 页内的文本:
web_reg_find
web_global_verification
web_reg_find 函数是注册类型函数。它将注册对 HTML 页上的文本字符串进行的搜索。注册意味着它不会立即执行搜索 - 仅在执行下一个操作函数(如web_url)之后,才会执行检查。注意,如果正在使用并发函数组,则web_reg_find 函数仅在分组结束后才会执行。该函数与 web_find 函数的不同之处在于:它并不局限于基于 HTML 的脚本(请参见“录制选项” > “录制”选项卡)。该函数还具有其他属性(如实例)通过该属性可以确定文本出现的次数。在执行标准文本搜索时, web_reg_find是首选函数。通过 VuGen 可添加在网页上搜索图像的用户定义的检查。图像可以由 ALT 属性、SRC 属性或这两者来标识。可以在录制期间或录制之后添加用户定义的图像检查。录制之后,可以在脚本中编辑任何现有的图像检查。
要添加图像检查,请执行下列操作:
1.在 VuGen 主窗口中,右键单击与要对其执行检查的网页相应的步骤。从弹出菜单中选择“在之后插入”。将打开“添加步骤”对话框。
2.在“步骤类型”树中,展开“Web 检查”。
3.选择“图像检查”,然后单击“确定”。将打开“图像检查属性”对话框。请确保“规格”选项卡可见。
4.选择一种标识图像的方法:
a)要使用图像的 ALT 属性来标识图像,请选中“替换图像名(ALT 属性)”复选框,然后键入 ALT 属性。在运行脚本时, Vuser 将搜索具有指定的 ALT 属性的图像。
b)要使用图像的 SRC 属性来标识图像,请选中“图像服务器文件名(SRC 属性)”复选框,然后键入 SRC 属性。在运行脚本时, Vuser 将搜索具有指定的 SRC属性的图像。ABC 图标表示尚未为 ALT 或 SRC 属性分配参数。
5.要命名图像检查,请单击“常规”选项卡。在“步骤名”框中,键入图像检查的名称。使用一个以后容易识别该检查的名称。
6.属性表显示其他用于定义检查的属性。清除“仅查看活动属性”复选框可以查看活动和非活动属性。要启用某个属性,请单击该属性名左侧的单元格。在“值”列中为属性分配一个值。有关分配属性值的详细信息,请参阅第 454 页的“定义其他属性”。
7.单击“确定”以接受设置。代表新图像检查的图标将被添加到 Vuser 脚本中的关联步骤中。可以指定插入到 Vuser 脚本中的每个 Web 检查的其他属性。在检查属性对话框的“常规”选项卡上的属性表中设置其他属性。
-
(转)LoadRunner编程之文件的操作
2008-10-15 09:44:11
这篇文章主要写下LoadRunner下如何进行文件的操作。
1,文件的声明
LoadRunner不支持FILE数据类型,所以在LoadRunner中用int来声明一个文件:
int MyFile;
2,文件的打开
fopen():返回一个FILE数据类型的指针.因为LoadRunner不支持FILE数据类型,所以返回值需要转化成int型.
int MyFile;
MyFile=(int)fopen("C:\\temp\\loans.txt","w");
fopen()函数的第一个参数是创建文件的路径.第二个参数指定了创建文件的模式.下面是常用的几种模式:
“w” - 写, 当需要往文件中写的时候. 如果文件存在,就覆盖该文件,如果文件不存在,根据第一个参数来创建新文件.
“r” – 读, 需要从文件中读的时候. 这个文件必须已经存在.
“a” – 附加, 当往文件末尾添加数据时用到.
“rw” – 读和写.
第一个参数中注意文件路径为"\\",因为"\"在C语言中为转义字符.另外,如果文件和脚本在同一个目录中,文件的完整路径可以省略.
3, 读文件
fscanf():用来读文件。函数语法如下:
int MyFile;
int LoanNumber;
MyFile = fopen(“C:\\temp\\loans.txt”,”r”);
fscanf(MyFile,”%d”, &LoanNumber);
需要注意的是:MyFile是个文件指针(在LoadRunner中并不是真正的指针),被用来代替实际的文件。所有文件的操作都是使用文件指针而不是文件名称。
练习1:
先创建一个文件c:\temp\loans.txt,文件包含的内容为:
11111
22222
33333
44444
55555
循环读取并显示该文件中的每行数据,脚本如下:
Action()
{
int MyFile;
int LoanNumber,i;
// Assigning the file path to a string
char FileName[80] = "C:\\temp\\loans.txt";
// Opening the file
// Note the use of variable to replace the file path
//
MyFile = (int)fopen(FileName,"r");
// Reading and printing one loan number at a time
for(i=1;i<=5;i++)
{
fscanf(MyFile,"%d", &LoanNumber);
lr_output_message("Loan Number %d: %d",i,LoanNumber);
}
fclose(MyFile);
return 0;
}
当文件打开之后,文件指针在文件的最开始。每读一次,指针就移动到下一行,这就是为什么程序能自动读取下面元素的原因。
a) 如果把循环改为for(i=1;i<=7;i++),会出现什么样的结果呢?
会出现三个都是打印55555的结果,原因是文件指针移动到最后就不再移动了,但是有7次循环,那多出来的2次循环打印的数据仍然是最后一行的数据。
b) 如果不知道该文件下包含数据的行数, 就无法用for循环。需要使用while循环。可以使用feof函数。feof(MyFile)在文件指针没有到达返回文件末尾的时候返回0,如果到末尾返回非0值。这样可以修改程序的循环为:
while(feof(MyFile)== 0);
注意:如果文件末尾有空行,feof也会把它最为文件的一部分。
4,写文件
fprintf():用来往文件写。语法如下:
int MyFile;
char Name[] = “John Doe”;
MyFile = fopen(“C:\\temp\\loan.txt”,”w”);
fscanf(MyFile,”%s”,Name);
第一个参数是文件指针,第二个参数是格式,第三个参数是指定格式对应的变量。
Action()
{
int MyFile;
char Name[] = "John Doe";
MyFile = fopen("C:\\temp\\names.txt","w");
// note that "w" is used to write
fprintf(MyFile,"%s", Name);
// note that we are printing a string here