背 景
在产品需求迭代过程中,功能测试与回归测试是必不可少的两个环节。对于改动较大的项目,首先,确保功能的实现符合产品逻辑并做到100%没有问题离不开有效的功能测试;其次,项目中很多逻辑的改动都是在原有功能的基础上进行的,这时候就需要一定的回归测试。通常,在功能测试时,人工case不能模拟线上用户的所有行为,且具有一定的主观性;回归测试时,采用全面回归的方式往往也伴随着测试成本的增加。一个好的方式就是利用线上流量来验证。
一方面,通过记录线上流量,在沙箱或者测试环境回放,来发现新分支代码是否能够让系统功能正常运行,从而降低代码变动给整体系统带来的风险;
另一方面,通过线上流量进行线下回归测试可以在保障全面回归的情况下有效的节约测试成本。
简 介
使用真实的线上流量进行线下回放测试,节约回归测试成本,保障代码质量,进而减少线上事故。

全链路流量平台具备的能力
能录制线上真实流量;
能实现海量数据的并发请求;
能支持常见协议的请求;
对线上尽量应用透明,也就是说无侵入性;
工具使用简单,能够满足各场景流量回放。
可以看出按照以上的能力需求搭建一个流量平台需要投入一定的成本,而我们目前考虑的是针对某一个项目的快速流量回放,可能并不需要设计这么复杂并且重量级的流量平台。那么,如何快速的实现满足业务需求的流量回放呢?基于RPC接口的流量回放,简单、快捷、容易上手。接下来我将通过实际的业务场景来介绍下流量回放在采货侠卖场侧的业务应用。
流量回放的应用
1、项目背景
采货侠卖场侧新增后台配置功能且还涉及到对成拍逻辑的改动,需要验证新功能的正确性并对多种成单场景进行一定的回归测试。
回归工作量大需要有效的手段提高测试效率;
成单逻辑不容出错需要100%的保障。
2、 方案
流量回放
回归测试:使用真实的线上流量进行线下回放测试,对比不支持议价功能的商品线上、线下成单结果的一致性;
功能测试:使用真实的线上流量进行线下新功能的验证。线上保持原有Apollo配置逻辑,线下应用新开发运营后台的配置功能。保持相同配置应用线上流量数据通过新开发分支代码运行获取相应的成单结果,验证补贴后台和议价后台功能的正确性。
优点
可以高度结合业务逻辑,实现细粒度定制化流量复制;
解放部分回归测试的人力成本,提升测试效率;
对业务的用例场景更加客观,保障代码质量,进而减少线上事故。
流量采集
通过云窗获取相应要求的线上商品信息以及对应的最高出价和成单结果
将云窗所得线上数据的相关信息写入到数据库对应的字段中
流量回放
代码设计逻辑

首先,通过读取线上商品的保底价映射成相同价格的线下商品参拍暗拍卖场,接着模拟用户在采货侠卖场中的真实行为进行流量回放,并将线下的商品数据和成单结果写入数据库表;整个过程中采用了多线程以及数据库表批量增加、查找来提高运行效率。
数据存储结果
表中线上、线下数据一一对应存储,清晰、明了有利于结果分析。
结果分析
结果分析思路:调用开发分支在测试环境进行流量回放,得到相应的期望结果后和线上同一商品的相应结果进行比较,判断结果是否一致。校验的字段可根据实际需求场景进行相应的变更,在本次案例中验证的字段是成单结果和补贴金额。

回归测试验证逻辑
读取不议价商品的流量回放成单结果和线上相应数据的成单结果进行对比,判断结果是否一致。如下图所示为成单验证结果:线上和线下的成单结果全部是一致的,这说明新需求代码的开发未影响到原有不议价商品成单逻辑的正确性。此外,采用该方法进行测试使原计划进行回归测试的时间缩短了3倍多,这有效的节约了回归测试的成本。

