软件环境
软件名称 |
软件版本 |
说明 |
JMeter |
5.4.1 |
构造测试数据工具,建议使用最新版本 |
Java |
8 |
Java环境 |
Mysql |
5.7 |
数据库 |
mysql-connector-java-5.1.45-bin.jar |
5.1 |
数据库依赖包 |
系统 |
-- |
Windows/Linux均可 |
本文档已mysql数据库为例讲解,但不只限于mysql数据库,支持的数据库如下:
使用场景
场景名称 |
使用说明 |
单表数据构造 |
在jmeter中使用一个线程组运行即可 |
多表数据构造 |
在jmeter中使用多个线程组运行,每一个线程组配置不同的数据表 |
多表关联数据构造 |
关联字段可以使用同一个变量(把变量设设置为公共变量即可) |
本文档主要是针对单表插入数据进行说明
支持构造的数据类型
数据类型 |
解决方法 |
使用方法 |
ID自增 |
使用Jmeter 计数器组件 |
Id字段 |
随机整数 |
使用Jmeter random 函数 |
${__Random(10,20,)}生成10-20之间的随机整数 |
求和 |
使用 Jmeter intSum函数 |
${__intSum(10,5,sum)} 5+10的和 |
随机日期 |
使用 Jmeter RandomDate 函数 |
${__RandomDate(,1990-01-01,2021-12-31,,)},生成1990-01-01到2021-12-31的随机日期 |
随机字符串 |
使用 Jmeter RandomString 函数 |
${__RandomString(3,abcdefg)} 随机从abcdefg中生成长度为3的字符串 |
时间戳 |
使用 Jmeter Time函数 |
${__time(,)}默认为当前时间的时间戳,精确到毫秒1630398198008 |
字符串/数字加密 |
使用 Jmeter digest函数 |
${__digest(MD5,18910554406,,,)} 将字符串进行MD5加密:c49f00b92667a35c63708933384dad52 |
日期格式转换 |
使用 Jmeter dateTimeConvert函数 |
${__dateTimeConvert(20180112, yyyyMMdd,yyyy/MM/dd,)} 将20180112转换为2018/01/12 |
支持构造的数据类型
字段 |
解决方法 |
说明 |
判断两个数字/字符是否相等 |
使用 Jmeter if函数 |
|
多字段逻辑计算 |
使用 Jmeter jexl3函数 |
比如多个字段需要进行加减乘除计算 |
枚举值 |
使用 Jmeter CSV组件 |
比如:省份 |
字符串拼接 |
使用 Mysql CONCAT函数 |
CONCAT(“130",“434 ",“19901012 ", “6935") |
随机小数 |
使用Mysql random 函数 |
数据格式0.540444841180411 |
四舍五入 |
使用Mysql ROUND函数 |
ROUND(99.999999,2) 返回结果:99.99 |
UNIX时间戳 |
使用Mysql UNIX_TIMESTAMP()函数 |
精确到秒:1630399894 |
目前就整理了这么多,如果有需要可以在进行补充
自增ID_计数器组件
Starting value:给定计数器的起始值、初始值,第一次迭代时,会把该值赋给计数器
递增:每次迭代后,给计数器增加的值
Maximum value:计数器的最大值,如果超过最大值,重新设置为初始值(Start),默认的最大值为Long.MAX_VALUE,2^63-1(如果持续压测,建议最好不要设置最大值)
数字格式:可选格式,比如000,格式化为001,002
引用名称:用于控制在其它元素中引用该值,形式:$(id}
随机数_random 函数
random 函数返回一个介于给定最小值和最大值之间的随机数
属性 |
说明 |
是否必填 |
第一个参数 |
最小值 |
是 |
第二个参数 |
最大值 |
是 |
第三个三处 |
变量名称 |
否 |
例子:
${__Random(0,10,MYVAR)}
将返回 0到10之间的随机数,并将其结果存储在MYVAR变量中
求和_intSum 函数
intSum 函数可用于计算两个整数值的总和
属性 |
说明 |
是否必填 |
第一个参数 |
第一个 int 值 |
是 |
第二个参数 |
第二个 int 值 |
是 |
最后一个 |
用于重用此函数计算的值的引用名称。如果指定,引用名称必须至少包含一个非数字字符,否则它将被视为要添加的另一个 int 值。 |
否 |
例子:
${__intSum(2,5,MYVAR)}
将返回 7 (2+5) 并将结果存储在 MYVAR 变量中。所以${MYVAR}将等于 7。
随机日期_RandomDate 函数
RandomDate 函数返回位于给定开始日期和结束日期值之间的随机日期。
属性 |
说明 |
是否必填 |
第一个参数 |
时间格式(默认yyyy-MM-dd) |
否 |
第二个参数 |
开始日期,默认为现在 |
否 |
第三个参数 |
结束日期 |
必填 |
第四个参数 |
语言环境的字符串格式。语言代码必须小写。国家/地区代码必须大写。分隔符必须是下划线,例如en_EN |
否 |
第五个参数 |
要设置的变量名称 |
否 |
例子1:${__RandomDate(,,2050-07-08,,)}
将返回now和2050-07-08之间的随机日期。例如2039-06-21
例子2:${__RandomDate(dd MM yyyy,,08 07 2050,,)}
将返回一个带有自定义格式的随机日期,如04 03 2034
随机字符串_RandomString 函数
RandomString 函数使用要使用的字符中的字符返回长度随机的字符串
属性 |
说明 |
是否必填 |
第一个参数_长度 |
生成字符串的长度 |
是 |
第二个参数_要使用的字符串 |
生成字符串的范围 |
是 |
第三个参数_变量名 |
引用变量 |
否 |
例1:${__RandomString(5)}
将返回一个 5 个字符的随机字符串,该字符串可以是可读的,也可以是不可读的
例2:${__RandomString(10,abcdefg)}
将返回从abcdefg集合中选取的 10 个字符的随机字符串,例如cdbgdbeebd或adbfeggfad,...
例3:${__RandomString(6,a12zeczclk, MYVAR)}
将返回从a12zeczclk集合中选取的 6 个字符的随机字符串并将结果存储在MYVAR 中,MYVAR将包含像2z22ak或z11kce这样的字符串,...
时间_time 函数
time 函数以各种格式返回当前时间。
属性 |
说明 |
是否必填 |
第一个参数_格式 |
要传递给SimpleDateFormat的格式。该函数支持各种速记别名,如果省略,该函数返回自纪元以来的当前时间(以毫秒为单位)。 |
否 |
第二个参数_变量名 |
要设置的变量的名称。 |
否 |
时间速记名别名:
YMD = yyyyMMdd
HMS = HHmmss
YMDHMS = yyyyMMdd-HHmmss
可以通过设置适当的 JMeter 属性来更改默认值,例如 time.YMD=yyMMdd
例1:${__time(dd/MM/yyyy,)}
如果在 2018 年 1 月 21 日运行, 将返回21/01/2018
例2:${__time(YMD,)}
如果在 2018 年 1 月 21 日运行, 将返回20180121
例3:${__time()}
将以毫秒为单位返回时间1516540541624
加密_digest函数
time 函数返回特定散列算法中的加密值。
属性 |
说明 |
是否必填 |
第一个参数_算法 |
支持的加密算法如下:MD2,MD5,SHA-1,SHA-224,SHA-256,SHA-384,SHA-512 |
是 |
第二个参数 |
要加密的字符串 |
否 |
第三个参数 |
在加密字符串之后加入其他字符 |
|
第四个参数 |
结果默认为小写。选择 true 到大写结果。 |
|
第五个参数 |
变量名称 |
例1:${__digest(MD5,18910554406,,,)}
返回c49f00b92667a35c63708933384dad52
例2:${__digest(SHA-256, MD5,18910554406,,,)}
返回a3bc6900fe2b2fc5fa8a601a4a84e27a079bf2c581d485009bc5c00516729ac7
幻灯片13
日期格式转换_dateTimeConvert函数
__dateTimeConvert函数转换即在源格式转换成目标格式任选将结果存储在变量名的日期。
属性 |
说明 |
是否必填 |
第一个参数_日期字符串 |
要从源日期格式转换为目标日期格式的日期字符串。如果源日期格式为空,则可以在此处使用日期作为纪元时间 |
是 |
第二个参数_源日期格式 |
原始日期格式。如果为空,则日期字符串字段必须是纪元时间。 |
否 |
第三个参数_目标日期格式 |
新的日期格式 |
是 |
第四个参数 |
变量名称 |
否 |
例1:${__dateTimeConvert(01212018,MMddyyyy,dd/MM/yyyy,)}
返回21/01/2018
具有纪元时间值:1526574881000,
例2:${__dateTimeConvert(1526574881000,,dd/MM/yyyy HH:mm,)}
返回17/05/2018 16:34 UTC 时间(-Duser.timezone=GMT)
幻灯片14
字符串大小写转换_changeCase函数
change case 函数返回一个字符串值,该值已按照特定模式更改。结果可以选择保存在 JMeter 变量中。
属性 |
说明 |
是否必填 |
第一个参数 |
将更改大小写的字符串 |
是 |
第二个参数 |
用于更改大小写的模式,例如ab-CD eF: UPPER:结果为 AB-CD EF LOWER: 结果为 ab-cd ed |
否 |
第三个参数 |
变量名称 |
否 |
例1:${__changeCase(Avaro omnia desunt\, inopi pauca\, sapienti nihil,UPPER,)}
将回归AVARO OMNIA DESUNT、INOPI PAUCA、SAPIENTI NIHIL
例2:${__changeCase(LABOR OMNIA VINCIT IMPROBUS,LOWER,)}
将返回劳动omnia vincit improbus
幻灯片15
判断_if函数
if函数判断给定条件是否成立
属性 |
说明 |
是否必填 |
第一个参数 |
实际值 |
否 |
第二个参数 |
预期值 |
否 |
第三个参数 |
如果相当择返回的值 |
否 |
第四个参数 |
如果不相等返回的值 |
否 |
第五个参数 |
变量名称 |
否 |
例1 中文比较:${__if(中文,中文,true,false,)}
相等,所以返回 true
例2 字符串比较 :${__if(abc,abc,true,false,)}
相等,所以返回 true
例3 数字比较 : :${__if(1000,1000,true,false,)}
相等,所以返回 true
逻辑计算__jexl3函数
jexl 函数返回计算Commons JEXL 表达式的结果
属性 |
说明 |
是否必填 |
第一个参数 |
表达式,例如,6*(5+2) |
是 |
第二个参数 |
变量名称 |
否 |
例:
求两个数的平均值:
${__jexl3((100+80)/2,avg)}
枚举值_ CSV 数据文件设置 组件
字段说明:
1.文件名: 建议写文件的绝对路径
2.变量名称:多个变量用逗号隔开,第一个变量对应文件中的第一列,第二个变量对应的是第二列一次类推
3.忽略首行:根据实际情况选即可,如果文件中有标题就需要忽略首行
4.其他字段保持默认即可
5.变量引用:直接${prov}即可
字符串拼接__CONCAT函数
函数 |
说明 |
函数所属 |
示例 |
CONCAT(s1,s2...sn) |
字符串 s1,s2 等多个字符串合并为一个字符串 |
MySQL |
SELECT CONCAT("SQL ", "Runoob ", "Gooogle ", "Facebook") AS ConcatenatedString; |
例:身份证号拼接
SELECT CONCAT('130', '434', '19901012', '6935’)
CONCAT('131','434',${__dateTimeConvert(${var},yyyy-mm-dd,yyyymmdd,)},'6935')
结果:
130434199010126935
随机数__RAND函数
函数 |
说明 |
函数所属 |
示例 |
RAND() |
返回 0 到 1 的随机数 |
MySQL |
SELECT RAND() --0.93099315644334 |
例1:
SELECT RAND();
结果:
返回 0 到 1 的随机数
例2:
SELECT RAND() * 100;
结果:
返回100以内的随机数
幻灯片20
Mysql日期/时间数据类型
函数 |
说明 |
函数所属 |
示例 |
CURDATE() |
返回当前日期 |
MySQL |
SELECT CURDATE(); 返回结果:2021-08-24 |
CURRENT_TIME() |
返回当前时间 |
MySQL |
SELECT CURRENT_TIME(); 返回格式:16:44:08 |
CURRENT_TIMESTAMP() |
返回当前日期和时间 |
MySQL |
SELECT CURRENT_TIMESTAMP(); 返回格式:2021-08-24 16:45:33 |
ROUND() |
四舍五入 |
MySQL |
SELECT ROUND(99.999999,2); 返回结果:99.99 保留两位小数 |
UNIX_TIMESTAMP() |
默认返回当前时间的时间戳(秒) |
MySQL |
SELECT UNIX_TIMESTAMP() 返回:当前时间时间戳,格式1629855415 SELECT UNIX_TIMESTAMP('2015-11-13 10:20:19’); 返回:传入时间的时间戳 1447431619 |
JSON_OBJECT() |
评估键值对(可能为空)列表并返回包含这些对的 JSON 对象。如果任何键名称是NULL或参数数量是奇数,则会发生错误。 |
mysql |
SELECT JSON_OBJECT('id', 87, 'name', 'carrot’); 返回结果:{"id": 87, "name": "carrot"} |
多表关联
示例:从多个表中抽出部分字段合成一个新的数据表,现在以两个表为例进行说明
表1:学生表(student),数据如下:
表2:班级表(class),输入如下:
需求:要将student表中的stu_id,stu_name,gender三个字段和class表中的class_name字段抽取,并输出到一张新表(stu_class)中
多表关联
具体步骤如下:
1.添加输入表JDBC Request组件,并在组件中进行配置
多表关联
参数说明:
1).要添加的JDBC Request组件
2).Query Type:选择Select Statement
3).具体查询的SQL语句,查询的结果不要使用”*”,要写具体的字段
4).Variables names:将查询的结果存入定义的变量中,变量定义的顺序要跟SQL中查询结果的字段要一一对应,比如第一个变量对应的查询结果中的第一个字段,以此类推.
多表关联
2.创建输出表JDBC Request组件,并进行配置,见下图:
多表关联
上图参数说明:
1)Query Type:这里选择Update Statement(新增数据和修改数据都选择此项)
2)Query:这里输入插入数据的SQL语句,对应的字段为输入表JDBC Request组件中添加的变量,见上图
这里需要注意下,输入表JDBC Request组件中添加的变量不能够直接使用,需要配置V函数进行使用,使用格式为:${__V(stu_name_${num})}
函数中的stu_name为输入表JDBC Request组件中添加的变量,${num}为计数器组件中设置的引用变量名称,
当变量的值为1时${__V(stu_name_1)}代表stu_name名称列的第一条数据,当变量的值为2时${__V(stu_name_2)}代表stu_name名称列的第二条数据,以此类推
多表关联
3.输入和输出都配置好之后可以运行脚本并查看结果,将线程数设置成5,并执行脚本