中台RPC接口自动化怎么做

image1

RPC接口

我所在的部门是技术中台,主要负责toB业务,上游是业务条线,包括PC、APP、小程序等终端,这些端的后台是HTTP接口层,而在HTTP接口层之下,就是技术中台的RPC接口层。

HTTP是一种超文本传输协议,基于TCP/IP来传输文本、图片、音频、视频等数据。数据包的传输能力不是HTTP提供的,而是TCP/IP干的。HTTP的本质是客户端和服务端约定好的一种通信格式,是一种全世界认可的通用范本。

RPC是一种远程调用,也就是进程间通信,既可以用HTTP协议,也可以用自定义协议。RPC的好处是没有HTTP那么多约束,简化了写法,可以根据公司自定义规范,内部统一即可。 所以在公司内部特别流行,比如阿里的Dubbo接口就是一种RPC接口,我们公司用的JSF接口,自研的服务框架,简称杰夫。

谈谈京东的服务框架 https://juejin.cn/post/6948351920088186888

举个例子,本地调用,是调用的本地方法:

public User getUserById(Long id) {
      return userDao.getUserById(id); // 这叫本地调用
   }

而RPC远程调用,调用的是另外一个服务的方法:

public User getUserById(Long id) {
      return userConsumer.getUserById(id); // 这是远程调用,逻辑是用户小组的服务实现的。
   }

本地调用和远程调用的比较如下图所示:

image2

左边的本地调用,只在应用内部调用。右边的远程调用,会跨应用在应用之间调用。

RPC和HTTP用法区别

HTTP接口在调用时,输入URL,Method,Headers,Body等等等就可以发送请求了。

RPC接口的调用大同小异,输入:

JSF地址:方法引用路径,比如com.dongfanger.api.service.ShopProvider

方法名:方法名称,比如queryShopList

别名:既可以是分组别名,也可以直连IP地址。

方法入参:JSON串。

等等等,就可以发起请求了。

从用法能看出来,RPC和HTTP接口的结构体是差不多的,但是RPC不需要Method和Headers,精简了许多。

接口自动化

首先需要考虑的是目录结构设计,HTTP可以模块菜单创建用例目录,比如:

一级目录:管理端

二级目录:发票管理

三级目录:发票查询

而RPC是无页面的,一般存在很多业务线,所以可以按照功能域和业务线来组织目录,比如:

一级目录:发票

二级目录:提交申请

三级目录:分销

其次就得考虑技术实现了,公司基建比较完善,无论是HTTP还是JSF接口,都能在接口测试平台上编写自动化用例。虽然是Web平台写用例,但是得益于测试平台的优秀设计和使用体验,用起来很方便,效率也很高。交互方式跟JMeter大同小异,只是在细节上做了很多打磨。

然后就是参数构造了,建议是用流量回放的方式来做,省去手工编写参数的崩溃感。流量用例创建好以后,需要做一些参数化处理和接口关联。这样才能够把多个接口串起来。

对于测试数据,通过预设变量来统一管理,自动化用例也尽可能设计成闭环,增加,修改,查询,删除,用例跑完后产生的数据也跟着清理掉。

最后就是断言了。没有断言的自动化用例,不叫做自动化用例。断言一定要加上,否则定时任务跑出结果后,无法判断到底有没有问题。而断言内容不能只是简单的code200,需要加上业务校验。

中台RPC接口自动化最难处理的是接口依赖问题,链路特别长,依赖特别多。我一般通过Mock来解决这个问题,公司的测试平台也提供了这个功能。

需要注意的是,核心用例定时运行监控起来,而一次性用例要及时维护或清理,防止变成僵尸用例。

最后,我准备基于Vue+FastAPI开发一套新的pytest脚本管理平台,集成流量录制创建用例和Mock等功能,并借鉴公司测试平台的设计,感兴趣的同学可以添加微信cekaigang加群讨论哟。

参考资料:

HTTP 的本质?HTTP 和 RPC 的区别? https://www.jianshu.com/p/fe5ccfc5d7bd

谈谈京东的服务框架 https://juejin.cn/post/6948351920088186888