之前写过一个文档,使用LR通过JDBC测试数据库性能,但那个文档主要介绍的是在MyEclipse里编写类后,在LR中如何加载如何设置,此种方法有一定的局限性,例如把写好的类放在LR中调用,都是在action中调用类的所有方法,若方法中包含完整的建立连接和断开连接,每次迭代的时候就会不断重复这个操作,既耗费资源,又耗费时间,对于要求高并发的测试场景,显然不是最好的办法,因此重新考虑将java的脚本直接放在LR中进行编辑。

首先我们要明确一个问题,使用MyEclipse编写类的手段仍然是不可或缺的,因为LR在编写JAVA脚本时不能对其他脚本进行调用,如果需要外部方法,则必须通过引入jar的办法,所以如果LR脚本里需要其他类和方法的支持,就必须提前把这个class通过import的办法加载到这个脚本里。另外为了LR使用,必须使用J2EE而不能使用J2SE,因为虽然在验证效果上J2EE和J2SE都能体现java功能和数据连接,但是发布的时候,J2EE能够根据创建的包的层次,分别发布每一个class文件,而J2SE则会把所有的class发布在一个jar里。

接下来我们开始准备LR的编辑环境,当然脚本协议仍然是java vuser,


 

1.      准备编辑环境

a)      引入lrapi.jar

打开编辑器之后,为了能有更多的java编辑提示和引用提示,需要导入一个jar包。方法是,找到lr系统安装目录下的classes目录,(%loadrunner%\classes),里面有一个lrapi目录,把这个目录完整复制到j2se的一个项目里,然后把这个j2se工程发布成一个jar包,最后再把这个jar包import到LR脚本中。




其他需要的jar包,例如jdbc等,根据需要同样引入到环境中。

a)      调整jvm参数

由于需要大量运行java程序,所以为了避免出现堆错误和内存溢出,需要对jvm进行设置,根据运行位置的不同,共有3个地方需要添加jvm参数。

在系统运行,需要修改系统环境变量,增加一个系统环境变量JAVA_OPTS,如图:



 在lr脚本调试时,编辑“用户运行时”设置,如图:

注意选择指定的jdk(1.6)和添加VM参数,参数内容:

-Xmx512m -Xms512m -Xmn200m -XX:PermSize=64m-Xss128k


在编辑lr场景时,同样要设置ii的内容,如图:


注意如果如图,每个脚本都是独立的,需要每个脚本各自设置。

编辑的内容和脚本调试时一样。




2.      编辑脚本

由于是在LR的编辑器里编辑需要的内容,因此要充分发挥这个环境的特点,在这个Actions类中包含init(),action(),end()3个方法,而和普通的http协议一样,也是init()和end()只执行一遍,action()会根据场景设置不断循环迭代,因此为了提高执行效率减少jdbc连接断开所产生的资源消耗,可以把创建连接和断开连接写到init和end里,把具体的查询语句写到action里。


接下来我们具体讲如何在init里编写连接初始化,通过jdbc连接数据库实际上有两种办法,一个是使用DriverManager,一个是使用DataSource。

DriverManager:
Class.forName("");
conn= (Connection)DriverManager.getConnection("url","user","pass");
这里得到了conn属性,在action中所有的查询都是使用这个连接属性。
DataSource:
             PoolDataSource k =newPoolDataSource();
             k.setHostName("");
             k.setPort(1234);
             k.setDatabaseName("");
             k.setUser("user");
             k.setPassword("pass");
//          k.setUrl("jdbc:url");
             k.setMaxActive(2);
             k.setMinIdle(1);
             k.setLoginTimeout(3000);
             PooledConnection pc =k.getPooledConnection();
             conn =(Connection)pc.getConnection();
同样也是得到conn属性,以上两种形式在init里任选一种即可。
 
 打开的conn要在end()中关闭, 


在action中调用conn执行操作,
statement= conn.prepareStatement("select * from table);
rs = (ResultSet)statement.executeQuery();
if(rs.next()){
                    System.out.println("select1 OK");
                }
                else{
                    System.out.println("select1 fail");
                }

通过自己写对rs的状态判断,获得输出内容。如果需要获得查询内容,则需要import外部jar包,存储数据对象的get方法和set方法。这里可以根据需要灵活增加。

以上为编辑脚本的基本方法,完成编辑后可先做单步调试,确保脚本编写正确。



3.      执行测试

执行测试的方法和其他LR性能测试的方法有太大区别,但是需要注意的是,这个场景必须选择以进程方式运行,否则使用线程方式会产生大量的错误。



以进程方式运行即可。

4.      需要注意

这种数据库性能测试方法需要注意的是,无论用哪个方式连接,都是在init中获得conn属性,而init每个脚本只会执行一次,因此每个脚本实际上只做了一次连接,若数据库会根据连接做某些判断,则这种方法无法模拟,次方法实际上脱离了中间件等网络应用环节,因此某些网络行为也无法模拟。

这种测试方法只是用于纯粹验证数据库执行操作时的性能情况,若数据库的执行需要网络中某些特定因素,则无法达到预期效果。