基于spring数据抓取和数据回放实现方案

一、概要

如何线上的实际数据在测试环境进行回放。需要解决的问题

1. 线上数据如何记录

2.线下数据如何回放

3.依赖第三方接口(甚至数据库)可以mock

 

声明:也许这并没有多大是使用价值

github: https://github.com/Athlizo/pheonix

二、phx

phx分为2个部分

  1. phx-Recorder:用于抓取数据
  2. 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,会发现抛出了 回放失败的异常