自动化桩的价值:
以往测试过程中团队中存在的痛点:测试环境无法接入三方服务,开发写死的三方服务的处理结果,不与三方服务进行通信,在测试过程中无法测到被测服务在三方服务异常的情况下的处理行为,还有发送请求协议的正确性,但如果在线上测试的话成本又过高,让开发来做模拟三方服务的话,成本过高不愿意配合
我的解决思路:用python写出一个自动化桩模拟第三方服务,与我们的被测服务和python测试脚本进行交互,可以通过测试脚本控制要校验的预期结果
桩的设计思路:
1.我选择用sokect协议进行桩与测试脚本的通信
2.桩把被测服务的请求协议发送给测试脚本且实现断言
3.测试脚本可以给桩传递数据模拟桩的返回结果后在返回给被测服务
4.被测服务收到桩给的数据后进行对应的逻辑处理把结果返回给测试脚本
桩的交互流程:
step1:在python客户端实现socket服务端,提供通信方式
step2:在桩模块下,实现socket客户端,和python客户端的socket服务建立通信,明确channel并实例化。
step3:根据桩启动配置所描述的端口在桩模块基于flask框架启动http的桩,满足任意接口和任意请求方式。
step4:启动被测服务,满足依赖关系。
step5:测试用例开始执行,使用桩模块提供的异步http请求方法调用被测服务的接口。
step6:被测服务在入参协议校验完成后开始请求依赖服务获取业务的处理结果,被测服务调用依赖服务的接口(实际上就是请求桩)。
step7:桩服务会通过channel发送消息,将从被测服务接到的请求打包起来发送到python客户端的socket服务。
step8:python客户端会通过拉取消息的方式接收消息。
step9:python客户端需要定义桩的结果返回,定义完成通过socket提供的send进行消息的回调。
step10:桩接收到回调消息后包装成回调消息直接进行被测服务的消息回复。
step11:被测服务通过接口返回返回业务的处理结果。
step12:python客户端能正常完成用例的流转过程。
step13:python客户端执行完全量用例后下线桩服务。
交互图:
部分代码实现过程:
桩的启动配置项:
socket客户端的实现:
创建了名为httpstub的类,实现socket服务端长连接的通道,使用flask框架接收被测服务发送过来的http请求
socket服务端的实现:
创建了名为stubOperator的类,建立了socket服务端的与socket客户端的连接通道,可以进行通信和互相发送接收消息
测试用例异步请求被测服务的实现:
可以用http_requests这个类方法来发送请求