点击关注“有赞coder”
获取更多技术干货哦~
作者:马力部门:新零售测试过滤。有一些接口是不需要迁移到新网关的,进行过滤,减少对最后统计结果的干扰。另外,录制回放运行时也会请求网关,需要过滤掉这部分人工流量。
采样。虽然是测试环境,一天的数据量也有 10W+ ,全部处理时耗较长;同时,初期会有大量重复问题爆出,增大排查成本。根据二八定律以及实际的观察,小部分接口贡献了大部分流量,考虑每个接口雨露均沾和数据的多样性,选择接口+场景作为采样纬度,返回结果中的不同 code 认为是不同的场景,这样除了正常请求,也考虑到异常请求的回放。
p = multiprocessing.Pool(8) while line: p.apply_async(process_line, args=(...)) line = file.readline() p.close() p.join()
在 6C 的机器上对 2000 条日志进行回放,通过不同的并发数观察结果如下:
pool(1) 耗时:1292spool(6) 耗时:212spool(8) 耗时:155spool(12) :耗时:102s
发现性能提升还是很明显的,根据实际运行机器的CPU性能配置适合的并发数即可。
接口请求返回含有时间字段,而时间字段是根据当前处理时间生成的。
一些写接口返回的是新生成的对象 id ,每次请求返回都不同。比如创建一个商品,下了一笔订单,返回的都是新生成的商品 id 或者订单号。
返回数据列表时,有些场景返回的数据是不保证顺序的,导致偶尔的比对失败。
ignore_dict = { 'youzan.retail.stock.receiving.order.export.1.0.0': ['response'], 'youzan.retail.trademanager.refundorder.export.1.0.0': ['response'], 'youzan.retail.trade.api.service.pay.qrcode.1.0.1': ['url'], 'youzan.retail.product.spu.queryone.1.0.0': ['list']}
其中定义两个特殊字段 response 和 list:
对于 response 字段,只检查字段长度和类型,不检查内容是否一致,主要针对返回序列号、订单号的场景
对于 list 字段,对于其中的list类型做无序比较处理
def compare_data(data_1, data_2, COMP_SWITCH, ignore_list): if isinstance(data_1, dict) and isinstance(data_2, dict): diff_data = {} only_data_1_has = {} only_data_2_has = {} d2_keys = list(data_2.keys()) for d1k in data_1.keys(): # 忽略某些字段 if COMP_SWITCH and __doignore(d1k, ignore_list): continue if d1k in d2_keys: d2_keys.remove(d1k) temp_only_data_1_has, temp_only_data_2_has, temp_diff_data = compare_data(data_1.get(d1k), data_2.get(d1k), COMP_SWITCH, ignore_list) if temp_only_data_1_has: only_data_1_has[d1k] = temp_only_data_1_has if temp_only_data_2_has: only_data_2_has[d1k] = temp_only_data_2_has if temp_diff_data: diff_data[d1k] = temp_diff_data else: only_data_1_has[d1k] = data_1.get(d1k) for d2k in d2_keys: if COMP_SWITCH and __doignore(d2k, ignore_list): continue only_data_2_has[d2k] = data_2.get(d2k) return only_data_1_has, only_data_2_has, diff_data else: if data_1 == data_2: return None, None, None else: if COMP_SWITCH and isinstance(data_1, list) and isinstance(data_2, list): if __process_list(data_1, data_2, COMP_SWITCH, ignore_list): return None, None, None else: return None, None, [data_1, data_2] else: return None, None, [data_1, data_2]
比对逻辑中加入了 COMP_SWITCH 开关,先按常规方式进行比较,当常规方式比较失败,再开启兼容模式进行比较,这样的做法是为了统计和观察哪些接口会使用兼容模式,使用兼容模式是否合理(还有兼容模式本身有没有bug~~)。
{'200': 94, '234000001': 16, '234000002': 1}
当统计结果中存在正常的code和异常的code,同时没有回放失败记录的情况,就可以认为新网关对该接口的返回和老网关是一致的。回放通过的次数越多,可信性就越强。在这种情况下再将接口的流量切换到新网关,观察日常业务调用的情况,通过拉取新网关日志,记录返回的code和数目,当新网关返回的结果中也包含正常和异常的code时,认为在新网关也能正常请求,可以准备线上迁移了。通过QA环境的对比回放,同时在预发环境全量迁移后观察业务功能是否正常,最后线上逐步灰度流量和监控,最后确保接口迁移到新网关是正常的。
Vol.335
最后打个小广告:
有赞新零售测试团队长期招人,期待你的加入~,
如果你也是聪明、皮实、有要性的小伙伴
如果你对零售、SaaS有更多想法
欢迎投递简历:mali@youzan.com
加入我们,一起enjoy