【原创】LoadRunner Java Vuser脚本的配置和调试指南

1 编写目的


本文介绍了Loadrunner多负载压力机的配置,并通过测试Java
Vuser的数据库连接脚本对配置结果进行了验证,同时对配置过程中遇到的问题和解决的过程进行了记录,关于Java数据库编程的深入学习,大家可以参考其他Java相关教程。

文中的内容大部分来源于本人工作中解决问题的实际经验,另一部分来源于网络,所有内容本人都亲自验证,但难免有疏漏之处,如有疑问,请大家不吝赐教。

文中Loadrunner版本为9.5,操作系统类型为Windows XP和Windows 2003 Server,数据库为Oracle 10g。

2 测试场景介绍

本次我们使用四台负载压力机,其中一台仅作为统一调度管理和监控使用,其余三台作为产生负载的机器,测试的脚本和场景由调度监控所在机器管理。

测试脚本为Java脚本,脚本内容为Java连接Oralce数据库并向数据库内插入数据。所以我们不仅需要配置Loadrunner的环境,还需要进行Java和Oralce的配置,这也是我们介绍的主要内容,性能监控信息收集和分析不是本文的重点,将在后续的教程中陆续介绍。

3
Oracle数据库安装及配置

根据测试场景的要求,我们需要在四台机器上都安装Oracle。Oracle的具体安装过程比较简单,这里不做介绍。需要注意的是,Java连接Oracle时,需要提供驱动,即导入JDBC的jar包。否则执行脚本时会提示类似java.lang.ClassNotFoundException的异常信息。

JDBC全称是Java Data Base Connectivity,是一种用于执行SQL语句的Java
API。在数据库安装完成后,可以在C:\oracle\product\10.2.0\db_2\jdbc\lib目录下找到对应的jar包,Oracle
10g对应的JDBC驱动是ojdbc14.jar。

导入jar包可以通过在系统属性设置CLASSPATH环境变量的方式,也可以在Loadrunner的Run-time Settings中设置。

3.1 数据库连接调试

根据我们的测试需求,我们在管理机上创建了test数据库,用户名/密码为test/test,并创建了一个表:

下面我们测试数据库连接是否成功,首先使用PL/SQL Developer进行验证,这里之所以不使用Loadrunner Java
Vuser脚本直接验证,是因为脚本执行时还涉及Java运行环境及数据库驱动的配置检查,我们在验证数据库配置是否正确时,使用最简单的工具即可,这样当出现问题时,定位排查的方向比较单一,易于解决问题。

在四台机器上分别验证,由于管理机是数据库所在机器,所以首先验证管理机是否可以登录数据库。

使用PL/SQL Develop登录,提示“ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务”,如下图:

出现该提示,一般有两个排查方向,一是数据库的服务没有启动,二是tnsnames.ora文件中数据库test配置的服务名称有误。

我们首先检查服务是否启动,进入“计算机管理->服务和应用程序->服务”,查看与数据库test相关的服务:OracleServiceTEST确实没有启动,将其手动启动即可。再次使用PL/SQL
Develop登录成功。

接下来是三台负载压力机的数据库连接测试。三台机器都安装了PL/SQL
Developer,并且只安装了Oracle客户端,本地没有Oracle的服务需要启动。通过Oracle Net
Manager设置服务标识和监听程序后,启动PL/SQL
Developer进行连接测试。发现报错,提示“ORA-12170:TNS:连接超时”,如下图:

仔细排查安装目录下tnsnames.ora和listener.ora文件,发现配置没有问题,使用ping命令检查到管理机的连接也没有问题。通过之前的验证,确认管理机的数据库也没有问题。我们再仔细分析这个报错的含义,负载压力机尝试连接数据库,但是因为超时失败了,由于客户端连接远程数据库是通过网络服务承载的,所以推测问题还是出在网络访问上,关掉管理机的杀毒软件和防火墙,再次使用负载压力机上的PL/SQL
Developer连接,成功登录。

到这里我们可以知道,由于管理机的Windows防火墙默认对远程的数据库连接进行了屏蔽,所以造成了上述的问题,而管理机的防火墙ICMP设置中,并没有禁止ping请求,所以才会有可以ping通,但是连不上数据库的问题

4 Java运行环境配置

Java运行环境的配置可以参考《LoadRunner Java
Vuser开发环境配置指南》,这里不再赘述。同样,根据测试场景的要求,我们需要在四台机器上都安装Java运行环境。

5 Loadrunner多机负载场景


5.1 多机负载概述

