You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
13 KiB
Markdown

2 years ago
# 06左移&右移测试如何在Dev和Ops领域大展身手
你好,我是柳胜。
前面的几讲你已经学习了ROI模型它开始于一颗带有ROI DNA的种子不断生长直到长成一棵大树。从树根到枝干、从规律到原则它贯穿了一个自动化测试项目从生到死的完整生命周期设立目标制定策略选择框架到代码的实现上线的度量再到衰竭退出。
我把价值篇讲过的内容加以整理得到了下面的树结构。上面的绿色部分是收益下面的红色部分是成本。ROI模型树从左到右是从根到枝干从ROI理论到实践的延伸和具象化。
![图片](https://static001.geekbang.org/resource/image/be/e2/bebf2e6673b64e11a0ff32703f7be0e2.jpg?wh=1920x1346 "ROI模型树")
ROI模型展开的这棵大树告诉了我们健康的自动化测试项目长什么样子。但是还有一个现实的问题我们怎么从这里到那里换句话说咱们怎么把自动化测试项目的节奏带起来让它进入到一个不断提升ROI的轨道上去。
这里有一个很朴素的道理,好马是跑出来的,好钢是炼出来的。首先,要让自动化测试跑起来,增加它的运行次数,这是前提条件。在这个过程中,再修复它的问题,调整它的集合,提高它的可诊断性,整个项目就激活了。
所以你要找到更多的土壤让自动化测试落地生长。如果你想在工作中推广自动化测试哪些落地场景更容易出业绩呢除了之前说过的回归测试领域我们不妨把眼光从测试工作放宽到更多的领域Dev和Ops领域自动化测试在这些领域里一样可以发挥价值我叫它自动化测试左移和自动化测试右移。
## 自动化测试左移
如果把软件的生命周期的一个个阶段,软件需求分析、软件设计、软件开发、单元测试、集成测试、系统测试,从左向右排列,开发活动在左侧,测试在后面也就是右侧。如下图:
![图片](https://static001.geekbang.org/resource/image/dd/7e/dd3a0yy1cf966aa256381d98c874eb7e.jpg?wh=1920x596)
测试左移,就是说本来在生命周期后期的测试活动提前,在软件开发阶段就参与进来,能让软件质量内建到开发阶段,而不是在后期通过软件测试去发现。比如在需求分析阶段参与需求评审和规范制定,在软件设计阶段就开始测试案例设计。形象地看,是测试活动从右侧向左侧移动,即测试左移。
![图片](https://static001.geekbang.org/resource/image/2d/98/2d6ac663a3887698a082bec930e03698.jpg?wh=1920x761)
测试左移后当然也会带动自动化测试的变化。在传统模式下按照软件生命周期顺序自动化测试是这么安排的编码完成之后运行单元测试集成阶段运行接口测试系统阶段运行UI自动化测试。
![图片](https://static001.geekbang.org/resource/image/dd/b4/dd932dfef516dc7cd67faf0d94cf42b4.jpg?wh=1920x744)
这种流水线做法只能说中规中矩那还有优化提升空间么从图上看到我们如果在编码阶段引入了bug影响接口的bug要等到集成测试阶段才能发现影响UI的bug要等到系统阶段才能发现。我们既然已经有了接口和UI自动化测试可不可以把它们利用起来尽早测试呢
现在我提出一个新概念自动化测试左移在构建阶段建立一个冒烟测试集合的概念包括单元测试和部分接口测试甚至部分UI自动化测试它们一起运行来验证版本的每一次构建甚至代码的每一次提交。只要这个冒烟测试集合足够快和稳定就可以被开发人员接受。
![](https://static001.geekbang.org/resource/image/01/ee/0130fa2b9b66a43832a522dc39d528ee.jpg?wh=4563x1975)
自动化测试左移都有哪些好处呢?
最直观的好处是提早确认代码的变更满足最终需求尽早发现回归bug。软件测试领域有一个理论叫做**验证**和**确认,**在每个软件阶段,都要做两种测试工作:第一是验证当前阶段做好了本阶段要求的事情。比如,编码阶段要把详细设计实现;第二是确认当前阶段实现的功能,可以满足最终的用户需求。
应用到具体场景里在编码阶段做单元测试这叫验证在编码阶段运行接口测试和UI自动化测试则是确认都是有价值的测试活动。
此外,自动化测试就像一辆赛车,需要运行调试、持续保养维护,才能调整到最佳状态。
我见过一些团队只在软件产品发布的时候才把开发出来的UI自动化测试作为验收测试运行一次。这样UI自动化测试大概率会失败测试人员不得不花时间一一解决。不难猜到在整个发布周期里UI功能都变化了很多相应的漏洞更是不可胜数。久而久之测试人员就对自动化测试产生了厌烦把它看成摆设、负担又重归手工测试的状态。
而自动化测试左移到开发的日常活动中开发人员每天做一次code commit做一次版本构建就会触发自动化测试运行频率随之提高。一旦自动化测试运行失败要么是发现了回归bug要么是自动化测试需要维护了问题发现得越早修复越快自动化测试就越健康越稳定可用。在磨合调试的动态过程里自动化测试越跑越稳定高效团队也能实实在在体会到它的用处。
所以自动化测试左移在结果上提高了ROI丰富了运行场景也锻炼了自动化测试项目和人马。火炼真金大浪淘沙方能走向成功。
## 自动化测试右移
既然有左移,那也存在右移。测试的右移是什么?测试阶段结束,产品就会上线,也就进入了线上运维阶段。所以测试右移是指**测试活动介入线上运维,用户画像等工作**。这里我说的自动化测试右移,意思是自动化测试也可以在生产环境里运行,起到一个自动检查监测的作用。
你可能会问线上观测已经有了一套Ops流程和工具了比如Newrelic和Splunk等都能监测Web服务、API网关数据库等全栈环境了。自动化测试线上运行的价值在哪里
这是一个很好的问题。如果你想到了这一层面说明离我们的右移的落地场景很近了。我们不可能把所有的自动化测试都搬到生产环境里这样会造成和Ops团队的重叠浪费。
### 部署后验证测试
Ops工具看似很强大能输出一堆软件服务的各种度量指标告诉我们软件服务在生产环境里是健康运行的但是有一个关键的事情我们无法从Ops那里得知那就是**服务是不是按照客户的期望运行的,这对产品价值非常重要,但只有运行测试才能知道**。
结合具体场景,我们分析一下这个问题是怎么产生和解决的。
线上升级常用的做法是红绿部署(也叫蓝绿部署)。红绿部署的机制是这样的,当准备升级软件服务时,保持原有的服务红色环境不变,部署一套新的服务绿色环境。在路由层面,把流量切换到绿色环境,完成软件的升级。这样做的好处是,软件升级对用户影响微小,风险也可控。
![](https://static001.geekbang.org/resource/image/24/19/2436efdc7754257459ea9eaa5f787319.jpg?wh=2755x1288)
在这个红绿部署机制里,红环境代表是即将退役环境,绿色环境是健康即将上线环境,那么一个关键问题是,怎么确定环境是红的还是绿的?
环境是绿的意味着对于用户来说一切正常。这个“正常”的标准有2个含义一是Ops的服务健康指标都正常二是测试的结果也正常这个测试集合在业内英文名叫Post Deployment Test中文叫部署后验证测试。意思是在生产环境完成部署或升级后需要验证业务功能正常运行。
通过Post Deployment Test的通过与否来设定环境是绿色还是红色。像下图
![图片](https://static001.geekbang.org/resource/image/9a/75/9a48f91415e62509044f7fae175de575.jpg?wh=1920x1129)
这样Post Deployment Test结合部署的红绿机制可以形成一个发布升级环境切换的决策流程。我们又一次丰富了自动化测试运行的场景让它变得“有用”。
### 生产环境定时监测
部署升级后,生产环境就开始运行了,直到下一次升级为止。在这段线上运行的时间里,是不是就不再需要测试了呢?
按照传统测试理论测试的生命周期到正式发布为止也有的到Beta测试为止而部署到生产环境后就进入了运维阶段就是Ops工程师的事了测试人员就不需要关注了。
但在云时代情况发生了变化。软件开发方不仅交付软件服务而且也控制着服务器的运行环境。因此测试人员的责任从“在软件发布之前发现bug”变成了“在客户之前发现bug”。
有很多bug在测试环境里是发现不了的只有生产环境才能暴露。这些跟客户的行为、生产环境的数据、特定的错误扩散模式都有关系。只要我们在客户遇到bug之前发现它测试工作仍然是有价值的。
这时我们可以建立一个机制,通过自动化测试来定时监测生产环境。每天定时触发自动化测试任务的运行,去检测生产环境的业务功能是否正常,然后生成测试报告。
![图片](https://static001.geekbang.org/resource/image/1a/35/1a82912b949edf4e5dc180fffbf2f835.jpg?wh=1920x1174)
对于自动化测试生成的结果报告我们还可以把它集成到Ops的Oncall流程里去。当自动化测试任务出了错误触发Event时就会进入到Oncall系统。Oncall系统会找出值守的测试人员发送通知让测试人员来处理测试错误判断是不是线上出了bug。
![图片](https://static001.geekbang.org/resource/image/b7/00/b7419b7a9e3f49934065061f3e644600.jpg?wh=1920x1114)
这个机制一旦建立起来,会大大锻炼你的测试人员队伍,因为你每天会收到各种告警,需要去处理,直到你真的把自动化测试的健壮性和稳定性,提升到一个“可信”的程度。
## 小结
这一讲我们一起总结了自动化测试的ROI模型树还有种种可以提高自动化测试收益的落地场景。从业界来说有左移和右移这两个大领域使得测试的工作不再局限于原先的那个圈圈里而是向Dev和Ops方向延伸并和它们融合。
![图片](https://static001.geekbang.org/resource/image/be/e2/bebf2e6673b64e11a0ff32703f7be0e2.jpg?wh=1920x1346 "ROI模型树")
这个左移和右移已经不是在理念阶段了,而是业界正在发生的事情,参看[2022世界软件质量报告](https://lp.katalon.com/hubfs/download-content/report/The-State-of-Quality-2022.pdf)有38%的公司已经在Ops领域开展测试了而且这个数字还在增长。但是要完成左移和右移并不容易。据我了解很多公司还没有做好准备一个重要的方面是意识上还没有转变。
今天你学习了本模块的ROI模型之后知道ROI是我们自动化测试工作成败的命脉那你不妨换个思维角度像做销售一样向团队向公司积极布道你的自动化测试成果让更多的角色来使用你的服务。
这块不局限于Dev和Ops团队甚至可以是Product Manager团队自动化测试代码调用是一个非常好的服务模式一旦他们开始使用就相当于你的服务有了客户可以通过客户的反馈持续打磨你的服务**这个服务的最后结果就是自动化测试持续输出“有用”和“可信”的结果**。
在“有用”和“可信”基础上如果再加上一个要素的话我认为应该是“快速”自动化测试服务的输出是当前的被测系统是否OK没有人愿意忍受等几十分钟才能获得服务的结果。在Devops理念横行的今天人们的耐心越来越低你应该让自动化测试运行得精准、快速、高效。这给自动化测试提出了更大的挑战。
如何应对挑战,我们后续课程还会提出更有针对性的解决方案。是不是很期待下面的内容?那就准备好进入下一模块吧。
## 思考题
今天留两个题目,你可以任选一个有兴趣的聊聊想法。
1.什么是蓝绿部署?蓝代表什么?什么条件下变成绿?
2.学完这讲内容,你觉得自己手里负责的工作有没有左移或右移的空间呢,具体你想怎么做?
期待你在留言区跟我交流互动,如果这一讲对你有启发,也推荐你把它转发给更多同事、朋友。