首页 > 代码库 > 【原创】LoadRunner Java Vuser脚本的配置和调试指南

【原创】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,并创建了一个表:

clip_image002

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

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

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

clip_image004

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

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

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

clip_image006

仔细排查安装目录下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)。如下图:

clip_image008

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

image

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

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

clip_image012

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

clip_image014

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

5.2.2 测试脚本介绍

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

clip_image016

先介绍一下脚本中与配置有关的部分,具体整个脚本的含义,大家可以参考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次):

clip_image018

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

clip_image020

直接点击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):

clip_image022

但是我们还是不能放过这个错误,要解决它。因为是非必现的问题,我们就要考虑整个场景中,哪些因素是可能根据时间和状态的不同发生动态变化的,这也是导致问题非必现的主因。大致可以推测出来,系统的资源和网络情况是最有可能动态变化的,我们优先考虑系统资源。这里的系统资源主要是数据库的资源了,数据库有两种重要资源: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.