其他
干货 | 质量保障新手段,携程回归测试平台实践
作者简介
Sedro,携程资深测试工程师,专注于测试技术探索及测试工具研发。
一、系统回归问题
二、CPR目标
大量真实流量确保覆盖率 将录制的流量作为用例管理起来进行自动化回归 流量回放支持子调用自动化mock,避免回放产生脏数据 流量回放支持子调用结果的验证 减少人力资源
三、目标实现基本过程
四、CPR原理及实现
4.1. CPR录制的数据抓取点
4.2. CPR结构简介
CPR分为两大组件:
CPRRecord:目标是在稳定代码环境中录制请求调用的入参和返回值,并上送到存储服务。使得CPR Replay具备回放流量的数据。
CPRReplay:功能为接收回放服务提供的回放流量,在待测代码环境中进行回放,并将回放结果上送至对比服务,让其实现正常系统和待测系统返回结果比对差异的能力。
存储服务:对接收到的录制流量数据,将其持久化保存,待后续用户筛选有效流量。
回放服务:功能为将录制流量进行还原,然后对入口调用做一次流量的发起,使得CPR Replay。
对比服务:对接收到的回放数据与录制数据进行差异比对。
4.3 CPR处理流程
4.4 流量复制实现
4.5 流量回放实现
处理过程为首先会将RepeatEvent的参数进行反序列化,获取回放相关的录制记录的信息,然后通过这些信息从prepeater-console拉取对应的录制记录详情(RecordModel),最后用默认流量分发器DefaultFlowDispatcher进行分发。
public void doMock(BeforeEvent event, Boolean entrance, InvokeType type) throws ProcessControlException {
/*
* 获取回放上下文
*/
RepeatContext context = RepeatCache.getRepeatContext(Tracer.getTraceId());
/*
* mock执行条件
*/
if (!skipMock(event, entrance, context) && context != null && context.getMeta().isMock()) {
try {
/*
* 构建mock请求
*/
final MockRequest request = MockRequest.builder()
.argumentArray(this.assembleRequest(event))
.event(event)
.identity(this.assembleIdentity(event))
.meta(context.getMeta())
.recordModel(context.getRecordModel())
.traceId(context.getTraceId())
.repeatId(context.getMeta().getRepeatId())
.index(SequenceGenerator.generate(context.getTraceId()))
.type(type)
.build();
/*
* 执行mock动作
*/
final MockResponse mr = StrategyProvider.instance().provide(context.getMeta().getStrategyType()).execute(request);
/*
* 处理策略推荐结果
*/
switch (mr.action) {
case SKIP_IMMEDIATELY:
break;
case THROWS_IMMEDIATELY:
ProcessControlException.throwThrowsImmediately(mr.throwable);
break;
case RETURN_IMMEDIATELY:
// if(!type.equals(InvokeType.MYSQL) &&! type.equals(InvokeType.MYBATIS)){
ProcessControlException.throwReturnImmediately(assembleMockResponse(event, mr.invocation));
// }
break;
default:
ProcessControlException.throwThrowsImmediately(new RepeatException("invalid action"));
break;
}
} catch (ProcessControlException pce) {
throw pce;
} catch (Throwable throwable) {
ProcessControlException.throwThrowsImmediately(new RepeatException("unexpected code snippet here.", throwable));
}
}
}
4.6. 缺陷判定简析
4.7 数据安全保护
五、小结
“携程技术”公众号
分享,交流,成长