赞
踩
Apache JMeter
是一款纯java编写负载功能测试和性能测试开源工具软件。作为一个负责任的后端开发人员,联调前需要充分自测,我使用jmeter主要用来生成测试数据,当然它的主业是进行性能测试。
运行环境是Windows 10操作系统,JDK版本是1.8,jmeter版本是5.2.1,数据库是PostgreSQL12。
apache-jmeter
需要安装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.官网下载地址: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:
这里用到的是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目录中:
官网是最好的参考文档:https://jmeter.apache.org/usermanual/build-db-test-plan.html
打开Jmeter后的界面:
切换成中文界面Options–Choose Language–Chinese(Simplofied):
如果之前没有将驱动包拷贝到jmeter解压路径的/lib/ext
目录下,可以在测试计划
下选择驱动包路径。
点击浏览
选择相应的驱动jar包:
右键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.
右键线程组–添加–配置元件–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):
(3)DateBase URL:数据库连接的访问地址
(4)JDBC Driver class:数据库连接驱动程序类
对于Database URL和JDBC Driver class 不同的数据的链接和驱动类是不同的,官网上给了一些参考示例(部分):
(5)Username:数据库的用户名
(6)Password:用户名的密码
点击保存后,当前线程组配置默认保存在当前/bin
目录下。
右键线程组–添加–前置处理器–用户参数:
添加变量,名称列为数据库表中对应字段,为了便于区分辨认,这里写成和字段一样的变量名:
单击面板底部添加用户
按钮(也可以只用一个用户),然后在新添加的列中填写所需的值,变量值可以通过函数助手自动生成:
(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
字段随机选择自定义的变量。
右键线程组–添加–配置元件–计数器:
配置计数器的各个值:
计数器使用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 ” 值)。如果选中,则每个用户都有一个独立的计数器。
右键线程组–添加–配置元件–用户定义的变量:
配置需要定义的变量,见红框内:
用户参数
使用函数助手,根据变量的属性,选择对应的函数,生成需要的值:
说明:
(1)这里添加了两个用户,用以配置生成不同的变量值(我这里为了方便,两个用户的variable就写成一样的了),官网的介绍:
(2)每次迭代更新一次
是什么意思呢?官网的解释是:
(3)函数的初次使用可能要花一些时间掌握它们的准确用法。
JDBC Request
和监听器
右键线程组–添加–取样器–JDBC Request:
我这里加了四个Request分别进行增删改查的演示。
添加监听器展示结果,比如“察看结果树”、“聚合报告”、“断言结果”等监听器:
我们想生成6条数据,采用两条线程循环3次的方式:
(1)Query Type的选择
官网上只做了简单的介绍:
由于在使用过程中由于Query Type的选择问题走了一些弯路,因此在此把他们的区别区分一下。
JDBC是Java编程中用于操作数据库的API,这些Type是JDBC中的接口,叫做JDBC的执行对象,执行对象是sql的执行者。
(最后五个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了。
将原先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的执行状态,还需要确认数据库数据是否真的改变)
成功案例1:
成功案例2:
成功案例3:
(不光要看jmeter的执行状态,还需要确认数据库数据是否真的改变)
(1)当使用Select Statement
语句查询时,成功:
失败并报错Multiple ResultSets were returned by the query.
(搞不懂…):
(2)当使用Prapared Select Statement
语句查询时,成功:
失败并报错Multiple ResultSets were returned by the query.
(搞不懂…):
(3)当使用Callable Statement
语句查询时暂未发现查询会失败的情况。
将id为17的数据sal改为999,删除id为23的数据:
执行成功:
(不光要看jmeter的执行状态,还需要确认数据库数据是否真的改变)
<完>
欢迎大家留言点赞、交流探讨,不足之处欢迎批评指正,谢谢~
1、https://jmeter.apache.org/usermanual/get-started.html
2、Why I’m getting an error informing that “a result was not expected” when executing stored procedures on PostgreSQL from Java in a batch?
3、PostgreSQL 7.4.30 Documentation
4、【转】 JMeter学习(十六)JMeter函数学习
5、Problem inserting String into postgresql.
6、Java Code Examples for org.postgresql.util.PSQLState.WRONG_OBJECT_TYPE
7、聊聊jdbc statement的fetchSize
8、【Jmeter】——Update Statement & Callable Statement & Select Statement 分析
9、Statement, PreparedStatement和CallableStatement的区别
10、执行对象Statement、PreparedStatement和CallableStatement详解 JDBC简介(五)
11、JMeter性能测试,完整入门篇
12、Jmeter操作mysql数据库测试
13、jmeter配置发送postgresql JDBC请求
14、Jmeter直连postgresql数据库进行压测
15、使用jmeter来造数据
16、如何使用Jmeter造数据
17、Jmeter制造测试数据
18、jmeter简单总结(六)jdbc中的database url怎么写
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。