在实际的性能测试中,单个压力机产生的负载是非常有限的。在之前的某管理系统的性能测试中,使用的负载压力机的硬件配置为目前的主流配置,在执行5000用户并发时,单机的操作系统已经出现假死机、应用程序无响应等现象,这时压力机模拟5000用户并发已经没有实际意义,此时采用多机产生负载就非常必要了。

多机负载是在多个负载压力机上安装Load generator,通过Remote Agent Dispatcher(Process)
和Agent组件在多个负载压力机上联合产生负载的测试方法。按照HP Loadrunner官方的文档中描述:Controller和Load
generator使用Agent进行通信,当我们运行一个场景时,Controller通知Remote Agent
Dispatcher进程启动Agent。Agent根据Controller的指令,对Vuser进行初始化、运行、暂停或停止操作,同时,Agent也会将Vuser的状态通知Controller。

5.2 多机负载配置


5.2.1 负载压力机配置

首先我们进行三个负载压力机的配置。三个负载压力机仅负责联合产生负载,如果没有其他特殊要求,可以只安装Load
Generator。运行Loadrunner安装文件,点击“Load Generator”安装即可(注意安装Loadrunner需要.Net
Framework3.5)。如下图:

安装完成可以看到,在LOAD GENERATOR的服务启动后,屏幕右下角的任务栏上会显示一个Loadrunner Agent
Service的图标。之后,分别登录三台负载机,进入程序->LoadRunner->Tools->LoadRunner Agent
Runtime Settings Configuration(LoadRunner代理运行时设置配置):

输入用户名和密码,单击[OK]。

下面我们进行管理机的配置,启动Loadrunner,点击Run Load Test,进入Controller界面,点击Scenario->Load
Generators,单击[Add],添加三台负载压力机的信息,包括主机名(或IP),选择Platform,填写Temporary
directory。这里要注意的是,临时目录必须要填写对应的负载压力机实际存在的路径,不推荐默认路径,否则后面执行场景时可能会因为路径不存在而报错。

添加完成后,单击[Connect],连接成功后,可以看到status变为Ready。

直到这里,负载压力机的配置初步完成,配置的过程非常顺利。下面的章节将介绍脚本调试和场景配置,我们会遇到各种各样的问题,解决问题是我们进步的最大动力。

5.2.2 测试脚本介绍

我们采用的脚本是Java语言编写的,脚本的功能是向Oracle插入数据。下面是测试脚本的action部分代码:

先介绍一下脚本中与配置有关的部分,具体整个脚本的含义,大家可以参考Java数据库编程的相关教程。

Class.forName("oracle.jdbc.driver.OracleDriver");表示加载数据库的驱动,根据我们的配置,这里加载的驱动来自ojdbc.jar,不同数据库的驱动也是不同的,并且有些软件的驱动是私有或经过封装的,具体的需要根据实际的项目情况来判断。

DriverManager.getConnection("jdbc:oracle:thin:@192.168.186.250:1521:test","test","test");表示连接数据库,其中“jdbc:oracle:thin:@192.168.186.250:1521:test”我们一般叫做数据库的URL,其中的test是数据库的service
name,后面两个test分别是访问数据库的用户名和密码。

5.2.3 测试脚本执行

数据库和Java运行环境的配置基本完成,我们可以执行测试脚本了,同之前的章节一样,我们首先使用管理机进行本机脚本运行调试。

启动Loadrunner,点击“Create/Edit Scripts”,打开已经编写好的Java
Vuser脚本,直接单击F5,运行该脚本,报错如下:Error: System.err: java.lang.ClassNotFoundException:
oracle.jdbc.driver.OracleDriver,这个错误信息的含义是无法找到某个类,在之前的《LoadRunner Java
Vuser开发环境配置指南》中我们见过类似的报错,一般的原因是CLASSPATH中没有配置我们需要加载的类(jar包)。根据3.1节的介绍,运行Run-time
Settings,发现我们没有加载JDBC驱动,即没有导入ojdbc.jar,将该包导入即可,或者通过修改系统的CLASSPATH变量,告诉Loadrunner在哪里可以加载到该驱动。

再次运行脚本,执行成功,查看数据库,成功的插入了3条数据(脚本设置迭代3次):

下面我们要建立测试场景,通过管理机调度负载压力机联合产生负载,验证各个压力机的脚本执行结果。

直接点击F5(Start
Scenario),执行完成后,提示如下几种错误(注意这些错误并不是一起出现的,这里为了便于讲解,将所有遇到的错误列出):

①Error: System.out: java.sql.SQLException: Io 异常: The Network Adapter could
not establish the connection

②Files transfer error: The file/directory C:\Documents and Settings\

