编者注:本文转载自微信公众号 “小博测试成长之路”,原标题为《MeterSphere 教程:操作 Redis 集群》。
本文将分享在 MeterSphere 一站式开源持续测试平台中通过引用 Jar 包的方式来实现对 Redis 集群的操作。
虽然网上可以搜到现成的 BeanShell 连接 Redis 的脚本,但是如果每个人都在平台上去写一遍,会显得有些冗余。为了提升脚本的可复用性和可维护性,这里更推荐大家使用 MeterSphere 的 “引用第三方 Jar 包” 的功能。
■ Java 操作 Redis 的核心代码示例:
注:这里解释下脚本语言为什么用 Java 而不是 Python。由于 MeterSphere 开源持续测试平台目前是使用 Jython 去运行 Python 脚本,在安装了 redis-py-cluster 插件后,使用 Python 脚本时导入包会报错,可能存在不兼容的情况,所以这里我们选用了 Java 语言。
POM 文件导入 Jar 包:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
工具类示例如下:
package com.xxx.xxx;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.util.HashSet;
import java.util.Set;
public class RedisTools {
public static JedisCluster getRedisClient(String env) {
JedisCluster jedisCluster = null;
String redis_host = "xxxxxxxxx"; # 替换成Redis的集群地址
Jedis jedis = new Jedis("");
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(10);
config.setMinIdle(5);
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
# 在代码里面去写死对应环境的连接信息
if (env.toLowerCase() != "test") {
redis_host = "";
}
jedisClusterNode.add(new HostAndPort(redis_host, 6379));
jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, null, config);
return jedisCluster;
}
}
测试一下效果:
JedisCluster redis_client = RedisTools.getRedisClient("test");
System.out.println(redis_client.get("xxxx"));
System.out.println(redis_client.hgetAll("xxxx"));
Set query_result = redis_client.zrange("xxxxx", 0, -1);
接下来就是将代码打成 Jar 包,然后上传到 MeterSphere 平台上去进行调用。
打包的时候,要记得把相关的依赖包一起打包进去,POM 文件可以加入下面内容:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.xxx.xxx.Application</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
使用 mvn package 命令就可以打出一个 Jar 包。本次封装只做简单的处理,只提供一个返回测试环境已经连接 Redis 的对象。具体怎么操作 Redis,由对象自身直接去调用方法操作就行。
■ 在 MeterSphere 平台调用 Jar 包
调用之前,需要先将 Jar 包上传至 MeterSphere 平台:
■ Groovy 脚本调用 Jar 包中的脚本示例:
在 “项目设置 - 自定义代码片段” 中创建一个调用 Jar 包的方法,方便项目成员在测试场景中直接使用。
注:个人建议优先使用 Groovy 脚本调用封装好的 Jar 包,如果使用 BeanShell 脚本调用,容易出现错误,因此暂不推荐 BeanShell 脚本。
import com.xxx.xxx.RedisTools;
import redis.clients.jedis.JedisCluster;
JedisCluster redis_client = RedisTools.getRedisClient("test");
String result = redis_client.hgetAll("xxxxx").toString();
log.info(result);
■ 在 MeterSphere 平台的使用示例:
测试场景:进行接口测试时如何确保接口返回数据与 Redis 数据的一致性,这里我们将两者进行断言比较。
考虑到返回结果的断言,可能要同时校验多个字段的值,并且接口返回的值是 Redis 中的值。经过了复杂的处理,有可能通过 “相等” 或 “包含” 等简单规则无法满足断言需要。因此,可以考虑直接在后置脚本中进行断言,然后将断言结果保存到一个变量中,最后直接断言变量的结果是否符合预期就可以了。
import org.json.*;
import com.xxxx.xxxx.RedisTools; // 记得替换成自己封装的Jar包的包名
import redis.clients.jedis.JedisCluster;
//获取响应内容
String response_data = prev.getResponseDataAsString();
//创建一个JSONObject类型对象,将响应数据放进去
JSONObject data_obj=new JSONObject(response_data);
log.info("接口返回结果:==>"+data_obj);
var datas = data_obj.getAt("datas")
log.info(datas.toString())
//从预演的Redis中查询数据,与返回结果进行断言
JedisCluster redis_client = RedisTools.getRedisClient("test");
Set query_result = redis_client.zrange("redis key",0,-1)
log.info("redis中查询的返回结果:==>"+ query_result.toString());
List<String> list = new ArrayList<String>();
list.addAll(query_result);
String lastRow = list.get(list.size() - 1);
redis_client.close();
//开始对比接口返回结果与Redis中的值进行断言操作
Map assertMap = new HashMap();//定义一个空的Map集合存储断言的结果
log.info(assertMap.toString())
//对比fielda
compare_result_fielda = data_obj.getAt("fielda").toString().equals(lastRow.split(",")[0]);
if (!compare_result_fielda){
msg = data_obj.getAt("fielda") + "!=" + lastRow.split(",")[0];
assertMap.put("fielda",msg);
}
//对比fieldb,返回值与Redis中的精度不一致,转换为double后相减,判断结果是否为0.0
compare_result_fieldb = data_obj.getAt("fieldb").toDouble()-lastRow.split(",")[4].toDouble();
if (compare_result_fieldb != 0.0){
msg = data_obj.getAt("fieldb") + " != " + lastRow.split(",")[4];
assertMap.put("fieldb",msg);
}
// 将断言结果存到环境变量中
if(assertMap.size() == 0){
vars.put("result","null")
}else{
vars.put("result",assertMap.toString())
}
在查询到 Redis 中的数据后,大家可以根据自己的需求灵活使用。
以上便是使用 Java 实现连接 Redis 集群的操作,以及通过 MeterSphere 平台调用 Redis 集群的具体示例,希望能够给大家提供一些参考与帮助。
在线课堂
MeterSphere 一站式开源持续测试平台在线学习班开课啦!
MeterSphere“从入门到精通 “学习班课程为期三周,共计六课时,由 MeterSphere 解决方案架构师宋兵进行讲解与演示。完成两周学习后,通过结业认证考试的同学将会获得飞致云官方颁发的持续测试工程师(CTA)认证证书,优秀学员还将获得精美定制礼品。
感兴趣的同学可以进入链接网页了解详情:
https://lkh.h5.xeknow.com/s/fvhJT。