Jmeter-postgresql制造测试数据
原文链接:https://blog.csdn.net/u010250240/article/details/105118742/
Apache JMeter
是一款纯java编写负载功能测试和性能测试开源工具软件。作为一个负责任的后端开发人员,联调前需要充分自测,我使用jmeter主要用来生成测试数据,当然它的主业是进行性能测试。
运行环境是Windows 10操作系统,JDK版本是1.8,jmeter版本是5.2.1,数据库是PostgreSQL12。
1. 下载安装apache-jmeter
1.1 安装JDK
需要安装JDK1.8版本并配置好环境变量。
1.官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
2.往下拉找到Java SE 8u241
,在Oracle JDK
下下载JDK Download
3.配置环境变量
4.在cmd下测试是否安装完成
1.2 安装Jmeter
1.官网下载地址:https://jmeter.apache.org/download_jmeter.cgi
2.选择apache-jmeter-5.2.1.zip
下载
3.下载完成解压zip包
4.启动jmeter:
双击jmeter解压路径(apache-jmeter-5.2.1\bin)bin下的jmeter.bat
就可以启动jmeter:
1.3 下载数据库驱动包
这里用到的是pgsql数据库,Jmeter需要使用JDBC功能,因此要下载对应的pgsql数据库驱动包,并将下载好的jar包放到jmeter的解压路径下lib下的ext目录中。
postgres的驱动包下载地址:https://jdbc.postgresql.org/download.html,需要根据自己的java版本选择对应版本的JDBC。
比如我现在使用的是jdk1.8
,所以就选择JDBC 4.2
中的42.2.11
版本;
下载至jmeter解压路径下的lib下的ext目录中:
2. 使用JMeter
官网是最好的参考文档:https://jmeter.apache.org/usermanual/build-db-test-plan.html
打开Jmeter后的界面:
切换成中文界面Options–Choose Language–Chinese(Simplofied):
如果之前没有将驱动包拷贝到jmeter解压路径的/lib/ext
目录下,可以在测试计划
下选择驱动包路径。
点击浏览
选择相应的驱动jar包:
2.1 添加线程组
右键TestPlan- 添加- 线程(用户)- 线程组:
配置好线程组名称、线程数、启动时间(此属性告诉JMeter启动每个用户之间要延迟多长时间)、迭代次数(该属性告诉JMeter重复几次测试):
官网上关于启动时间
的详细介绍(了解即可):
In the next field, the Ramp-Up Period, leave the value of 10 seconds. This property tells JMeter how long to delay between starting each user. For example, if you enter a Ramp-Up Period of 10 seconds, JMeter will finish starting all of your users by the end of the 10 seconds. So, if we have 50 users and a 10 second Ramp-Up Period, then the delay between starting users would be 200 milliseconds (10 seconds / 50 users = 0.2 second per user). If you set the value to 0, then JMeter will immediately start all of your users.
2.2 添加JDBC连接配置
右键线程组–添加–配置元件–JDBC Connection Configuration
:
配置好名称
、Variable name for created pool
、DateBase URL
、JDBC Driver class
、Username
、Password
等:
这部分的参数设置均能在官网找到详细的解释说明。
说明(部分选自参考资料):
(1)Variable name for created pool:创建池的变量名。必填项,需要自定义变量名,这里定义的变量名会被之后的jdbc请求引用,以此来判断请求使用的是哪个配置元件所定义的数据库配置,所以要和后面添加的JDBC Request
的Variable Name Bound to Pool
下的Variable Name
保持一致。如果不填运行后会报错Variable Name must not be empty for element:JDBC Connection Configuration
。
(2)Validation Query:非必填项,用来验证数据库连接的有效性。不同的数据库,所选择的Validation Query是不同的,具体可参照以下(postgresql选select 1):
- hsqldb - select 1 from INFORMATION_SCHEMA.SYSTEM_USERS
- Oracle - select 1 from dual
- DB2 - select 1 from sysibm.sysdummy1
- mysql - select 1
- microsoft SQL Server - select 1 (tested on SQL-Server 9.0, 10.5 [2008])
- postgresql - select 1
- ingres - select 1
- derby - values 1
- H2 - select 1
- Firebird - select 1 from rdb$database
(3)DateBase URL:数据库连接的访问地址
(4)JDBC Driver class:数据库连接驱动程序类
对于Database URL和JDBC Driver class 不同的数据的链接和驱动类是不同的,官网上给了一些参考示例(部分):
(5)Username:数据库的用户名
(6)Password:用户名的密码
点击保存后,当前线程组配置默认保存在当前/bin
目录下。
2.3 添加用户参数
右键线程组–添加–前置处理器–用户参数:
添加变量,名称列为数据库表中对应字段,为了便于区分辨认,这里写成和字段一样的变量名:
单击面板底部添加用户
按钮(也可以只用一个用户),然后在新添加的列中填写所需的值,变量值可以通过函数助手自动生成:
(1)由于数据库的主键id被设置成了自增序列,并且已经存在了14条数据,所以后面插入的值不能重复,也就是不能小于14,因此这里的变量id要由计数器生成。
为什么不用_counter函数?
因为_counter函数生成的数字都是从1开始的,
插入的时候会出现主键冲突的问题,导致报错:ERROR: duplicate key value violates unique constraint "employee_pkey" Detail: Key (id)=(4) already exists.
。计数器可以设置起始值,从而避免这个问题。
(2)需要添加自定义变量,用于job
、depaerment_no
字段随机选择自定义的变量。
2.4 添加计数器
右键线程组–添加–配置元件–计数器:
配置计数器的各个值:
计数器使用long来存储值,因此范围是-2 ^ 63到2 ^ 63-1。
说明(form官网):
(1)名称和注释就不过多说明了
(2)Starting value:计数器的起始值。在第一次迭代期间,计数器将等于该值(默认为0)。
(3)递增:每次迭代后计数器增加多少(默认为0,表示不增加)。
(4)Maxinum value:如果计数器超过设置的最大值,则将其重置为起始值。预设为Long.MAX_VALUE
(5)数字格式:可选的格式,如000会格式化为001,002,等它传递给DecimalFormat的,所以任何有效的格式都可以使用。如果解释格式存在问题,则将其忽略。[默认格式是使用Long.toString()生成的]。
(6)引用名称:即导出的变量名称,在该变量名称下计数器值可用。如果将其命名为counterA,则可以 按照用户定义的值中的说明使用$ {counterA}来访问它。
(7)迭代重置勾选框:换句话说,这是全局计数器,还是每个用户都有自己的计数器?如果未选中,则计数器为全局计数器(即,用户#1 在第一次迭代中将获得值“ 1 ”,而用户#2将获得“ 2 ” 值)。如果选中,则每个用户都有一个独立的计数器。
2.5 添加用户定义的变量
右键线程组–添加–配置元件–用户定义的变量:
配置需要定义的变量,见红框内:
2.6 继续配置用户参数
使用函数助手,根据变量的属性,选择对应的函数,生成需要的值:
说明:
(1)这里添加了两个用户,用以配置生成不同的变量值(我这里为了方便,两个用户的variable就写成一样的了),官网的介绍:
(2)每次迭代更新一次
是什么意思呢?官网的解释是:
(3)函数的初次使用可能要花一些时间掌握它们的准确用法。
2.7 添加JDBC Request
和监听器
右键线程组–添加–取样器–JDBC Request:
我这里加了四个Request分别进行增删改查的演示。
添加监听器展示结果,比如“察看结果树”、“聚合报告”、“断言结果”等监听器:
2.7.1 修改线程数
我们想生成6条数据,采用两条线程循环3次的方式:
2.7.2 添加数据
(1)Query Type的选择
官网上只做了简单的介绍:
由于在使用过程中由于Query Type的选择问题走了一些弯路,因此在此把他们的区别区分一下。
JDBC是Java编程中用于操作数据库的API,这些Type是JDBC中的接口,叫做JDBC的执行对象,执行对象是sql的执行者。
- Select Statement:查询语句,测试发现仅支持select语句,并且一次只能测一条。
- Update Statement:修改语句。update、insert和delete的sql语句均可以使用,且可以同时测试多个非select语句,比如同时测试一条insert语句和delete语句。如果其中夹杂select语句,自动忽略;如果多条语句的第一条为select语句,会报错。
- Callable Statement:可调用的语句。只要语法正确,任何语句,任何条数都支持。CallableStatement接口添加了调用数据库中存储过程的函数,以及处理输出参数的方法。
- Prepared Select Statement:预编译的查询语句。PreparedStatement表示预编译的SQL语句的对象,用于执行带参数的预编译的SQL语句。
- Prepared Update Statement:预编译的修改语句
- Commit:提交
- Rollback:回滚
- Autocommit(false):不自动提交
- Autocommit(true):自动提交
- Edit:编辑
(最后五个Query Type如何使用我就不清楚了,看到此文的朋友请指教)
(2)这里的Variable Name Bound to Pool
绑定的池的变量名就是JDBC连接配置中声明的池的变量名:
两者要一致才能正确连接到数据库,否则会报这个错:No pool found named: 'sss', ensure Variable Name matches Variable Name of JDBC Connection Configuration
(3)Query Type
选择Update Statement
、Callable Statement
、Prepared Update Statement
都可以。编写sql语句要注意的是:
- 参数化的字段要用
${}
来引用 - 字段为非整数型要用 ‘’ 括起来
如果参数化的字段没用${}
引用会直接赋值所写的变量,诸如下面的错:ERROR: column "create_user_id" does not exist Hint: There is a column named "create_user_id" in table "employee", but it cannot be referenced from this part of the query. Position: 178
(4)启动运行
(5)察看结果树,成功插入六条数据(其实是失败了好多次==)
再到数据库查看是否增加了六条数据,原先是14条数据现在应该是20条:
到此批量添加数据OK了。
2.7.3 删除数据
将原先insertData
的JDBC Request
禁用:
启用deleteData
:
配置参数:JDBC Connection Configuration
和JDBC Requeat
绑定的池变量名要一致(后面不再重复):
先列举一个执行失败的写法:
会报如下错误:ERROR: syntax error at or near ","
或者ERROR: syntax error at or near ")"
、或者number of arguments (3) and number of types (1) are not equal
等,原因就是带参数的执行语句要选择预编译的语句。
执行带参的delete语句时Query Type
要选择Prepared Update Statement
或者Callable Statement
,执行后查看结果树:
(不光要看jmeter的执行状态,还需要确认数据库数据是否真的改变)
2.7.4 修改数据
成功案例1:
成功案例2:
成功案例3:
(不光要看jmeter的执行状态,还需要确认数据库数据是否真的改变)
2.7.5 查询数据
(1)当使用Select Statement
语句查询时,成功:
失败并报错Multiple ResultSets were returned by the query.
(搞不懂…):
(2)当使用Prapared Select Statement
语句查询时,成功:
失败并报错Multiple ResultSets were returned by the query.
(搞不懂…):
(3)当使用Callable Statement
语句查询时暂未发现查询会失败的情况。
2.7.6 执行多条sql语句
将id为17的数据sal改为999,删除id为23的数据:
执行成功:
(不光要看jmeter的执行状态,还需要确认数据库数据是否真的改变)
3. 总结
- 如果添加的数据量小的话,使用jmeter生成测试数据没有直接写insert sql方便,不过生成大量的数据还是jmeter方便快捷。
- jmeter是一个很好的测试工具,更多使用功能还需要继续挖掘。