好玩的JAVA Vuser

 

好玩的JAVA Vuser

写在前面

今天很不幸,一个大堵车的日子,以前从四惠到减灾中心不到半个小时的路程走了快1个半小时,今天好冷,到了用户现场开始研究脚本的开发,先大概看了一下系统。基本上一个个C/S的系统,FatClient,客户端是一个用Java写的客户端,后面连接的是Oracle 10g数据库,没有应用服务器。用户在需求要求测试100用户并发。当我看到这个系统后,当时还在想,用户真是有点问题,这么个C/S的系统测试什么并发用户,这种测试出来问题,怎么评价,说是数据库的问题,还是程序的问题?到底测试点在哪里?我想这个系统开发方写的就是一个客户端,你非要让测试一个性能,有必要吗?要测试客户端的性能吗?那干嘛不做客户端的效率呢?感觉没啥意思,并且这个东西看起来脚本好像还不好开发,最起码我的一个工程师通过录制的方式做了好多种尝试都没有解决。无聊无奈,我这么想着。

开始分析

我告诫自己,不要抱怨客户,认真对待工作;好了开始分析,首先我想知道一下,客户端和服务器端采用了什么样的通信协议,我看了一下你台测试机,看看有没有数据包分析工具,结果没有找到,算了,先用LR,WinSocket脚本分析一下吧,启动了LR,录制了一个Socket脚本,我的天哪么多的数据,有好几百个Buf,我带开数据部分,看了看,没有什么头绪,不是常见的协议,有些内容可以显示,好像是一些Oracle的配置信息,传送了一些Select语句。顺便回放一下脚本吧看看能不能回放成功,抱着一点侥幸,要是能回放成功了,就用Socket搞了,对那些16进制的分析,我倒也不害怕。和可惜回访失败了,我不死心有录制了一个脚本,比较了一下两个脚本的数据字段,我彻底放弃了用Socket脚本的念头。不同的地方太多了,并且好像看不出来什么规律;我心里估算了一下时间,要是真的搞下去,今天能不能把脚本开发出来都不一定呢。今天就要测试结果,肯定来不急。你要是有足够的时间和足够的耐心我相信你能搞出来(我怕累算了)。

忽然想到客户端是JAVA开发的,并且我听我的工程师说,LR推荐的协议也是JAVA over HTTP,我想既然LR推荐了,我也尝试一下吧,看看是不是我的工程师哪里疏忽没有做出脚本来,开始我录制了一下,发现什么也没有录制下来,我了个去,这也太不给面子了吧,让我一点希望都没有了。这能难得到我,在录制设置中,做了一个端口映射,把所有的请求都映射到HTTP的80端口,在录制了一次,有点意思,给我生成了一个脚本,看看脚本吧,真能骗人,随便给我弄了几个自定义请求,玩我呢,我这么想着,还是放弃了这个协议。这不想写脚本,我这么想着,开始尝试Oracle的几个协议的脚本,可悲,连事件都录不下来,我在尝试一下JAVA的几个协义,结果都是悲崔的,哎,我这么想着,难道这个脚本我就写不出来了?

一上午就这么过去了,要中午吃饭了;在吃饭的路上我整理了一下上午的问题。首先我想了一下针对这种客户端如果对服务器作并发压力测试到底测到什么?我觉得可以是以下几点:

1)  SQL语句写的是否够优化;

2)  数据库设计在性能方面是否够理想;

3)  关键的字段是否进行了索引

4)  数据库的配置是否合理。

想明白这几点,我觉得我的脚本开发可以从以下几个方面入手:

1)  连接数据库;

2)  数据SQL语句访问

既然从这两个方面考虑,那么只要可以跟数据库建立好连接,再用系统引用的SQL语句进行查询就可以了,因此我考虑采用lr_db_connect ()函数连接数据库,采用:lr_db_executeSQLStatement 执行SQL语句。然后我通过Ethereal数据包分析工具分析数据的连接过程和执行的SQL语句。这样也许能够解决,这样想着我吃完了饭,饭吃的不错。

下午开始工作了,我尝试了一下上述的方法,结果我还是放弃了,要分析的数据太多了。单单Ethereal的数据就够我分析的。我觉得这样做太笨了。

我决定写程序了

   实在没办法了,我下定决心要写一个脚本出来,说句实在话我不是怕写程序,只是要想写一个JAVA Vuser的脚本必须分析客户端中的所有程序源码,但是可惜的是今天开发方的不在,我让他把源码给我也不行,所以我之前一直在用黑盒的方法处理,现在终于把我逼急了,我跟我的工程师说,把开发方的那个工程师给我叫过来,告诉他,要是不过来这个指标就不通过(呵呵,给他点颜色看看);这一招还很灵,开发方的人马上着急了,在北京的大北边开始往东南四环赶,(忽然感觉自己有点残忍了,呵呵);

