发布新日志

  • 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部分,将会介绍一些相对重要的方法。

    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虚拟用户,首先要保证测试环境配置正确。执行测试时,可以先用本节的示例程序来检查环境是否正确,然后再进行复杂功能的开发。

    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循环添加多条有规律的数据,比如说:a1a2a3......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)  如果把循环改为fori=1i<=7;i++),会出现什么样的结果呢?

    会出现三个都是打印55555的结果,原因是文件指针移动到最后就不再移动了,但是有7次循环,那多出来的2次循环打印的数据仍然是最后一行的数据。

    b) 如果不知道该文件下包含数据的行数, 就无法用for循环。需要使用while循环。可以使用feof函数。feofMyFile)在文件指针没有到达返回文件末尾的时候返回0,如果到末尾返回非0值。这样可以修改程序的循环为:

           whilefeofMyFile== 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

Open Toolbar