Jmeter 作为当前非常受欢迎的接口测试和性能测试的工具,在企业中得到非常广泛的使用。而 Redis 作为缓存数据库,也在企业中得到普遍使用。
那如何使用 jmeter 来测试 Redis 数据库呢?今天我们就来讲一讲怎么使用 jmeter 来调用 Redis。
jmeter 准备
由于 jmeter 本身并没有带有 Redis 的测试入口,我们需要去安装 Redis 插件。
首先,我们下载 jmeter-plugins-manager-1.6.jar 文件,放到 jmeter 的 lib 的 ext 文件夹中,然后重启 jmeter。
然后,在‘选项’菜单下,点击‘plugin manager’,打开插件管理弹窗,选择‘Available Plugins’,在搜索框中,输入 Redis。
然后,选中‘Redis Data Set’,点击‘Apply Changes and Restart JMeter’
带自动下载后重启 jmeter。
然后,在 jmeter 的线程组上右键,添加 > 配置元件 > jp@gc - Redis Data Set
此时,已经可以通过 jmeter 配置连接 Redis 数据库了。
如果你已经有了 Redis 数据库,那你就直接可以在当前的界面中进行相关的配置;如果你还没有 Redis 数据库,就需要安装 Redis 数据库。
安装 Redis 数据库
安装 Redis 数据库的方法很多,那使用 docker 方式的安装,可能是最简单的。下面我就用 docker 的方式来安装 Redis 数据库。
docker run -itd --name jmeter-redis \
-p 6779:6379 \
daocloud.io/library/redis:3.2.8-alpine redis-server --appendonly yes
好了,现在有了 Redis 数据库,该往数据库里面插入一些数据了。
# 进入容器
docker exec -it jmeter-redis /bin/sh
# 命令模式,连接redis
redis-cli
# 插入列表数据
lpush course jmeter,loadruner
lpush course wrk,ab
lpush course locust,ngrinder
现在,Redis 数据库库中,已经有了一个列表 course,我们可以在 jmeter 中,获取它的数据。
jmeter 使用 Redis 数据
在 RedisDataSet 中配置相关信息:
- Data Configuration
- Redis key:Redis 中的 key,Redis 数据库中列表(有序数据)或集(无序数据)的名称
- Variable Names:由数据集导出到测试元素的变量的名称(设置取出来的 value 存放在哪个变量中)
- Delimiter:存储在 Redis 列表或集合中的行中使用的分隔符(取出的 value 有多个值时,变量名之间的分隔符)
- Date Sources Type:数据源类型,有 List、Set 两种选择
- Recycle data on Flase:数据是否重复使用
- Connection Configuration
- Redis server host:Redis 服务器 IP 地址
- Redis server port:Redis 服务端口
- Timeout for connect in ms:连接超时时间,默认 2000 ms
- Password for connection:连接 Redis 的密码
- Database:数据库名称,连接 Redis 的第几个数据库,默认为 0
- Redis Pool Configuration
字段 | 用法 | 默认值 |
minIdle | 至少有多少个处于空闲状态的 Redis 实例 | 0 |
maxIdle | 一个线程池最多有多少个处于空闲状态的 Redis 实例 | 10 |
maxActive | 控制一个 pool 可分配多少个 Redis 实例,通过 pool.getResource()来获取;如果赋值为-1,则表示不限制;如果 pool 已经分配了 maxActive 个 jedis 实例,则此时 pool 的状态就成 exhausted | 20 |
maxWait | 表示当 borrow 一个 Redis 实例时,最大的等待时间,如果超过等待时间,则直接抛出 JedisConnectionException | 30000 |
whenExhaustedAction | 表示当 pool 中的 Redis 实例都被 allocated 完时,pool 要采取的操作;默认有三种 WHEN_EXHAUSTED_FAIL(表示无 Redis 实例时,直接抛出 NoSuchElementException)、WHEN_EXHAUSTED_BLOCK(则表示阻塞住,或者达到 maxWait 时抛出 JedisConnectionException)、WHEN_EXHAUSTED_GROW(则表示新建一个 jedis 实例,也就说设置的 maxActive 无用) | GROW |
testOnBorrow | 在 borrow 一个 Redis 实例时,是否提前进行 alidate 操作;如果为 true,则得到的 Redis 实例均是可用的 | False |
testOnReturn | 在 return 给 pool 时,是否提前进行 validate 操作 | False |
testWhileIdle | 如果为 true,表示有一个 idle object evitor 线程对 idle object 进行扫描,如果 validate 失败,此 object 会被从 pool 中 drop 掉;这一项只有在 timeBetweenEvictionRunsMillis 大于 0 时才有意义 | False |
timeBetweenEvictionRunsMillis | 表示 idle object evitor 两次扫描之间要 sleep 的毫秒数 | 30000 |
numTestsPerEvictionRun | 表示 idle object evitor 每次扫描的最多的对象数 | 0 |
minEvictableIdleTimeMillis | 表示一个对象至少停留在 idle 状态的最短时间,然后才能被 idle object evitor 扫描并驱逐;这一项只有在 timeBetweenEvictionRunsMillis 大于 0 时才有意义 | 60000 |
softMinEvictableIdleTimeMillis | 在 minEvictableIdleTimeMillis 基础上,加入了至少 minIdle 个对象已经在 pool 里面了。如果为-1,evicted 不会根据 idle time 驱逐任何对象。如果 minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在 timeBetweenEvictionRunsMillis 大于 0 时才有意义 | 60000 |
接下来我们添加调试取样器,在名称中引用 Redis 变量名称。然后,线程组循环次数设置多次。
运行
我们看到,获得了 Redis 的数据。
jmeter 向 Redis 中写数据
上面呢,我们已经有讲到了,怎么来获取 Redis 数据库里面的数据?那接下来呢,我们给大家讲一下如何向 Redis 数据库里面写入数据。
首先,我们下载 jedis 的 jar 包, 把下载的包,放入 jmeter 的 lib 文件夹下,重启 jmeter,
然后,在 jmeter 中,新增一个线程组,添加‘jsr223 sampler’。
import redis.clients.jedis.Jedis;
Jedis jedis = new Jedis("81.69.228.171", 6679);
jedis.set("foo","bar");
String value = jedis.get("foo");
运行脚本
从 Redis 数据库中确认,数据已经入库。
好了,通过 jmeter 写入数据和获取数据的方法都讲了,你学会了吗?