Administrator\Local Settings\Temp\brr_YAR.29\netdir\c\documents and
settings

\tian_yu\local settings\temp\res19\192.168.186.5_10.map does not exist.

③Error: System.err: java.lang.ClassNotFoundException: oracle.jdbc.driver.

OracleDriver

我们来一个个的解决这些问题。

首先第一个问题,初步判断是网络问题。登录产生报错的负载压力机,使用PL/SQL登录数据库,提示“ORA-12170:TNS:连接超时”,这个报错我们并不陌生,在3.1节中遇到过,关闭管理机的防火墙,问题解决。

再看第二个问题。根据问题描述可以大致得出结论,是由于Temporary directory配置路径问题。回想在5.2.1中提到的Load
generator设置,其中有一步就是添加Temporary
directory,所以这里我们需要检查各个负载压力机的配置路径是否是存在并且有权限访问,经过测试,问题得到解决。

最后一个问题也见过,我们定位是数据库的驱动加载问题,但是有的负载压力机报错,有的不报错,这个是为什么呢?在管理机上我们已经加载了驱动,执行脚本是没有问题的。

仔细分析多负载压力机的运行原理(见5.1),我们知道各个负载压力机是由管理机的Controller统一进行管理的,负载压力机此时不会从本机的CLASSPATH获取到任何信息(即使安装了完整的Loadrunner),一切都是由Controller通过Agent与Load
generator进行通信的,所以当脚本执行到加载数据库驱动语句时,必然是按照管理机的CLASSPATH配置路径来加载驱动,但由于不同机器上的Oracle不是统一安装的,而且并不能保证每个压力机的Oracle安装路径完全相同,所以当负载压力机与管理机的驱动路径不一致时,就会提示上面最后一个错误信息。

那么该如何解决呢?两个办法,一是将所有的机器的Oracle安装在完全一致的路径下,这个操作比较麻烦,涉及卸载和重装Oracle。还有一个办法,就是按照管理机ojdbc14.jar所在的路径,在负载压力机上创建完全一致的目录结构,只将驱动放在该目录下即可,经过测试后该办法可行,问题得到解决。

目前已有的问题都解决了,我们再次运行场景。又报错了,提示:Listener refused the connection with the
following error:ORA-12519, TNS:no appropriate service handler found The
Connection descriptor used by the client
was…。但是查看运行结果,插入了118条数据,就是说我们离成功很近了,再接再厉。

经过之前错误排查和场景的运行结果的分析,我们推测这个错误可能不是必现的,果然再运行一次,没有报错,数据库里也插入了正确的数据(118+120):

但是我们还是不能放过这个错误,要解决它。因为是非必现的问题,我们就要考虑整个场景中,哪些因素是可能根据时间和状态的不同发生动态变化的,这也是导致问题非必现的主因。大致可以推测出来,系统的资源和网络情况是最有可能动态变化的,我们优先考虑系统资源。这里的系统资源主要是数据库的资源了,数据库有两种重要资源:session和process。通过命令查看session配置为170,process配置为150,并且考虑到各个压力机在之前的问题定位都打开了PL/SQL
Developer,它们在一定时间内占用了部分资源,场景也反复执行了多次,所以很可能是由于资源不足导致了上面的问题,我们将session和process的值都修改为500,并且关闭各个压力机上的PL/SQL
Developer软件,反复执行几次场景,未出现报错,数据库中也插入了正确的数据,至此,我们认为该问题目前已经得到了解决。

6 关于license

在之前的《LoadRunner Java Vuser开发环境配置指南》中提到过,调试Java Vuser脚本并不要求有Global
license,但是当运行场景时,需要提供Global license,否则会提示如下信息:“You do not have a license for
this Vuser type.Please contact HP Software to renew your
license.”所以,当进行非Web的测试时,license应该是我们首先要解决的问题。

7 总结

本文针对LoadRunner多负载压力机的环境配置及脚本调试做了介绍,在配置和脚本调试过程中可以看到,我们遇到了很多的问题。由于多负载压力机配置的本身涉及多个环境变量和多个软件的配置,有一定的复杂性,但是通过不断的排查和解决问题,我们最终完成了场景的配置和测试,这其中的收获还是非常大的,在后面的教程中,将继续通过实例介绍我们在实际工作中遇到的各种问题及定位解决的方法,大家一起学习,共同进步。

8 参考资料

[1]hp_man_LoadRunner11.00_ControllerUser_pdf,PDF page 37,HP LoadRunner Vuser
Technology.

时间: 2024-09-26 18:09:23

