基于spring数据抓取和数据回放实现方案
一、概要
如何线上的实际数据在测试环境进行回放。需要解决的问题
1. 线上数据如何记录
2.线下数据如何回放
3.依赖第三方接口(甚至数据库)可以mock
声明:也许这并没有多大是使用价值
二、phx
phx分为2个部分
- phx-Recorder:用于抓取数据
- phx-Replayer:把抓取的数据用于线下回放
难点:如何处理泛型,Optional,null(详细参考代码)
三、使用
第一步,总是在配置类加上@EnablePhx
3.1 Phx-Recorder
1.在入口使用 @PhxEntry
例(phx-test中的代码)
@PostMapping("/n") @PhxEntry(type = PhxTypeEnum.CONTROLLER) public Object n() throws SQLException { phService.creditRefundMoneyReady3(1234, null, null, "content".getBytes()); return "ok"; }
2.在需要mock的地方加上@PhxMock(类和方法名上都可以)
例
@PhxMock @Service public class PhDaoImpl implements PhDao { .... }
3.2 Phx-Replayer
@Autowired PhxReplayer phxReplayer; //一条调用记录 String aRecorder = 你的保存phx-recorder的地方 phxReplayer.replay(aRecorder);
四、例子
参考项目里的phx-test,启动spring boot,然后打开调动/n接口,模拟线上输入
然后标准IO会输出,就是本次调用记录的东西,参考代码在
注1:好吧,我这里没实现怎么保存,就简单打印出来,你们可以把他保存到数据库,文件都可以
注2:key太长了,可以简写
real call //注,证明真的是调用phDao里面的方法
{“abstractPhxMocks”:[{“className”:”com.enniu.phx.service.PhDaoImpl”,”methodName”:”testMock3″,”mocked”:false,”phxParameters”:[{“clz”:”@null”,”val”:”null”},{“clz”:”java.lang.Integer”,”val”:”1″}],”phxResult”:{“clz”:”com.enniu.phx.service.PhDo”,”exception”:false,”val”:”{\”autoId\”:2}”},”uid”:”3682431e-0861-4f02-bddb-f12ce16ecd41″}],”entry”:{“className”:”com.enniu.phx.Application”,”methodName”:”n”,”phxParameters”:[],”phxResult”:{“clz”:”java.lang.String”,”exception”:false,”val”:”\”ok\””}},”type”:”CONTROLLER”}
然后把上面json复制,调用/check
这下看到并没有打印 real call
为了说明,回放失败,我把上面的json改一下
在调用一下 check,会发现抛出了 回放失败的异常