敏捷开发浩浩荡荡流行了20多年,彻底改变了软件研发行业。如果说敏捷开发对产品、开发和测试这三种类型的工作哪一个影响最大,我会选择测试。
因为敏捷开发模式下迭代周期缩短,很多问题会更集中地暴露出来,比如用户故事拆分往往不够细致精确、开发和测试无法并行展开、开发人员的测试意识薄弱等。诸多问题都会累积到测试环节集中爆发,所以从这个角度来讲,敏捷开发对测试的影响会更大。
可能你已经注意到,我说的是测试环节,并没有说测试人员。原因在于敏捷开发模式下质量保证应当由整个团队来负责,而不应该单单是测试团队的职责。
之前我到杭州出差,和原来阿里妈妈的同事聚会,聊到了阿里在推动去测试化,由研发团队自己来做测试工作。我在网络上搜索了下大厂的去测试化相关的话题,也是众说纷纭,实际情况就不得而知了。不管怎么样,开发模式的变化、技术的变化,都给测试工作带来了越来越多的挑战。业内也有很多老师对测试工作有很好的论述,比如全程软件测试、测试左移右移、质量内建等等,大家可以自行搜索下这方面的资料书籍。本篇文章更多地想从项目、产品、开发和测试这几个角度来谈谈禅道团队在做的实践。
首先来说说项目的多快好省。这是大家耳熟能详的一个组合,也代表了管理层对项目的期望。希望可以有高产出,又快又好,同时又节省成本。但我认为这只是一个美好的愿望,现实情况中往往是事与愿违。应该按照好快省多的方式来进行。
第一要紧的就是质量,项目交付的东西一定是要有价值、有质量保证的,这是大前提;然后是快,用小步快跑的方式加快交付速度,及时获得用户的反馈来调整产品方向;在这个过程中,要尽量减少浪费,达到控制成本的目的;最终积少成多,达到多的客观效果。
如何做到好快省多呢?那就需要整个团队都重视质量,重视测试。这个团队包括产品经理、开发人员和测试人员。每个角色都需要增强质量意识和测试意识,来保障自己交付物的质量。
我们先来看产品经理应当如何增强质量意识和测试意识。敏捷开发模式下面产品经理主要的输出物是用户故事。输出精确定义过、有明确验收标准、方案可行的用户需求,并能及时参与沟通并确认需求,是产品经理质量意识和测试意识的最好体现。
首先是把用户故事拆细,定义清楚。我们团队今年新入职了很多产品经理,他们之前更习惯于画原型图。我就逼着大家先写用户故事,训练大家能够把用户故事拆分出来。然后再训练大家能够用简单直白的文字将需求表达清楚,如以下要求:
- 需求标题尽量用动宾结构,少用复杂的语法结构。
- 用户角色要认真思考,真正站在真实用户的视角考虑问题,而不是笼统地用“用户”来代替。
- 用户故事应当保持独立,不要将若干个事情放在一块来描述。
- 尽量使用短句,不要用长句。有一些众所周知的定语状语可以省略,以减少理解成本。
- 要有清晰明了的验收标准。验收标准是对需求场景化的描述,是对需求描述很好的补充,研发人员和测试人员可以通过验收标准加强对需求的了解。
关于验收标准如何撰写,可以参考融项目管理实践库里面的实例化需求实践。
对产品经理进一步的要求是懂点技术。对于禅道这样的技术性比较强的产品来讲,如果不懂技术很多需求提不出来。提出的需求要想办法保证解决方案是可行的,比如可以在计划会议前找研发骨干确认方案可行性,避免开发过程中才发现不可行或实现成本高,毕竟重新调整需求的成本远高于最初就确认好。
除了上面的工作外,产品经理还应当积极参与日常的沟通并及时确认需求。产品经理再怎么优秀,也是无法把所有的细节都考虑到的,这就依赖于日常的沟通和需求的及时确认。尽早的发现因为需求不完善或者开发人员理解不一致导致的问题。可以节省大量的成本。
一位产品经理能够做到上述几点,我们可以认为他具备了足够的质量意识和测试意识。
我们再来看开发人员如何培养质量意识和测试意识。很多开发人员从来没有站在测试角度考虑问题,只考虑功能实现,往往会忽略很多异常情况、边界值、安全、性能等问题。
为了解决这个问题,我们采取的措施是让开发人员每天开始编码之前写测试用例,然后进行评审,这样可以训练开发人员的质量意识和测试意识。具备质量意识和测试意识之后,再做其他的实践就更容易:做单元测试,测试用例的覆盖情况就比较充分;做结对编程也可以站在不同的角度思考;做代码评审可以看出更多的问题。在这个基础上我们也在要求开发人员做单元测试,做好自动化测试的覆盖。将来条件成熟的情况下,我们会尝试下TDD开发。
对开发人员更进一步的要求是拥有用户意识,能够站在用户的角度来考虑问题。产品经理整理的需求再怎么完善,也会有涉及不到的地方。这时候就很考验开发人员的综合能力,要尽量站在用户角度提出自己的建设性的意见,帮助产品经理弥补需求的不足,或者完善细节的体验和交互的问题。
如果一位开发人员具备了比较好的质量意识和测试意识,同时也能够站在用户角度思考问题,他所开发的产品的质量和用户体验是有保障的。
从测试人员角度来讲,我觉得最大的挑战就是快速响应能力,即如何在短周期迭代里面能够按期、保质地完成迭代的测试任务,保证产品的质量。想要达到这样的效果,测试人员除了提升自身的业务能力之外,还需要掌握足够的自动化以及自动化测试的能力。业务能力包括对功能熟悉程度、学习能力、缺陷判分析、沟通表达能力等,就不再赘述。下面重点说一下自动化和自动化测试的能力。
自动化是指充分地利用各种各样的工具来减少重复、提高效率的能力。我们对测试同事的训练就是让大家把测试环境都迁移到Linux下面,平时测试都是使用Shell + Vim工作。我们还给大家买了很多必读的书,定期组织大家学习,写读书笔记。实际的效果还是很明显的,我们很多测试同事刚加入团队的时候基本上没有用过Linux,现在都可以熟练使用Linux来完成日常测试。
对测试人员更进一步的要求就是全自动化测试。从迭代最初就开始准备自动化测试,比如测试环境开通的脚本、测试数据的准备、测试方法或者工具的寻找到自动化测试方案的设计、抽象、实现以及规模化脚本的开发和维护。
如果能够做到这一点,就可以真正做到持续集成、持续测试了。当然做到这一点确实很难,但确实也是可以做到的。通过充分的自动化测试的覆盖,我们才可以提高回归测试的效率,进而有更多的时间来做探索性的测试,挖掘更多有价值的缺陷。
敏捷开发浩浩荡荡,越来越流行,要想好快省多地完成项目,就需要整个团队提升测试意识,做好各自分内的工作,保证自己环节交付物的质量。与大家共勉。