功能测试验证逻辑
为了做进一步的功能保障。通过获取线上真实的用户流量,在保证线上原有配置和线下运营后台一致的情况下,调用新分支代码实现线下流量回放得到相应的预期结果,然后和线上结果进行比对。首先,对比线上、线下成单结果是否一致来验证成单逻辑的正确性;其次通过比较线上、线下补贴金额是否一致来验证运营后台补贴配置功能的正确性。本次验证不关心成单后商品的状态流转,而线上部分商品状态已经流转,所以验证成单结果时,可以把生成订单后流转的一些状态重置为成单状态和线下成单结果进行比对。逻辑如下:

验证结果如下:

首次验证结果中出现了部分商品线上、线下成单结果不一致,需进一步分析解决
问题1:线下部分商品状态一直在售卖中
原因:有部分商品调用结束竞拍没有成功
解决:商品调用结束竞拍失败后继续重新调用
问题2:线上商品成单,线下商品却是流拍
原因:线下运营后台部分价格段的设置没有和线上的保持一致
解决:保证线上、线下各价格段补贴、议价金额一致
确保线上、线下配置一致的情况下,使用优化后的代码重新进行流量回放,可以得到相同成单结果和补贴结果。说明运营后台配置功能的代码实现以及成单逻辑都是正确的。
4、总结
(1)流量回放的项目需求是不一致的,因此我们也可以采用一些灵活的方法来进行结果验证;
(2)目前公司底层代码实现多流量路由、多IP随机分配的方式,所以测试时一定要进行修改,测试服务调用保证在自己的测试机器;
(3)采用基于RPC接口的调用方式实现流量回放可以快速满足项目的短期验证,但是从一个长远的发展来看,搭建一个流量平台也是很必要的。
展 望
流量回放的应用场景不仅仅是以上介绍的两种。对于线上采集的流量,不同用户会有不同的业务用途,如压测平台可能希望将流量先持久化;有些研发同学只是简单从线上引一份流量转发到自己的开发环境做新特性测试;有些同学希望转发 QPS 能达到一定水位以实现压测的目的;还有的是特定流量会触发线上问题,他们希望把这段流量录制下来线下 debug等等。因此,我们可以在后续的业务场景中不断的应用和扩展。
作者:高鸣旋
> 转转研发中心及业界小伙伴们的技术学习交流平台,定期分享一线的实战经验及业界前沿的技术话题。
> 关注公众号「转转技术」(综合性)、「大转转FE」(专注于FE)、「转转QA」(专注于QA),更多干货实践,欢迎交流分享~
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
我希望访问我机器上的所有HTTP流量(我的Windows机器-不是服务器)。据我了解,拥有一个本地代理是所有流量路线的必经之路。我一直在谷歌搜索但未能找到任何资源(关于Ruby)来帮助我。非常感谢任何提示或链接。 最佳答案 WEBrick中有一个HTTP代理(Rubystdlib的一部分)和here's一个实现示例。如果你喜欢生活在边缘,还有em-proxy伊利亚·格里戈里克。这postIlya暗示它似乎确实需要一些调整来解决您的问题。 关于ruby-如何捕获所有HTTP流量(本地代理)
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
我正在根据Rakefile中的现有测试文件动态生成测试任务。假设您有各种以模式命名的单元测试文件test_.rb.所以我正在做的是创建一个以“测试”命名空间内的文件名命名的任务。使用下面的代码,我可以用raketest:调用所有测试require'rake/testtask'task:default=>'test:all'namespace:testdodesc"Runalltests"Rake::TestTask.new(:all)do|t|t.test_files=FileList['test_*.rb']endFileList['test_*.rb'].eachdo|task|n
我想要像“嘿那里”这样的东西变成,例如,#316583。我希望将任意长度的字符串“归结”为十六进制颜色。我不知道从哪里开始。我在想,每个字符串的MD5散列都是不同的-但如何将该散列转换为十六进制颜色数字? 最佳答案 你可以只取几位前几位:require'digest/md5'color=Digest::MD5.hexdigest('Mytext')[0..5] 关于ruby-如何使用Ruby基于字母数字字符串生成颜色?,我们在StackOverflow上找到一个类似的问题:
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3