在MeterSphere开源持续测试平台中调用Redis集群

发布于 2022年06月07日

编者注:本文转载自微信公众号“小博测试成长之路”,原标题为《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。