通用技术 [接口测试平台二期] 接口在线调试并缓存至 redis

bauul for 杭州软件测试圈 · 2018年03月18日 · 最后由 bauul 回复于 2018年03月22日 · 3282 次阅读

使用的目的

主要是工作中作接口测试用例 debug 时,有上下文依赖的用例在调试时,需要同时跑两条及以上的用例,
如果能在每次调单条用例的时候,把前面已经跑过的,而后面又对跑过的用例有依赖的,缓存住,就好了,
这时候就想到了 redis,可以把前面 debug 的用例的结果放到 redis,后面 debug 别的用例时,就取出来用。

用例 demo

{
      "afterSql": [
      ],
      "apiUrl": "http://app.jollytest.com/user/emailExists.do",
      "beforeSql": [
      ],
      "description": "1.0 Email是否存在",
      "method": "POST",
      "name": "APP2--/user/emailExists.do--20180109-1643",
      "requestContentType": "json",
      "requestParameters": {
        "email": "%%{<linuxTime>8}@jollytest.com"
      },
      "responseAsserts": [
        {
          "assertCondition": "is",
          "jsonPath": "$.messageType",
          "value": 0
        },
        {
          "assertCondition": "is",
          "jsonPath": "$.messageCode",
          "value": "0"
        }
      ],
      "responseCode": 200,
      "responseContentType": "json",
      "updateRequestParameters": [
      ]
    },
    {
      "afterSql": [
      ],
      "apiUrl": "http://app.jollytest.com/user/register.do",
      "beforeSql": [
      ],
      "description": "1.1 用户注册",
      "method": "POST",
      "name": "APP2--/user/register.do--20180202-1100",
      "requestContentType": "json",
      "requestParameters": {
        "userName": "17539911@jollytest.com",
        "password": "kkkkkk"
      },
      "responseAsserts": [
        {
          "assertCondition": "is",
          "jsonPath": "$.messageType",
          "value": 0
        },
        {
          "assertCondition": "is",
          "jsonPath": "$.messageCode",
          "value": "0"
        }
      ],
      "responseCode": 200,
      "responseContentType": "json",
      "updateRequestParameters": [
        {
          "localJsonPath": "$.userName",
          "referenceBodyType": "request",
          "referenceCaseName": "APP2--/user/emailExists.do--20180109-1643",
          "remoteJsonPath": "$.email"
        }
      ]
    }

环境安装

我安装在 centos 7 的机器上,具体步骤略

启动(基于 Redis 4.0.6 版本)

$ cd src
$ ./redis-server ../redis.conf

java 连接方法

pom 依赖

在 pom 文件中增加 redis 连接的 jar 包,就像连 mysql 可以使用 mysql-connector-java 的包一样,使用的版本是:2.9.0

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>${jedis.version}</version>
</dependency>

存取 key/value

public class RedisUtils {

    private static final Jedis jedis = new Jedis("127.0.0.1", 6379);

    private RedisUtils() {

    }

    public static Jedis getRedis() {
        return jedis;
    }

    public static void main(String[] args) {
        Jedis jedis = getRedis();
        log.debug(jedis.ping());

        jedis.set("a", "b");
        jedis.set("a", "c");

        System.out.println("" + jedis.del("a"));
    }
}

subscribe/unsubscribe

@Test
public void pushMsg() {
    RedisUtils.getRedis().publish("topic:clg.biz", "Hellow World2");
}

@Test
public void getMsg() {
    RedisUtils.getRedis().subscribe(new JedisPubSub() {
        @Override
        public void onMessage(String channel, String message) {
            System.out.println(message);
            super.onMessage(channel, message);
        }
    }, "topic:clg.biz");
}

发布订阅模式,了解一下,暂时还没有实际用到

问题

  • 比如在放 string 的时候,是直接放 string 呢,还是放 string 的 hashcode,md5 什么的作为 key?

比如有用例名:xxProject_xxFeature_xxTestObject,就是用例名可能比较长,用这个字符串的 hashcode 作 key 来存进去应该能减少空间

请教

大家在工作中是如何使用 redis 的?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 10 条回复 时间 点赞

脑洞好大,这样使用的具体场景是?看不大懂。

如果调试的时候,后面对前面有依赖的话,可以通过依赖声明(如 testng 的 depends )把 2 个用例连起来?

bauul #11 · 2018年03月18日 Author

嗯嗯,我更新了本文,得从以前的故事讲起了,用例是参数化的,执行器都是一个
接口测试用例参数化方案

用例依赖如果只是通过缓存机制进行的话应该会有问题的吧,例如 a 和 b 场景都共用了 1 条用例,正常是这条用例跑一个场景需要单独执行一次,不过执行后对应的数据库,环境等属性都有变化,你这个缓存能将执行这个用例各个环节的变化都记录吗

卡斯 回复

这个问题好,我可以改进一下,放入 redis 的时候,加入身份识别标志,不同的用户只能获取自己调试的用例的结果,这样不会对其他小伙伴在线调试产生影响

bauul 回复

这个是针对多用户的,其实还有一层就是单用户的时候,毕竟一个用例执行完后的状态我也指数据库方面也发生了变化,你用缓存也能记住这个变化并存贮到需要使用的时候再还原出来吗

卡斯 回复

不能,这个功能,主要为了方便调试上下文用例的时候使用的,比如第二条用例依赖第一条用例的请求或返回,依赖数据库的都是取数据库实时结果的,比如验证码。

然后你说的这个有没有实际的场景啊?如果有这样的场景,我可以再看看具体怎么做比较好

如果只是顺序的这种依赖的话 我觉得做缓存貌似没有必要吧 你这个是为了性能提升吗

卡斯 回复

主要是方便在线编辑用例的时候,可以在线调试下用例的正确性,接口测试平台

第一次看到 redis 这样得应用场景 还是很有想象力的 赞

—— 来自 TesterHome 官方 安卓客户端

rockyrock 回复

我是新手不会玩,纯靠自己瞎想,哈哈,讲讲你们怎么用 redis 的呢

bauul [接口测试平台二期] 批量数据支持 中提及了此贴 06月22日 11:15
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册