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

bauul for 杭州软件测试圈 · March 18, 2018 · Last by bauul replied at March 22, 2018 · 2639 hits

使用的目的

主要是工作中作接口测试用例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 #2 · March 18, 2018 作者

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

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

bauul #4 · March 20, 2018 作者
卡斯 回复

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

bauul 回复

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

bauul #6 · March 20, 2018 作者
卡斯 回复

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

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

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

bauul #8 · March 20, 2018 作者
卡斯 回复

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

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

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

bauul #10 · March 22, 2018 作者
rockyrock 回复

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

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