首页 / 资讯中心 / 文章详情

上线流程全攻略:从发布前检查到黄金盯守期的测试实践

上线流程全攻略:从发布前检查到黄金盯守期的测试实践 ★ FEATURED ARTICLE
1. 上线窗口前的最后检查在发布按钮敲下去之前测试在盯什么我见过太多项目组把上线当成一个动作实际上它是一整套流程里风险最密集的一段。很多测试同学对需求阶段、开发阶段、测试阶段的活很熟练一到上线就发慌——因为上线这件事拼的不是执行测试用例的熟练度而是风险判断、环境掌控和临场决策的能力。聊一套我自己的上线前检查路径不一定适合所有团队但框架可以作为参考。1.1 上线前第一件事确认要发布的版本到底包含什么听起来像废话但这是翻车率最高的环节。开发说代码已经提了测试说测试通过了结果上线后线上跑的版本和测过的版本根本不是同一套这种事在不少团队都发生过。我的习惯是上线前至少半天找开发要一份最终的版本变更清单然后做三件事用代码仓库的版本对比工具查一遍从上一个已上线版本到当前待发布版本的所有提交记录确认提交内容与变更清单一致没有夹带私货比如顺手改了某个公共类、动了某个配置项。把变更清单里的每个功能点和测试用例、缺陷单做一次映射检查。已经关闭的缺陷要重新确认关闭时的验证环境、验证版本不能拿旧环境的结论充数。看变更清单里有没有非功能性改动——依赖升级、框架版本调整、数据库脚本、定时任务配置调整。这类改动往往没有专门的功能测试覆盖但恰恰是上线后最容易惹事的。提示如果团队里连一个像样的变更清单都没有建议在上线流程文档里把这条固化下来哪怕一开始只是维护一个简单的共享表格也比上线前临时翻代码要可靠得多。1.2 风险评估上线前要说清楚万一挂了怎么收场上线窗口前测试要做的不是拍胸脯保证肯定没问题而是基于现有测试覆盖和信息判断风险点都有哪些。我一般从三个角度来拆分改动量维度这次是全新模块、存量功能改造还是只更新了文案和样式改动量越大风险面越广上线后需要盯守的时间就越长。存量功能的改造往往比新功能更危险因为新功能影响的是增量用户而改造影响的是所有在用用户。影响面维度这个改动是否涉及支付、登录、订单等核心链路是否涉及底层数据结构的变更是否会影响多个业务模块的公共接口通过影响面分析确定回归测试的范围至少把主链路、周边强关联模块、基础公共能力鉴权、配置加载、日志链路都过一遍。回滚成本维度这是很多人会忽略的一点。有的版本发布后如果出问题回滚只需要把镜像切回去几分钟就行有的版本伴随数据库表结构变更、数据迁移脚本回滚就需要专门做数据逆向操作费时费力风险还高。对这类不可逆上线测试阶段就要格外谨慎并且要提前和运维、开发一起把回滚预案写好。这三步走完之后我会输出一份上线风险评估里面明确写本次版本的高中低风险点分别是什么、每个风险点对应的验证情况、哪些功能做了多少轮测试、哪些区域是测试盲区需要上线后重点观察。这份材料既是给自己上线后的盯守做备忘也是给项目组的风险告知——上线不是测试一个人的事风险要让每个参与者都知道。1.3 上线窗口选择不是什么时候想发就能发上线时机的选择测试的话语权往往不够但我建议测试还是要参与意见。从测试视角看一个好的上线窗口至少要满足三个条件不在业务高峰时段。之前有个同事曾经想吃肯德基工作日中午去结果排队排了20分钟看着前面的队伍心里焦躁得不行。上线同理高峰时段用户请求量大出问题后影响人数多排查问题时压测流量也容易干扰判断。电商、金融类项目最忌讳的就是大促时段发布大版本。留出足够的盯守时间。别周五下午四点半发版五点半大家准时下班。上线后至少要有2到3个小时的黄金观察期核心人员都得在线。配合灰度发布策略。现在很多团队会先发小流量比如先放给5%的用户观察半小时没问题再逐步放量。测试要提前了解这次的灰度策略明确自己在每个阶段的验证动作是什么。2. 环境差异为什么测试通过的系统上线后还是会有问题经历过几次线上问题后我深刻意识到一件事测试环境验证通过只能说明在测试环境里没问题不代表在线上环境没问题。环境差异导致的上线事故比代码逻辑错误更难排查也更容易被甩锅。2.1 环境漂移配置对不上是最常见的隐形炸弹很多团队有多个测试环境、预发环境、沙箱环境环境之间大多没有做好严格的配置同步。测试环境把接口地址指向了某个Mock服务到了线上忘了切换预发环境连的是测试库结果验证数据的时候被一堆脏数据干扰。这些都是很典型的环境漂移问题。应对方式我是这样做的在测试接近尾声时拉着开发和运维做一次上线环境的预演Dry Run把发布脚本、环境变量、配置中心的值逐项核对一遍确保线上配置文件里每一项关键配置和测试时理解的预期一致。人工核对配置容易漏可以用脚本把测试环境、预发环境、线上环境的关键配置项做一次diff把差异项打印出来人工确认。这个过程哪怕只跑一次也能省掉不少上线后的折腾。配置变更要留痕。谁的配置改了、为什么改、影响了什么要有记录临时手滑改完就忘的行为是配置问题的最大来源。2.2 数据差异测试数据永远比线上干净得多测试环境的数据量级、数据分布、数据特征跟线上完全不是一个量级的。最常见的坑是测试环境一张表几万条数据SQL执行得飞快线上那张表几千万条同样的SQL跑了几百秒没出来直接把数据库拖垮了。这类问题测试阶段其实能做很多事压测阶段对核心SQL做执行计划分析看有没有走全表扫描、索引失效的情况。对数据增长量有预判。比如新功能上线后预计每月新增多少数据量核心查询的耗时增长趋势是什么样。特殊数据边界比如超级长的字段、null值、空列表、超大数据量下的分页查询都值得专门构造测试用例去验证。2.3 功能开关与灰度配置改动要留后路这一点我自己吃过亏有一次功能改造涉及老版本数据展示逻辑当时觉得反正新版本数据都是新结构就把兼容代码删了。结果上线后发现有用户的历史数据还是旧结构的展示直接裂开。后来学乖了凡是涉及数据结构变更、展示逻辑变更的都要求开发加一个功能开关默认走新逻辑但开关一关就能回退到旧逻辑。这样上线后即使出问题也能快速止损而不是干等代码回滚。至于开关加在哪个层级开关的默认值是什么开关关闭后对数据是否有影响这些都要在测试阶段验证一遍。上线流程文档里也应该把这个环节写进去。3. 上线当天的测试节奏不是发完版本就结束了很多刚入行的测试同学以为上线就是运维把包发出去然后测试点几个页面确认一遍就完事。实际不是的上线当天的测试工作要分三段走。3.1 发布过程中的观察点一秒都不能走神发布动作从开始到完成通常有几秒到几分钟的时间窗口。这个窗口内系统可能处于新旧版本交替、重启、实例切换的状态最需要盯的是发布日志有没有报错。启动报错、连接超时、依赖初始化失败的日志尤其是那些不影响启动但会影响功能的warning级别日志宁可早点发现早点处理也不要等用户来报。链路状态。如果公司在用注册中心、网关这类基础设施观察服务实例是否正常注册、流量是否在预期范围内切换。关键告警有没有触发。这时候不能只看业务日志CPU、内存、磁盘、网络I/O这些系统指标也得盯着一旦有异常波动多半是发布出来的副作用。我的做法是准备一个发布观察清单上面列着本次发布需要关注的服务名、关键日志关键字、重点指标发布的时候拿着清单逐项看不靠脑子记。3.2 冒烟验证清单从主流程开始优先级最高的事先做发布完成后最先做的是冒烟测试不是全量回归。冒烟测试的目的是用最快的速度确认系统能跑通最核心的业务路径比如用户能不能登录、主流程能不能走完、核心交易能不能完成。所以冒烟用例要短、要核心、要快优先级排布可以参考这样的逻辑第一条跑对系统存亡影响最大的链路比如登录鉴权、网关转发、数据库连通性。第二条跑本次版本涉及的最核心功能改动点。第三条跑老版本主流程确认没有明显回归。第四条看关键的联调外部服务支付网关、短信服务、第三方推送等是否可连通。提前把这些冒烟用例写成自动化脚本可以节省不少人力而且比起手工点页面脚本跑出来的结果更客观也更快速。手工冒烟的缺点就是容易遗漏而且执行人一紧张就容易操作变形。3.3 手工探索的核心区域重点用户路径的抽查自动化冒烟过了不代表高枕无忧。我会再抽几条重点用户路径做手工走查尤其关注和这次变更相关的边缘场景。比如改了订单状态逻辑那就重点走一遍不同类型订单的状态流转改了支付流程那就把各种支付方式都点一遍。这些手工走查的好处是可以结合界面上下文和各种异常状态比脚本覆盖的场景更灵活。4. 发布后的黄金盯守期前30分钟到前3小时每一条告警都要当回事版本发布后的头几个小时是最关键的。用户反馈还没大规模扩散问题发现得越早影响面就越小。这段时间测试不能闲着要做的事情很多。4.1 线上回归的执行顺序与版本风险点逐一对应我一般会做三轮线上的回归盯守第一轮发布后15分钟内核心链路巡检。用上面的自动化冒烟脚本跑一遍加上关键日志的关键词扫描比如ERROR、Exception、超时等看有没有异常情况。第二轮发布后1小时内围绕本次版本变更点的功能验证。把测试环境验证过的业务场景在线上环境各走一遍主逻辑路径。第三轮发布后2到3小时观察用户行为链路。这个阶段更多是靠日志和监控数据比如核心接口的耗时趋势有没有上升、错误率有没有明显波动、用户侧有没有形成投诉。测试阶段的线上回归目标不是把线下的所有用例在线上重跑一遍——线上环境和数据条件都不允许。真正要做的是把风险最高的那部分验证点覆盖掉然后用监控数据来兜底。4.2 线上问题与Bug的处理边界什么该提单什么该立即上报线上出问题的时候最忌讳的就是按测试阶段的方式走提Bug-开发修复-验证-关闭的流程这会耽误事。线上问题的处理要按严重级别分流严重级别表现处理动作P0主流程不可用、大面积报错、资损、数据损坏立即上报通知研发/运维/产品决策是否回滚测试配合复现和定位P1核心功能受损但有小路可走、部分用户受影响30分钟内响应评估影响范围确认是否有临时该干的事P2非核心功能异常、不影响主流程正常提单按常规迭代节奏处理测试在线上问题中的作用不只是复现一下这个bug更关键的是快速判断影响范围受影响的是哪些用户群、哪些功能模块、什么时候开始出现的。这些信息能给到决策层做判断是紧急修复、回滚还是先撑一下再看。4.3 回滚决策的思路什么样的评价要在一小时内做出来回滚是一个很重的动作但是很多问题撑到最后也只能回滚。测试要清楚一件事回滚不仅仅是一个技术动作它代表着一整套流程要倒退重来。所以回滚决策不是出了错就要回滚而是要看几个因素问题影响面是否还在扩大。如果影响范围可控可能先用功能开关把新逻辑关掉如果影响面不可控回滚要趁早。问题的修复成本和时间。如果开发预计一小时内能修复可能不必回滚先出个热修包试试如果修复时间无法估算回滚是更优的选择。不可逆的变更要对冲。如果是涉及数据库迁移之类的不可逆操作更要提前在发布方案里plan好回滚之后的补偿逻辑。这里分享一个经验回滚决策要前置回滚方案不要等出问题的时候才临时写。测试在发布前评审阶段就应要求研发把每次发布的回滚方案写清楚方案里必须有明确的触发条件、执行步骤、验证方法。多数团队能做好第一项和第三项第二项的执行步骤往往写不细。出问题的时候运维和执行人要么靠临场反应要么靠不完全的方案动作变形就会在后面造成更多麻烦。5. 上线流程里的三类不显眼但致命的问题数据、缓存、外部依赖有些问题不是逻辑错也不是环境差而是软件系统里一些底层模块在上线流程里被忽略了。这三个大头我单独提出来给同行们多个参考维度。5.1 数据层面的上线动作不是只有DDL那么简单发布单里有表结构变更的测试阶段必须验证数据迁移脚本的可执行性和可重复性。有的脚本只能跑一次跑第二次就报错这种脚本在灰度发布场景下就很危险。要专门验证脚本在空库、有历史数据、有大表等不同场景下的表现。初始化数据的幂等性也要验证。线上执行初始化脚本时如果脚本里包含插入默认配置之类的操作一旦执行到一半因为某条数据重复导致中断后续再补跑就很容易出现数据错乱。规格上应要求每次发布的脚本都把幂等逻辑写清楚。老数据的清洗和兼容性处理要有专门的测试用例。新代码上线后老数据必须能被正常读出来、正常展示。我知道有些团队测试阶段只造新数据不提前历史数据这就遗漏了一个风险面。5.2 缓存层面的上线动作版本更新后缓存怎么办缓存是上线最容易被绕过去的环节。改了商品详情的展示逻辑但缓存里有旧逻辑生成的商品数据用户看到的和预期不符。这个问题不致命但很容易让项目组以为上线失败了。处理方式有这么几种按成本和效果排发布前评估本次改动是否会涉及缓存结构变化如有应提前设计好缓存预热方案别拿空缓存去扛流量。关键缓存设置好版本号发布时切换缓存版本新版本自然用新逻辑生成缓存。发布后巡检缓存命中率如果出现命中率大面积掉下来的情况得留意是不是缓存key的变化导致缓存大量失效引发后端压力升高。5.3 异步消息与时序问题上线后最磨人的问题来源还有一类问题测试环境死活测不出来上线后间歇性闪现最后定位到是异步消息或任务调度的时间顺序问题。比如用户下单后发送消息通知库存扣减但消息消费的时序在两个环境里不一致定时任务在发布期间被重复触发导致数据重复写。应对这类问题的思路测试阶段要设计时序类、并发类的用例别只测单线程场景。了解本次发布涉及哪些消息队列、哪些定时任务确认它们的消费者/执行器的变更情况必要时在发布期间屏蔽定时任务的触发窗口。发布方案里把消息中间件、任务调度平台的运维注意事项写清楚有需要暂停调度任务的话务必申请暂停时间。说句实在的这三类问题里数据问题最要命缓存问题最隐蔽异步问题最磨人。但好在它们都是可以提前设计的只要在流程里固化相应的检查项上线风险能降一大截。6. 把上线流程固化成一个可复制的机制线上发布检查清单与交付到这儿上线流程已经不是某个人的经验而是一个有章可循的标准动作。项目团队最怕的是一批人走了流程经验跟着走了下一批人重新踩坑。所以流程要落成文件、要落成清单这既是工作效率的保障也是测试团队话语权的体现。6.1 发布checklist该怎么设计设计checklist的时候如果条目太多就等于没有checklist因为执行人根本看不完。我会把它分成两类必做项硬性门槛变更清单完整、可回溯测试环境和线上环境的配置差异项已确认已知缺陷的影响范围评估完成且有处置结论数据迁移脚本已验证可执行、可重复、可回滚回滚方案、功能开关预案已落实核心链路自动化冒烟用例通过职责项按角色拆分的检查内容开发确认代码分支无误、上线脚本已验证、配置项提交完整测试冒烟清单通过、监控告警已接入、线上回归计划就绪运维发布窗口已确认、监控大屏就绪、资源水位有数产品运营侧公告/客服话术就绪、用户沟通预案就位这套checklist的价值不只是上线前逐项打勾更是给大家一个统一的沟通语言避免同一件事你说东他说西。6.2 发布复盘怎么开才有用很多团队上线后例行开个复盘会结果开了两张嘴皮子就散了没留下什么可改进的东西。我的建议是复盘会不要纠结谁的责任而要复现三件事本次发布过程中的时间线。什么时候发布、什么时候发现异常、什么时候决策、什么时候解决。把这条时间线摆出来大家自然知道哪个环节花的时间不合理哪个环节的决策被拖住了。下一步需要改进的机制性动作。不能只停留在下次小心点这次多注意。要有明确的任务分配比如下次上线前测试要提前两天检查数据迁移脚本下次发布运维要在发布开始前确认告警通道可用。做得好的部分也要总结。别光盯着问题。哪个环节因为流程清晰节省了时间、哪个功能因为测试覆盖到位没有出问题把这些经验提炼出来变成后续流程的执行标准。6.3 测试自动化的切入点上线流程里的自动化不只是为了省人力更是为了保证上线那一刻的动作不变形。从我的经验看以下几个自动化点收益最高值得优先投入核心链路的发布后冒烟脚本。花不了太多工作量但每次上线都能跑一遍安心程度提升一大截。数据/配置差异对比脚本。测试环境、预发环境、线上环境的配置对比用脚本扫一遍比自己人肉对一遍可靠得多。发布日志的关键词监控。在日志平台里配好ERROR、Exception、timeout等关键字的实时告警异常情况不用人肉眼去翻日志。线上核心接口的自动化巡检。定时跑关键接口的正确率和耗时上线后如果指标掉下去能提早捕捉到问题。这些自动化的投入不一定需要多大成本先从最痛的点开始跑顺了一个再逐渐扩展。我见过太多团队一上来就想着搞一套全自动的发布流水线结果搭了三个月还没跑通连最基础的冒烟脚本都没人写。先小步快跑跑起来再优化比大而全的空想方案强得多。说白了项目上线流程这一整套东西本质上是把一个高风险的仪式变成一套可控的、可预期的标准作业。测试在这个流程里既是最后一公里质量的守门人也是发布风险的早期预警者。这一套流程能跑顺不是某个人特别厉害而是每个参与者都对流程有敬畏心知道每一步该干什么、为什么这么干。
阅读完成 · 觉得有帮助?
咨询建站