接口测试 如何实现异步转同步的接口测试?

醋精测试媛 · 2021年09月18日 · 最后由 陈恒捷 回复于 2021年09月22日 · 2849 次阅读

接口测试需求:
1.该接口为一个查询接口,先去缓存中搜索,如果缓存中存在相应结果,则返回
2.当在缓存中找不到相应的结果时,会通过 mqtt 发布一个报文 a 到客户端(a 中有 request_id)
3.客户端会将实时的结果通过另一个 mqtt 报文 b(b 中需要有 a 中的 request_id)到接口,然后接口返回该 结果

当发送请求到该接口,会有这样一个异步的过程,我需要测试这个过程,可以通过 phto-mqtt 发送和订阅 mqtt 请求,但是 request 请求发出去这是一个同步的过程,我无法在这个过程中完成 mqtt 发布和订阅操作。请问有什么办法可以实现这个接口的测试吗

共收到 6 条回复 时间 点赞

接口是同步的,内部实现是异步的?那内部返回结果的时候,不等异步结束?

感觉我没看懂问题……

标题没看懂,内容勉强看懂了。我理解这里没有任何的异步,都是同步,接口实际还是要等待 mqtt 返回报文后才会返回。建议楼主先了解下异步和同步的概念?

回到问题,你先明确你要测的是提供 mqtt 消息处理的那个服务的逻辑,还是接口自身的逻辑(比如先查缓存后发 mqtt,等到 mqtt 收到返回,接口才返回 response)?如果是前者,不管接口直接测就好。如果是后者,可以想办法监控 mqtt 的消息收发情况,然后确认这个收发情况是否符合逻辑。

之前我们测试 mq ,要验证某个接口请求背后是否真实发出了 mq 消息,mq 消息内容是否正确,用的就是类似的手段。大概思路是给 mq 打开一些 debug 类开关,让它日志记录所有消息的收和发。然后再通过过滤日志,找到指定 topic 的消息,进行断言。

写成伪代码,类似于

# 调用接口
resp = request.post(xxx)
# 检查 topic 为 abc 的队列,在最近5秒内是否有一条包含 "userId: xxx" 内容的消息
mqAssert.topic("abc").timeout(5).contains("userId: xxx")
陈恒捷 回复

这个异步和同步的概念是开发指出的,是因为接口返回结果很快,所以对于不知道接口实现的人来说,它相当于一个异步的过程。另外接口就算没等到 mqtt 返回的结果,也会返回一个结果。

我需要测的是这个接口是否发报文给客户端而且当客户端收到并返回结果后,接口是否会返回 mqtt 发过来的结果,但是我很难做的部分是,当请求发出时,客户端收到 mqtt 的信息并且发送新的报文给接口。两个步骤如何同时进行。

不知道理解是否有误,你是想验证两个场景:
1、缓存中有终端上报的信息,被测接口的返回
2、缓存中没有终端上报的信息,需要终端上报后,被测接口返回
第一点不用说,至于第二点,你要实现的就是一个一直在后台运行的和真实终端行为一致的模拟 mqtt 客户端,在 setup 阶段开一个线程一直运行着模拟的客户端,这个客户端暴露出发布接口由你来控制,从而覆盖上面两种场景

悲伤蛙 回复

对,我会试一下,开一个一直运行的线程,然后看该种场景是否可行。

但是我很难做的部分是,当请求发出时,客户端收到 mqtt 的信息并且发送新的报文给接口。两个步骤如何同时进行。

这个点还是没明白,为何需要同时进行呢?

我确认下你接口内部逻辑实现,是否和我理解一致:

1、服务端收到请求
2、服务端通过 mqtt 发送消息给客户端
3、客户端收到消息后,进行处理。处理完毕后通过 mqtt 发回
4、服务端收到 mqtt 中客户端发回的结果,或者达到超时时间,发出 response

按照这个逻辑,没有异步的部分在里面吧。我理解的异步定义是获取任务后,立即返回一个已获取,然后后台处理任务,处理完毕再按约定的方式通知回去。但如果按我上面理解的逻辑,里面没有 立即返回结果 ,而是等待后台处理完毕再返回,所以我理解这里没有异步,都是同步。

不过是否同步异步不是关键,这个只是名词定义问题。关键是你的接口内部逻辑实现,到底是怎样的,建议可以画个类似 UML 时序图的东西阐述,不要用任何概念名次,这样会更清晰。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册