JMeter测试JDBC应用的实例

项目基本背景

某游乐园为应对春节入园高峰,需对入园的闸机检票系统进行针对性的性能测试,然后依据测试结果对系统的软硬件等进行相应的调整。

 

此闸机检票系统是由国外开发团队基于Dephil开发并运行在Windows系统中的一个系统,有关于业务流程和业务逻辑并没有相应的文档进行说明。由于比较清楚此闸机系统是与数据库直连,所有的操作都是直接对数据库进行读写等操作,所以最终确定对该系统的性能测试主要就是对数据库的性能测试

测试基本流程

 工具的选取

01

目前针对JDBC应用进行性能测试的工具比较多,LoadRunner作为一款比较成功的商业软件,能通过VirtualUser Generator生成代理和虚拟用户来模拟业务流程和真正用户的操作行为,而且后期的数据处理和报表生成功能十分强大。JMeter作为一款开源软件,安装简单,不依赖于界面,脚本维护方便,作为性能测试工具功能比较完善。

 

就软件功能的优缺点而言,LoadRunner自然是最好的选择,但是LoadRunner免费版的只提供50Virtual User,无法满足客户需求,所以性能测试执行的工具还是选择了开源免费的JMeter。不过LoadRunner依旧可以作为我们脚本制作的辅助工具,比如抓取系统操作过程中调用的SQL语句。

 

此闸机检票系统有一个比较突出的特点是会跟一些外接硬件进行交互,在交互过程中也会执行一些SQL语句。由于LoadRunner自身的缺陷,导致系统与硬件交互时调用的SQL语句无法被抓取,此时必须使用DB TraceLoadRunner未抓取部分的SQL语句找到,填充到我们编辑的脚本中。

基本思路确定后,接下来就是将思路付诸行动

 

抓取并提取SQL语句

02

打开LoadRunner创建一个COM/DCOM协议的脚本

 


LoadRunner的录制功能中完成配置

 


开始录制后在检票系统中完成所有实际需要进行的操作,结束录制并等待记录生成

 


通过LoadRunner中的搜索功能搜索出所有的SQL语句,提取后按照先后顺序进行排列

 


然后通过DB Trace抓取LoadRunner未能抓取部分的SQL语句,将其整理到LoadRunner获得的SQL语句列表中去。至此我们已经获得了全部我们想要的SQL语句。

完成脚本的编写及调试

03

 前期已经已经确定了具体执行性能测试的工具是JMeter,接下来就是进行一系列的配置及将得到的SQL语句移植到JMeter脚本中。

 

首先添加数据库的配置文件并修改相应的参数


 

 

然后创建线程组,将得到的SQL语句按照先后顺序放到JDBC Request


 

最后提供相应的数据并运行,进行必要的调试

 


   JMeter脚本的一些情况说明

04

Q:脚本中有大量的JDBC Request,为什么不是将所有的SQL语句放到同一个Request中?

A:由于下边的SQL语句可能需要从上边的SQL语句中获取相应的值,所以需要分开并将上边SQL语句中得到的某些字段结果进行参数化处理。

 

Q:如何实现脚本中字段的参数化处理及传递?

A:首先在Variable names中对获得的不同的数据分别进行定义并命名,然后在后续的JDBC Request中使用


 

 

Q:进行参数化调用时为何需要加上“_1”

A:同一条SQL语句可能会搜索出多条记录,那么参数化后的字段名称会代表多个值,加上“_1”表示取这些值中的第一个。

 

QTimer加在JDBC Request内和外有什么区别?

ATimer加在JDBC Request外表示对所有的Request都起作用,每执行一个JDBC Request都会首先执行一次TimerTimer加在JDBC Request内表示只对当前Request起作用,执行当前的request时会首先执行一次Timer,不会对其他的Request有任何的影响。

 


 典型问题及解决办法

1. 问题:系统调取硬件执行指令部分的操作无法被LoadRunner捕获。

解决办法:尝试过使用软件来替代硬件的方式,仍旧无法解决。最后使用DB Trace获取相应的SQL语句来补全LoadRunner所缺失的那部分。

 

2. 问题JMeter脚本完成后无法成功运行并报错。

解决办法:根据报错的具体情况进行处理,很大的可能性是因为没有将sqlserverjar包放到JMeter文件夹的lib目录下。

 

3. 问题JMeter 脚本中只有一条SQL语句时是可以成功运行的,但是多条SQL语句就无法正常运行。

解决办法:在配置JDBC Connection Configuration文件时,Database URL中应当添加上“allowMultiQueries=true”

 

4. 问题:当一个JDBC Request中只有select语句时可以成功运行,但是含有其他类型的SQL语句时就无法成功运行。