测试自动化之Mock服务思路探讨

在进行产品测试时,我们会碰到下面几种情况:

  1. 依赖接口不通。比方说,在我测试订单系统时,需要调用商品系统的接口获取商品信息。如果商品接口坏了,需要等待商品接口恢复之后才能继续我的测试。我们都有感触,这种情况在测试环境中尤为突出。依赖接口能不能稳定一些呢?
  2. 异常数据模拟困难。再举个例子,在我测试商品系统时,需要调用商家系统的接口认证商家为非法商家时,接口正常情况下无法提供这样的数据。可能这样的测试执行会比较困难。那我们如何简便的构造接口的异常数据呢?
  3. 依赖接口性能参数无法保障。这个例子是这样的。我在对商品系统进行压力测试,需要商家接口及时返回数据,满足商品这边的调用频度。现在的做法是,找一台高性能机器,部署商家系统,来满足商品的压测要求。当依赖接口多的情况下,这会是很大的额外工作量。如何能够省略这个工作量呢?

可能大家想到用Mock的方式,去模拟一个网络的接口。过程是这样的。我想要得到的是被测系统的输出。Tesla是被测系统。数据输入后经过Tesla,Tesla要调用Stub接口,然后返回数据。也就像之前咱们举的例子:商品系统调用商家接口。如果Stub接口挂了,我们用Mock服务代替这个接口,返回定制好的数据,然后得到输出,完成数据的正常流动。

那是不是有Mock服务就完全解决了开头提到的三个问题呢?我觉得并没有。我们研究了业界众多的Mock方案,比方说,支持HTTP协议的WireMock,支持WebService的SoapUI里面的MockService,Dubbo需要自己写接口实现再打成jar包中并需要同接口在一个jar包中。我们从中看到这样的缺点:不同协议的方案从属于不同的平台,多个Mock服务无法有效管理。

Mock服务的平台管理部分,其实各家有个家的方案,主要看是不是便利了。而对于Mock方案,不同方案其实千差万别。看起来都是对于接口的模拟,如果不是从协议底层出发,可能它的扩展性不会很大。

现代RPC的本质其实就是在网络上传输数据包,而这个数据包的特点是header+body。Header就是协议头,分为定长或者变长,这个取决于协议的设计者。比方dubbo协议就是定长的。而有些协议是变长的。Body就是消息体,其实就是对象的序列化过程,把序列化好的数据放入到body里面。现在流行的序列化方案有:hessian,java,json,msgpack等。

有了这个本质了,咱们看一下,用什么样的方式从网络中传输这个数据包。
底层框架用NIO/Netty框架。因为是异步通信,高性能,高并发的支持,Netty框架就可以做到。
建立通信之后,客户端发起请求,发送数据包到服务端。服务端拿到数据包之后进行解码操作。
服务端构造响应结果,序列化完成后,加上协议头信息,返回给客户端。
过程虽然简单,但是在实际开发过程中可能碰到一些问题。下面就是我在实践的时候碰到过的一些坑,列出来供大家参考。

  1. 心跳包的处理。什么是心跳包,其实就是为了保持连接,客户端向服务端定时发起的检测包,里面没有任何的具体内容,只是用于告诉服务端,我还活着。因为没有body,所以要做特殊的处理,不能直接类同有响应体的数据包。
  2. 客户端可能是连着发请求,数据包是连在一起的,需要判断长度,到某个字节一次请求就结束了,跟着的应该是下一次请求了。这就需要对数据包进行合理的切割。
  3. 数据包的协议头部分可能带有认证信息比方requestID之类的,需要在返回时,也需要把这个id返回到客户端。因为一般客户端都会有认证的机制,如果id不一样,则不解析这个响应。

综上,对于接口的Mock,从协议底层下手扩展性好,处理较方便,能够协助剥离依赖关系,更便捷、专注于自身系统的测试工作,达到事半功倍的效果。

原文地址:https://www.cnblogs.com/dayiran1222/p/12565895.html