开发JAVA Vuser脚本其实并复杂,关键是需要对客户端程序的开发非常了解,必须知道由那些类,类中有哪些方法和函数,这些方法和函数如何调用,说白了你需要把客户端的源码读一遍,理解了。要是在研发人员的帮助下就简单多了。开始脚本开发了按照以下步骤进行:

1)让你研发人员坐你旁边,打开她的开发环境;

2)准备好你的脚本开发环境,安装好JDK,配置好环境变量,当然要保障测试应用的客户端是可以正常启动和运行的。

3)规划你的脚本,选择需要开发的业务,比如:系统初始化、系统登录、数据查询、数据增加等等;

4)开始开发脚本,打开LR VUG,选择JAVA Vuser脚本,默认情况下是这样的:

import lrapi.lr;

public class Actions

{

public int init() throws Throwable {

           return 0;

}//end of init

public int action() throws Throwable {

           return 0;

}//end of action

public int end() throws Throwable {

           return 0;

}//end of end

}

5)  在Runtime-Setting中设置Classpath,将你客户端的那个JAR包加载进去;

6)  问你旁边的研发人员,你需要完成的业务需要调用的类和方法以及他们的路径,比如我这次测试过程中初始化需要调用的方法applySystemProperties()、createUserHomeDirSettings();和initConfig(),这几个方法分别存在对应目录的类文件中如下:

applySystemProperties():Org\executequery\ApplicationLauncher.class

createUserHomeDirSettings();:org\executequery.util\SystemResources.class

initConfig():org\imageinfo\config.gui\UserLoginPanel.class

因此写成脚本如下:

         lr.start_transaction ("初始化");

          org.executequery.ApplicationLauncher App = new org.executequery.ApplicationLauncher();

             App.applySystemProperties();

       org.executequery.util.SystemResources.createUserHomeDirSettings();

    org.imageinfo.config.gui.UserLoginPanel UserLogin=new org.imageinfo.config.gui.UserLoginPanel(new javax.swing.JDialog());

             UserLogin.initConfig();

             lr.end_transaction("初始化", lr.AUTO);

注意:这个脚本开发过程中研发人员的配合很重要,你要做的目的就是把你要仿真的业务搞清楚,然后请他来帮你找她程序的实现方式。

很快脚本开发完成了,这里注意几点:

1)  尽量采用在设置中加载JAR包的方式,同样也可以采用Import的方式加载,但是有点麻烦;

2)  研发人员一定要对自己的程序很清楚。

3)  注意动态类和静态类,动态类需要定义,静态类可以直接调用;

4)  在JAVA VUser模拟虚拟用户时,线程模拟,要比进行模拟效率高很多;具体区别大家可以做试验分析;

5)  如果采用多负载机施加压力,记得每天负载机的设置,要保证每台负载机都能具有完好的JAVA环境和客户环境,同时保证需要调用的JAR文件可以找到。

6)  完整脚本如下:


 

 

import javax.swing.JDialog;

//import JZProjects.org.imageinfo.config.gui.*;

//import JZProjects.org.imageinfo.config.parainit.*;

import lrapi.lr;

public class Actions

{

                  public int init() throws Throwable {

                   return 0;

         }//end of init

         public int action() throws Throwable {

            // PropertyInit.setConnection();

             lr.think_time(10);

             lr.start_transaction ("初始化");

             org.executequery.ApplicationLauncher App = new org.executequery.ApplicationLauncher();

             App.applySystemProperties();

            org.executequery.util.SystemResources.createUserHomeDirSettings();

org.imageinfo.config.gui.UserLoginPanel UserLogin=new org.imageinfo.config.gui.UserLoginPanel(new javax.swing.JDialog());

             UserLogin.initConfig();

             lr.end_transaction("初始化", lr.AUTO);

        //UserLogin.main(null);//调用登录界面

             lr.think_time(10);

        lr.start_transaction ("登录");

             org.imageinfo.config.gui.UserLoginPanel.userName="admin";

             //org.imageinfo.config.gui.UserLoginPanel.userPassword="admin";

             boolean CheckUser=UserLogin.CheckUserNameExist(); //检测用户名

             boolean CheckPass=UserLogin.CheckUser();//检测用户名密码

             lr.end_transaction("登录", lr.AUTO);

           lr.think_time(10);

        lr.start_transaction("查询");

             org.imageinfo.gui.panel.CommandManage Search= new org.imageinfo.gui.panel.Co mmandManage("DCDYGSJJQZTCLCPSJB");

                 Search.queryData();

             lr.end_transaction("查询", lr.AUTO);

                   return 0;

         }//end of action

         public int end() throws Throwable {

                   return 0;

         }//end of end

}

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值