【原创】LoadRunner Java Vuser脚本的配置和调试指南的相关文章

Eclipse Tomcat配置/管理/调试指南

从myeclipse转到Eclipse最不方便的之一莫过于Web项目部署了,老是在想怎么不能把myeclipse的那个移植过来,或者有没有高人能按照Myeclipse开发一个,非常遗憾. 原版的Eclipse自带WTP,WTP本身的Web应用服务器管理功能还可以,但有些复杂. 要想把它用顺手,还要花点时间来学习一下.学会后还算方便的. 目前还未找到十分好用的Eclipse下的管理Tomcat的插件. 有一个老处于插件TomcatPlugin V321,只能管理一个Tomcat,数量上不够用. 所

LoadRunner JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题 .

JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题解决方法: 前提条件: 环境变量:正确的配置了JAVA_HOME,path正确的指明了JAVA_HOME的bin路径和LR的bin路径,classpath中指明了jdk的lib路径和LR的lib路径. 当前LoadRunner的版本是9.0版. 当前的JDK版本是1.7. 一.错误内容如下: 通知: Found jdk version: 1.7.0. [MsgId: M

loadrunner java协议脚本要点

常见问题 1. Error: Thread Context: Call to service of the driver failed, reason - thread context wasn't initialized on this thread.[MsgId: MERR-10176] 这个问题网上很多解答,感觉诱发的原因不一,我的问题是当时代码里有: package lr.test; 2. 关于loadrunner中使用ClassPathXmlApplicationContext的注意点

LoadRunner + java脚本 第一章

最近两天刚刚弄了loadRunner-java脚本编写,赶紧记下来别丢了 1.环境配置 LR12支持JDK1.7 LR11仅支持JDK1.6及以下版本 我使用的为LR11,现有两种方法使LR11支持java脚本 ①在电脑上安装JDK1.6(32位的),并将环境变量Java_HOME/CLASSPATH/PATH配置成JDK1.6的,具体配置方法请搜索百度‘JDK环境变量配置’ ②这种方法是解决电脑环境JDK1.7,而需要支持java脚本的情况, 首先安装32位JDK1.6,然后创建java Vu

LR之Java Vuser

虽然LR对C有较好的支持,但有时使用Java Vuser会更方便,以下描述通过LR来编写Java脚本以及调用jar包的基本步骤. 1.安装配置java环境  LR的java vuser脚本的执行依赖于脚本所在机器的java环境,LR并没有独立java运行环境,因此首先要在Vugen所在机器上安装java环境.特别注意:LR的不同版本对于JDK版本的支持是不同的. 环境说明: LoadRunner11:安装路径:C:\Program Files\HP\LoadRunner 平台:windows 7

老李分享:loadrunner的java user脚本开发

老李分享:loadrunner的java user脚本开发 poptest在性能测试loadrunner的课程里,以web协议为主,同时也讲解其他协议的脚本开发,对于一个性能测试工程师需要掌握一个以上的协议,在这里大家可以看看javauser的脚本开发环境如何搭建. 有对java比较熟悉的朋友,完全可以直接调用javauser来解析协议报文,处理逻辑请求. 脚本开发环境: loadrunner11.0 jdk1.6.32_x86_32 脚本开发 1.选择JavaVuser协议 2.配置java环

Loadrunner 11 中的Java Vuser

Java vuser是自定义的java虚拟用户脚本,脚本中可以使用标准的java语言. 1.安装jdk 注意,lr11最高支持jdk1.6 2.配置环境变量 3.在lr中选择java vuser协议 脚本结构设计原则: 在init中编写初始化脚本 在action中编写业务流程 在end中编写释放资源等收尾操作 适用范围: 1.不适合录制的业务功能点性能测试,如视频播放,http文件下载等. 2.利用java语言开发的应用系统

LoadRunner + java脚本 第三章

1.Java Vuser 模板脚本如下: /* * LoadRunner Java script. (Build: _build_number_) * * Script Description: * */ import java.util.HashMap; import com.Interface.FilmNews; import com.Interface.Plans; import com.vug.Vug; import lrapi.web; import lrapi.lr; public

【转】性能测试分享---java vuser协议(2)---LoadRunner篇

转自:http://blog.csdn.net/weiweicao0429/article/details/8941137 LoadRunner性能测试工具使用: 1.新建脚本,选择java vuser协议.初步结构是 [java] view plaincopyprint? import lrapi.lr; public class Actions { //在init方法里面编写一个虚拟用户循环只执行一次的方法,如可以把协商写在里面,就可以达到每个用户协商一次之后,就不再协商的效果 public