灿烂的阳光,苦涩的生活,认真做,你能行!

发布新日志

  • Loadrunner8.1录制、回放乱码问题解决办法和快照问题解决办法.

    2010-04-07 17:22:30

    1、录制脚本乱码
    LR录制的脚本中可能会有乱码,主要是当URL中有中文时。
    通过如下问题可以解决此问题:
    a)  Go to Vugen -> Tools -> Recording Options -> Advanced
    b)  Check the option that reads "Support Charset" and select "UTF-8"

    2、回访乱码
    还有一类乱码问题是:IE访问页面一切正常,但是LR回放时在run viewer中显示的页面为乱码。
    这一问题一般是由于页面保存时的编码格式和页面中的charset格式不一致引起的(html头中通常会有<meta. http-equiv="Content-Type" c>)。遇到这类问题,只需要将页面做另存为,将保存的编码格式和页面中的charset格式统一起来就可以了。
    引起问题的原因是:
    IE浏览器解码时会优先考虑文件的保存编码格式,而后考虑页面中的charset格式,(正常情况下两者是一致的),而run viewer是直接使用页面中的charset格式打开的。
    例如:charset=gb2312,但是文件的保存的编码格式是UTF-8,IE访问时会以UTF-8解码,而run viewer却是以GB2312格式解码,以GB2312解UTF-8自然是乱码。
    出现乱码的原因和解决办法很可能不全面,请大家补充。
    说到底,还是run viewer功能比较简单引起的。
    run viewer中的乱码不影响测试结果。

    3、没有快照
    现在再来说一说LR的快照问题,LR脚本录制完成后回放,在回放概况中的快照都是红X,见附件。
    这一问题应该是LR中文补丁引起的,要去比较高的朋友,请不要打中文补丁。
    呵呵,LR对中文的支持还是不理想啊。

    最后将有关字符集的资料帖上来,供大家参考。

    字符集、字符编码
    1.文件分为文本文件和二进制文件﹐不过本质都一样﹐都是些01。
    2.计算机存储设备存储的0或1﹐称为计算机的一个二进制位(bit)。
    3.二进制文件的0和1有专门的应用程序来读﹐所以它们没有什么乱不乱码的问题﹐只要该程序认得就行。(像doc,xls,exe,dll等)
    4.文本文件就不一样了﹐notepad要认识它﹐vs.net要认识它,UE也要认识它…所以它们就要有一个标准。这个标准的原理其实很简单﹐就是把所有的字符都给它一个序号﹐然后根据这个序号来找字符就可以了。这个东东就是编码表,也叫字符集(charset)。
    5.文本文件存的都是字符﹐如﹕A,?,@,x。很明显一个bit不能表示﹐刚好计算机的存储单位–字节(byte)就是多个字节(1个byte=8个bit),因此用byte来表示字符就理所当然了。
    6. 第一个编码表–ASCII码很快产生﹐很简单﹐就是用一个byte来表示一个字符(最高位置0),总共能存储128(2^8)个字符。如A用65表示﹐ 存在计算机中就是01000001(65)﹐为了书写方便﹐我们一般记作0×41(16进制),97则表示小写的a,存在计算机中就是01100001 (97)﹐记作0×61。?用63表示,记作0×3F。
    7.英语国家的大小写字母加起来才52个字符﹐再加上数字﹐符号和一些特殊字符﹐已经足够使用。所以ASCII刚开始非常流行(谁叫计算机不是咱中国发明的… )
    8.随着计算机的普及﹐当非英语系的国家开始使用时﹐ASCII已经明显不能满足了(总不成天天使用xiao sheng来表示”小生”吧),所以这些国家(地区)就开始制订自己的标准。
    9. 中国大陆制订了简体汉字的字符集(GB2312)。和英语国家不同﹐我们的汉字远远不止128个﹐所以一个byte肯定不能表示完﹐那就多加个byte, 16位(65536)总可以了吧。不过这样虽解决了位数不够的问题﹐但是原来的英文文件怎么办?总不成又全部拿出来改成双字节吧。幸好﹐居然发现原来的 ASCII的第一位居然是0﹐那我们把第1位改成1不就OK了吗?以后凡看到0开头的就读1个字节﹐1开头的就读2个字节。(而且128*128表示所有的简体字也足够了)
    10.因此在GB2312标准中,”小”的序号是0xD0A1,表示成11010000 10100001,而A还是表示成01000001,这就是为什么简体操作系统读ASCII文件不会乱码﹐而反之则不然的原因。
    11.目前来说﹐情况还比较好﹐中国大陆的计算机运行正常。
    12.看到中国大陆制订了一个标准﹐其它国家和地区也不甘示弱﹐纷纷亮出自己的字符集,于是乎什么BIG5(中国台湾),shift_jis(日本),ks_c_5601-1987(韩国)都闪亮登场﹐一时间百鸟争鸣,百花齐放。
    13.每个国家都想与ASCII保持兼容﹐理所当然﹐后面的字符就完全不一样了﹐因此﹐同样的0xD0A1,在GB2312中是”小”字﹐而在BIG5中却是”苤”字。你想想﹐这样不乱才怪。
    14.到了这时候﹐总有人会想到﹐再这样继续下去是肯定不行的﹐于是它们就想到了﹐如果有一个标准﹐能包括所有字符那不就OK了吗?
    15. 于是”大哥大”标准就出来了﹐这就是unicode,为了能够足够表示世界上的所有字符这样光荣而又伟大的任务﹐这家伙用了四个字节来表示(2的32次方到底是多少﹐我也懒得算了),这下好了﹐天下太平了﹐再也不会有麻烦了﹐耳根清静了…(打住﹐你小子这么这么罗嗦呀)
    15.不过 unicode好是好﹐但是毕竟四个字节表示一个字符”浪费”太大了(我那破猫上网容易吗﹐电信黑呀﹐说好是2M﹐就给我200K…)﹐而且大家”惊奇”地发现﹐居然世界上一些”较强大”的国家的字符刚好集中在前65536位前﹐呵呵﹐结果unicode也分成了unicode-16和unicode -32了﹐自然﹐前者只用两个字节表示(所以只能表示前65536位喽,欧亚国家大部分字符都OK了﹐什么﹐你们那个@$Y$%字符没有﹐呵呵﹐不管我什么事,找标准协会﹐都是那帮家伙弄的…)
    16.虽然标准出来了﹐可是好歹ASCII也用了这么久﹐那些英语国家也在那里嚷嚷﹐这倒好 ﹐搞个什么破标准﹐我们又没有得到什么好处﹐反而让我们原来的程序都运行不了了(为什么呀﹐你想想﹐原来我们的程序字符都是一个字节一个字节认﹐现在倒好 ﹐全改成2个一起认﹐这还怎么跑呀?)﹐况且我们凭白无故了用了这么多0﹐真别扭(unicode中的前128位还是ASCII标准﹐只不过在前面加了8 个0)﹐由于那些国家”势力”比较大﹐所以这个问题不容忽视
    17.这个世界上的牛人总是这么多﹐这个问题很容易就被小意思地解决了。
    18. 想想GB2312怎么解决与ASCII兼容的问题的(1开头的就读2个字节﹐0开头的就读1个字节)﹐同样﹐UTF也这样﹐0开头的读1个字节 (ASCII码)﹐110开头的读2个字节﹐1110开头的读3个字节﹐这就是伟大的UTF-8(当然还有UTF-16,原理一样﹐xx开头的读4个字节 ﹐xx开头的读5个字节﹐xx开头的读6个字节)
    19.当然UTF-8没GB2312这么简单﹐读完之后不能直接查编码表﹐多加一个步骤﹐按照模板提取一下字符再查就OK了
    以下就是UTF-8的模板
    0×0000 - 0×007F用一个字节表示 0xxxxxxx
    0×0080 - 0×07FF用两个字节表示 110xxxxx 10xxxxxx
    0×0800 - 0xFFFF用三个字节表示 1110xxxx 10xxxxxx 10xxxxxx
    举个例子吧,
    如果你遇到了11100110 10110001 10001001 01000001 这样的字节流﹐首先你看第一个字节以1110开头﹐即读3个字节并按模板提取得到 0110 110001 001001(去除模板标志﹐再四字节四字节读即0×6c49),查unicode编码表就是”汉”字,而最后一个以0开头就一定是一个字节了﹐0×0041,也就是”A”。
    20.好了﹐上面是原理﹐再来谈谈简繁体操作系统转换时的乱码问题吧
    21.按照我的想法﹐windows操作系统应该有一个默认的系统字符集﹐如简体操作系统应该是GB码﹐繁体操作系统则是BIG5,英文操作系统是ASCII。系统内的软件(notepad)默认都是使用这个字符集。
    22.所以我在繁体操作系统默认存储的文本文件就是BIG5了﹐当这个文件到了简体系统里﹐它的notepad程序则使用自己的默认编码(GB)来读取﹐这样就乱了。
    23.因此如果在保存时就使用utf-8来保存﹐应该在两系统切换时就不会有问题了。
    24.而要解决这个问题其实也很简单﹐只要知道这个文本文件原来的编码就可以了﹐使用它读出来﹐再转成unicode即可。

  • LR中术语集锦和探讨(转载)

    2010-04-07 12:11:49

    Transactions(用户事务分析)
    用户事务分析是站在用户角度进行的基础性能分析
    1、Transation Sunmmary(事务综述)
    对事务进行综合分析是性能分析的第一步,通过分析测试时间内用户事务的成功与失败情况,可以直接判断出系统是否运行正常。

    2、Average Transaciton Response Time(事务平均响应时间)
    “事务平均响应时间”显示的是测试场景运行期间的每一秒内事务执行所用的平均时间,通过它可以分析测试场景运行期间应用系统的性能走向。
    例:随着测试时间的变化,系统处理事务的速度开始逐渐变慢,这说明应用系统随着投产时间的变化,整体性能将会有下降的趋势。

    3、Transactions per Second(每秒通过事务数/TPS)
    “每秒通过事务数/TPS”显示在场景运行的每一秒钟,每个事务通过、失败以及停止的数量,使考查系统性能的一个重要参数。通过它可以确定系统在任何给定时刻的时间事务负载。分析TPS主要是看曲线的性能走向。
    将它与平均事务响应时间进行对比,可以分析事务数目对执行时间的影响。
    例:当压力加大时,点击率/TPS曲线如果变化缓慢或者有平坦的趋势,很有可能是服务器开始出现瓶颈。

    4、Total Transactions per Second(每秒通过事务总数)
    “每秒通过事务总数”显示在场景运行时,在每一秒内通过的事务总数、失败的事务总署以及停止的事务总数。

    5、Transaction Performance Sunmmary(事务性能摘要)
    “事务性能摘要”显示方案中所有事务的最小、最大和平均执行时间,可以直接判断响应时间是否符合用户的要求。
    重点关注事务的平均和最大执行时间,如果其范围不在用户可以接受的时间范围内,需要进行原因分析。

    6、Transaction Response Time Under Load(事务响应时间与负载)
    “事务响应时间与负载”是“正在运行的虚拟用户”图和“平均响应事务时间”图的组合,通过它可以看出在任一时间点事务响应时间与用户数目的关系,从而掌握系统在用户并发方面的性能数据,为扩展用户系统提供参考。此图可以查看虚拟用户负载对执行时间的总体影响,对分析具有渐变负载的测试场景比较有用。

    7、Transaction Response Time(Percentile)(事务响应时间(百分比))
    “事务响应时间(百分比)”是根据测试结果进行分析而得到的综合分析图,也就是工具通过一些统计分析方法间接得到的图表。通过它可以分析在给定事务响应时间范围内能执行的事务百分比。

    8、Transaction Response Time(Distribution)(事务响应时间(分布))
    “事务响应时间(分布)”显示在场景运行过程中,事务执行所用时间的分布,通过它可以了解测试过程中不同响应时间的事务数量。如果系统预先定义了相关事务可以接受的最小和最大事务响应时间,则可以使用此图确定服务器性能是否在可以接受的范围内。
  • 使用LoadRunner开发JAVA Vuser

    2008-10-13 16:20:14

    众所周知,Java语言是一门非常适合网络开发的语言,用 Java语言进行性能测试脚本开发将会大大提高测试开发效率。LoadRunner中提供了对Java虚拟用户的支持。Java虚拟用户依托于JDK,这大大扩充了LoadRunner的脚本开发功能。测试人员既可以用Java虚拟用户来测试基于Java的应用系统的性能,又可以使用Java语言的强大开发脚本功能来测试其他平台的系统性能。

    本章将和读者一起探索LoadRunner的Java世界,重点讨论如何开发Java自定义的虚拟用户脚本。本章主要内容如下:

    n  认识Java虚拟用户

    n  Java脚本开发基础

    n  Java算法测试案例

    7.1  认识Java虚拟用户

    7.1.1  Java虚拟用户协议

    Java虚拟用户脚本主要有Java Vuser、Corba-Java、RMI-Java、EJB等类型。这些类型的虚拟用户脚本均可以用Java语言来手工编写。下面将对各类Java虚拟用户简单地进行介绍。

    Java Vuser

    Java Vuser是自定义的Java虚拟用户脚本,脚本中可以使用标准的Java语言。这种虚拟用户不可以录制,只能采用纯手工编写,其适用范围和C Vuser一样,非常广泛。

    本章主要探讨Java Vuser的开发方法。

    Corba-Java

    Corba-Java类型的虚拟用户主要用来测试用Java编写的、使用Corba应用程序或小程序的性能,用户可以先运行VuGen录制的脚本,然后使用标准的Java库函数以及LoadRunner特有的Java方法来增强该脚本。

    RMI-Java

    RMI-Java 虚拟用户适用于测试RMI(远程方法调用)Java应用程序或小程序。选择RMI-Java 用户进行录制,VuGen可以创建对应的Java脚本。完成录制后,可以使用JDK或自定义类,通过标准的Java代码来增强或修改脚本,还可以通过特定于LoadRunner的Java方法增强该脚本。

    EJB

    EJB虚拟用户专门用于测试Enterprise Java Beans对象。采用EJB协议,VuGen会自动创建脚本以测试EJB功能,无需录制或编程,这和标准的Java Vuser明显不同。

    在使用EJB协议类型的虚拟用户生成脚本前,需要指定 JNDI属性和关于应用程序服务器的其他信息。LoadRunner的EJB检测器首先扫描应用程序服务器并确定哪些EJB可用;接着选择要测试的 EJB,LoadRunner将生成要测试每个EJB方法的脚本,并为每个方法创建事务,便于度量其性能并找出问题。

    需要注意的是,创建EJB虚拟用户测试脚本必须在应用程序服务器主机上安装LoadRunner EJB检测器,而且检测器必须处于活动状态。EJB检测器是一个独立的代理程序,必须将其安装在要扫描查找EJB的每一台计算机上。安装EJB检测器前,计算机上还需要安装有效的JDK环境。

    本书中将以Java Vuser为例来讲解Java虚拟用户的开发和使用方法。Corba-Java、RMI-Java、EJB、Jacada Vuser等类型的虚拟用户使用方法可以参考LoadRunner的联机帮助手册,但是其手工脚本的开发方法与Java Vuser是一样的。

    在“新建虚拟用户”对话框中的“自定义”或“全部协议”类别下选择“Java Vuser”即可创建空的Java Vuser脚本,如图7-1所示。

    在自动生成的脚本中,vuser_init、 vuser_end部分没有任何内容,Actions部分生成的脚本如图7-2所示。对于Java类型的虚拟用户,可以编辑Actions类,而 init、end部分则不可以进行编辑。在Actions类中,有三个方法init、action和end,通常在init方法中编写初始化代码、在 action方法中编写业务流程、在end方法中编写诸如释放资源之类的代码。

    Java Vuser脚本中可以放置任何标准Java代码,这也是Java虚拟用户的魅力所在。

    7.1.2  Java虚拟用户适用范围

    LoadRunner完全支持C语言,原则上可以用C语言实现任何想要录制的功能。但是C语言的特点决定了这样做是不现实的:一是性能测试脚本开发成本非常高;二是很多企业的测试人员开发基础不好。因此,性能测试开发多选用C++、C#、Java等面向对象语言——因为这类语言既有成熟的集成开发工具,又有庞大的类库来支撑,测试脚本开发速度会更快。下一章将重点介绍如何用.NET来开发性能测试脚本。

    Java虚拟用户适用范围非常广,归纳起来主要有两大类:一类是不太适合录制的业务功能点的性能测试,例如网页上Http文件的下载过程、视频播放等;另一类是基于Java语言开发的应用系统的性能测试,这类应用更适合采用Java虚拟用户进行测试。

    用Java Vuser实现无法录制的测试需求

    这类测试需求往往关注于对服务器产生的压力,重点测试在一定压力下服务器的负载情况,为评估、部署、调优系统提供参考。在这类测试工作中,Java的作用仅是一门语言,用于辅助测试人员完成测试程序的开发。

    在性能测试工作中,不能录制的测试点很多,主要有以下几类:

    l  含有控件的Web应用

    在Web应用中,很多包含一些插件的浏览器应用经常不能录制。这类应用往往涉及很多协议,因此录制起来不是特别方便。

    对于这类应用,可以用Java语言调用其功能来完成用户行为的模拟。

    l  一些和媒体播放、文件下载等相关的应用

    媒体播放或文件下载等过程的录制往往不容易控制,如果是应用基于P2P的协议,则会更加复杂。因此,这类测试只能由测试人员开发虚拟用户脚本来完成。

    用Java Vuser测试基于Java语言的应用系统性能

    相比前面,基于Java语言开发的应用系统,在性能测试中采用Java虚拟用户更显得“门当户对”。这类虚拟用户主要应用在下面两类测试中:

    l  核心算法或业务的执行效率

    对银行、电信等大型的基于J2EE的架构应用系统中,开发阶段的性能测试是必不可少的。为了降低后期遇到性能问题的风险,往往在开发阶段进行一些核心业务的性能测试。这些核心业务或要求较高的执行效率,或者要求支持较多用户的并发。因此,可以利用Java Vuser来测试这些业务的执行效率。

    l  Java应用中不能录制的业务模块

    很多时候,一些J2EE架构的业务系统用 LoadRunner录制起来不是特别方便,例如一些Java智能客户端程序。这时可以手工编写测试代码,完成测试任务。与非Java应用相比,Java 应用中不能录制的业务功能更适合采用Java虚拟用户,因为可以直接对一些方法进行调用。

    由于Java语言的强大功能,Java虚拟用户的应用远不止上面这些,读者可以慢慢挖掘。

  • loadrunner中运行java代码

    2008-10-12 20:35:01

    概要步骤:

    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函数小全

    2008-10-09 17:40:40

     给出一部分常用的LoadRunner函数,供大家参考。  

    LR函数:

    lr_start_transaction

    为性能分析标记事务的开始

    lr_end_transaction

    为性能分析标记事务的结束

    lr_rendezvous

    在 Vuser 脚本中设置集合点

    lr_think_time

    暂停 Vuser 脚本中命令之间的执行 

    lr_end_sub_transaction

    标记子事务的结束以便进行性能分析

    lr_end_transaction

    标记 LoadRunner 事务的结束

    Lr_end_transaction("trans1",Lr_auto);

    lr_end_transaction_instance

    标记事务实例的结束以便进行性能分析

    lr_fail_trans_with_error

    将打开事务的状态设置为 LR_FAIL 并发送错误消息

    lr_get_trans_instance_duration

    获取事务实例的持续时间(由它的句柄指定)

    lr_get_trans_instance_wasted_time

    获取事务实例浪费的时间(由它的句柄指定)

    lr_get_transaction_duration

    获取事务的持续时间(按事务的名称)

    lr_get_transaction_think_time

    获取事务的思考时间(按事务的名称)

    lr_get_transaction_wasted_time

    获取事务浪费的时间(按事务的名称)

    lr_resume_transaction

    继续收集事务数据以便进行性能分析

    lr_resume_transaction_instance

    继续收集事务实例数据以便进行性能分析

    lr_set_transaction_instance_status

    设置事务实例的状态

    lr_set_transaction_status

    设置打开事务的状态

    lr_set_transaction_status_by_name

    设置事务的状态

    lr_start_sub_transaction

    标记子事务的开始

    lr_start_transaction

    标记事务的开始

    Lr_start_transaction("trans1");

    lr_start_transaction_instance

    启动嵌套事务(由它的父事务的句柄指定)

    lr_stop_transaction

    停止事务数据的收集

    lr_stop_transaction_instance

    停止事务(由它的句柄指定)数据的收集

    lr_wasted_time

    消除所有打开事务浪费的时间

    lr_get_attrib_double

    检索脚本命令行中使用的 double 类型变量

    lr_get_attrib_long

    检索脚本命令行中使用的 long 类型变量

    lr_get_attrib_string

    检索脚本命令行中使用的字符串

    lr_user_data_point

    记录用户定义的数据示例

    lr_whoami

    将有关 Vuser 脚本的信息返回给 Vuser 脚本

    lr_get_host_name

    返回执行 Vuser 脚本的主机名

    lr_get_master_host_name

    返回运行 LoadRunner Controller 的计算机

    lr_eval_string

    用参数的当前值替换参数

    lr_save_string

    将以 NULL 结尾的字符串保存到参数中

    lr_save_var

    将变长字符串保存到参数中

    lr_save_datetime

    将当前日期和时间保存到参数中

    lr _advance_param

    前进到下一个可用参数

    lr _decrypt

    解密已编码的字符串

    lr_eval_string_ext

    检索指向包含参数数据的缓冲区的指针

    lr_eval_string_ext_free

    释放由 lr_eval_string_ext 分配的指针

    lr_save_searched_string

    在缓冲区中搜索字符串实例,并相对于该字符串实例,将该缓冲区的一部分保存到参数中

    lr_debug_message

    将调试信息发送到输出窗口

    lr_error_message

    将错误消息发送到输出窗口

    lr_get_debug_message

    检索当前消息类

    lr_log_message

    将消息发送到日志文件

    lr_output_message

    将消息发送到输出窗口

    lr_set_debug_message

    设置调试消息类

    lr_vuser_status_message

    生成带格式的输出,并将其写到 ControllerVuser 状态区域

    lr_message

    将消息发送到 Vuser 日志和输出窗口

    lr_load_dll

    加载外部 DLL

    lr_peek_events

    指明可以暂停 Vuser 脚本执行的位置

    lr_think_time

    暂停脚本的执行,以模拟思考时间(实际用户在操作之间暂停以进行思考的时间)

    lr_continue_on_error

    指定处理错误的方法

    lr_continue_on_error (0);lr_continue_on_error (1);

    lr_rendezvous

    在 Vuser 脚本中设置集合点

    TE_wait_cursor

    等待光标出现在终端窗口的指定位置

    TE_wait_silent

    等待客户端应用程序在指定秒数内处于静默状态

    TE_wait_sync

    等待系统从 X-SYSTEM 或输入禁止模式返回

    TE_wait_text

    等待字符串出现在指定位置

    TE_wait_sync_transaction

    记录系统在最近的 X SYSTEM 模式下保持的时间

     

    WEB函数列表:

    web_custom_request

    允许您使用 HTTP 支持的任何方法来创建自定义 HTTP 请求

    web_image

    在定义的图像上模拟鼠标单击

    web_link

    在定义的文本链接上模拟鼠标单击

    web_submit_data

    执行“无条件”或“无上下文”的表单

    web_submit_form

    模拟表单的提交

    web_url

    加载由“URL”属性指定的 URL

    web_set_certificate

    使 Vuser 使用在 Internet Explorer 注册表中列出的特定证书

    web_set_certificate_ex

    指定证书和密钥文件的位置和格式信息

    web_set_user

    指定 Web 服务器的登录字符串和密码,用于 Web 服务器上已验证用户身份的区域

    web_cache_cleanup

    清除缓存模拟程序的内容

    web_find

    在 HTML 页内搜索指定的文本字符串

    web_global_verification

    在所有后面的 HTTP 请求中搜索文本字符串

    web_image_check

    验证指定的图像是否存在于 HTML页内

    web_reg_find

    在后面的 HTTP 请求中注册对 HTML源或原始缓冲区中文本字符串的搜索

    web_disable_keep_alive

    禁用 Keep-Alive HTTP 连接

    web_enable_keep_alive

    启用 Keep-Alive HTTP 连接

    web_set_connections_limit

    设置 Vuser 在运行脚本时可以同时打开连接的最大数目

    web_concurrent_end

    标记并发组的结束

    web_concurrent_start

    标记并发组的开始

    web_add_cookie

    添加新的 Cookie 或修改现有的 Cookie

    web_cleanup_cookies

    删除当前由 Vuser 存储的所有 Cookie

    web_remove_cookie

    删除指定的 Cookie

    web_create_html_param

    将 HTML 页上的动态信息保存到参数中。(LR 6.5 及更低版本)

    web_create_html_param_ex

    基于包含在 HTML 页内的动态信息创建参数(使用嵌入边界)(LR 6.5 及更低版本)。

    web_reg_save_param

    基于包含在 HTML 页内的动态信息创建参数(不使用嵌入边界)

    web_set_max_html_param_len

    设置已检索的动态 HTML 信息的最大长度

    web_add_filter

    设置在下载时包括或排除 URL 的条件

    web_add_auto_filter

    设置在下载时包括或排除 URL 的条件

    web_remove_auto_filter

    禁用对下载内容的筛选

    web_add_auto_header

    向所有后面的 HTTP 请求中添加自定义标头

    web_add_header

    向下一个 HTTP 请求中添加自定义标头

    web_cleanup_auto_headers

    停止向后面的 HTTP 请求中添加自定义标头

    web_remove_auto_header

    停止向后面的 HTTP 请求中添加特定的标头

    web_revert_auto_header

    停止向后面的 HTTP 请求中添加特定的标头,但是生成隐性标头

    web_save_header

    将请求和响应标头保存到变量中

    web_set_proxy

    指定将所有后面的 HTTP 请求定向到指定的代理服务器

    web_set_proxy_bypass

    指定 Vuser 直接访问(即不通过指定的代理服务器访问)的服务器列表

    web_set_proxy_bypass_local

    指定 Vuser 对于本地 (Intranet) 地址是否应该避开代理服务器

    web_set_secure_proxy

    指定将所有后面的 HTTP 请求定向到服务器

    web_set_max_retries

    设置操作步骤的最大重试次数

    web_set_timeout

    指定 Vuser 等待执行指定任务的最长时间

    web_convert_param

    将 HTML 参数转换成 URL 或纯文本

    web_get_int_property

    返回有关上一个 HTTP 请求的特定信息

    web_report_data_point

    指定数据点并将其添加到测试结果中

    web_set_option

    在非 HTML 资源的编码、重定向和下载区域中设置 Web 选项

    web_set_sockets_option

    设置套接字的选项

Open Toolbar