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 poolDateBase URLJDBC Driver classUsernamePassword等:
在这里插入图片描述
这部分的参数设置均能在官网找到详细的解释说明。
说明(部分选自参考资料):
(1)Variable name for created pool:创建池的变量名。必填项,需要自定义变量名,这里定义的变量名会被之后的jdbc请求引用,以此来判断请求使用的是哪个配置元件所定义的数据库配置,所以要和后面添加的JDBC RequestVariable 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)需要添加自定义变量,用于jobdepaerment_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的选择
sql1sql2
官网上只做了简单的介绍:
在这里插入图片描述
由于在使用过程中由于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 StatementCallable StatementPrepared 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 删除数据

将原先insertDataJDBC Request禁用:
在这里插入图片描述
启用deleteData
在这里插入图片描述
配置参数:
在这里插入图片描述
JDBC Connection ConfigurationJDBC 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. 总结

    1. 如果添加的数据量小的话,使用jmeter生成测试数据没有直接写insert sql方便,不过生成大量的数据还是jmeter方便快捷。
    2. jmeter是一个很好的测试工具,更多使用功能还需要继续挖掘。
posted @ 2020-09-19 10:26  字符蹚浑水  阅读(771)  评论(0编辑  收藏  举报