在研发中,总是会遇到服务与服务的对接,或者是与第三方服务的对接,但是这个过程往往是不顺利的。因为不管是与团队内部的服务对接还是第三方的服务对接,很难保持在一个节奏上,很显然,这影响了自己的研发效率。对测试而言,也是如此,在测试过程中涉及第三方的服务对接以及测试的业务,与研发内部另外一个业务对接,往往由于缺少数据而导致进度迟迟地没有进展。这样的场景基本很常见的,不管是开发还是测试都会遇到这个问题。那么是什么问题导致了这些问题了。其实本质上是数据,想要关联的数据,这样自己负责的部分才能够往下走。比如前端有了后端返回的数据,就可以联调自己的页面展示后的样式以及逻辑,后端需要其他人返回数据后进行业务逻辑的处理,最后再把处理的结果返回给调用方,而测试因为测试一个业务场景,但是这个业务场景的数据是来源于别人,只有有数据的前提下才可以达到端到端的测试模式。
导致问题的核心是数据,那么怎么解决数据的问题呢?可以通过模拟数据的方式来解决这个问题。也就是Mock数据返回给需要的人。Mock合理的数据给不同角色的人,对方拿到数据后他的业务流以及逻辑操作才可以继续地往下走。Mock数据的方式有很多,比如可以通过moco-runner-0.11.0-standalone.jar就能够达到模拟数据的特性,当然还有很多的解决方案。这里只介绍下这种最直接最简单的模式。以客户端与服务端的请求/响应模式来阐述这部分,客户端发送请求后端返回数据给客户端,客户端拿到数据后进行下一步的逻辑处理。这里假设客户端发送了请求,但是服务端由于内部逻辑存在问题导致无法返回数据给客户端,这就导致了客户端的堵塞。
针对客户端的调用堵塞,解决的方案是模拟一个服务,然后客户端在调用的时候不再调用真实的服务端地址,而是去调用模拟的服务,这样也是能够解决客户端的问题,而客户端不至于服务端堵塞而让自己的进度也堵塞。
以登录场景为案例,客户端发送POST的请求方法,请求参数里面是登录系统的账户与密码,客户端发送成功后,期望的结果是登录成功(账户与密码都正确)并且返回登录成功后的TOKEN认证授权的信息。
mock构造数据相对而言是特别简单的,把需要构造的数据写在JSON里面,然后执执行moco-runner-1.3.0-standalone.jar就可以成为一个服务了。构造的登录数据如下。
[
{
"request":
{
"method":"post",
"uri":"/login",
"json":
{
"username":"admin",
"password":"admin"
}
},
"response":
{
"json":
{
"status": 0,
"msg": "登录成功",
"data":
[
{
"username":"wuya",
"userID":22,
"token":"asdgfhh32456asfgrsfss"
}
]
}
}
}
]
构造数据成功后,开始执行moco-runner-1.3.0-standalone.jar,最好保持构造的JSON数据与moco-runner-1.3.0-standalone.jar文件是在同一个目录。启动命令如下。
java -jar moco-runner-1.3.0-standalone.jar http -p 8080 -c login.json
15 四月 2023 09:34:16 [main] INFO Server is started at 8080
15 四月 2023 09:34:17 [main] INFO Shutdown port is 59572
如上,启动模拟的服务成功,监听的端口是8080。那么客户端只需要做的就是在路由地址中把请求地址修改为被模拟服务的地址,然后发送请求。针对上面部分,在PostMan向服务端请求,返回的响应数据以及调用结果信息如图。
如上,可以看到达到了客户端的诉求,经过调用后返回了数据。但是moco的缺陷也是非常明显的,比如构造的JSON在数据丢失的情况下也就不能正常地使用,当然也无法满足响应式的动态数据。
开源的Mock平台也有很多的选择,比如EasyMock,从名字而言可以看到它是很简单的。下面简单地说下它是如何构造数据以及处理响应式数据的。在线地址访问https://mock.presstime.cn/,在这里我创建的项目名称为mock,如下图。
下来添加一个GET的请求方法,返回航行状态的数据。构造成功后展示如下。
点击预览获取到地址信息https://mock.presstime.cn/mock/643a028e89b79f364aea89a2/mock/search#!method=get,删除method=get,剩余的就是mock的服务被访问的地址,在PostMan请求显示信息如下。
如上可以看到请求成功,可以看到它比moco更加强大而且是基于平台化。它是满足响应式的动态数据,这里就不一一地演示了。
不管是使用工具化de方式还是使用平台化的方式,都是需要客户端在请求的时候修改服务端的请求地址为模拟的服务地址,这样其实在整个扩展上方面不是很友好。在下个文章中详细阐述通过拦截代理的方式来进行自动地解决这部分以及拦截实现实现的案例细节。感谢您的阅读,后续会持续更新。