1.1.4 测试左移的进阶实践
为了系统性解决软件测试工程化的困局,我们需要重新审视测试左移的原则与实践,在原有测试左移实践的基础上加入新的原则和实践。新时代的测试左移给整个软件测试体系带来了理念上的转变,软件测试不仅仅是在研发过程中发现缺陷,更要致力于在研发全过程中有效推行质量内建,把软件测试活动升级为软件质量工程。为此,我们需要引入以下测试左移的原则和实践。
1.软件质量全员负责制
软件质量全员负责制也可以称为“利益绑定”,这是很关键的一条原则,属于底层逻辑的范畴。在体制设计上,必须让整个研发团队共同对软件产品质量负责,毕竟软件质量不是测出来的,而是开发出来的。如果软件质量出现问题,应由整个研发团队共同负责,而不是让测试团队“背锅”,这种认知上的进步与变革是测试左移能够顺利推行的基本前提。
我们知道,保姆型团队对组织成长是有害的,只有支持型团队才能够发挥更大的价值,从而推动组织更好地成长。当软件质量由整个研发团队共同负责的时候,测试团队就能完成从保姆型团队向支持型团队的蜕变。
2.把测试前置到需求分析和方案设计阶段
在测试左移的早期实践中,测试活动已经被前置到开发阶段,我们可以进一步把测试前置到需求分析和方案设计阶段。这样,测试人员除了能够深入理解需求,在前期掌握详实的需求信息,更重要的是还能够及时评估需求本身的质量,比如分析需求的合理性及完整性等。这样后续的测试分析与测试设计才能有的放矢地开展,实现测试用例先行,争取一次性把事情做正确,避免产生“信息孤岛”以及由此产生的各种潜在返工。
这里推荐使用行为驱动开发(Behavior Driven Development,BDD)和特性驱动开发(FeatureDriven Development,FDD)的方法,在进行需求评估时更多地从测试视角去思考问题,按照编写用户故事或用户场景的方式,从功能使用者的视角描述并编写测试用例,从而让产品经理、开发人员和测试人员着眼于代码所要实现的业务行为,并以此为依据通过测试用例进行验证。
当然,以上实践对测试人员也提出了更高的要求,他们必须掌握行为驱动开发、特性驱动开发、领域驱动设计(Domain Driven Design,DDD)以及实例化需求(Specification By Example,SBE)等技能。
3. 鼓励开发人员自测
一方面开发人员必须对软件质量负责,另一方面测试活动正在不断渗透到开发的各个阶段,同时对测试人员的技能要求越来越向开发人员看齐,由开发人员自己来承担测试工作的诉求正变得越来越强烈。我们需要的不再是独立的开发人才和测试人才,而是全栈型人才。在这种大背景下,开发者自测就变得理所应当了。我们要将传统职能型团队重组为全栈团队,不然质量左移、质量内建只会流于表面。
但是说到让开发人员自己完成测试工作,我们常常会听到很多质疑声,质疑的焦点是开发人员是否适合做测试,这里我们展开讨论一下。
从人性的角度来看,开发人员通常具备“创造性思维”,自己开发的代码就像亲儿子一样,怎么看都觉得很棒;而测试人员则具备“破坏性思维”,测试人员的职责就是尽可能多地找到潜在的缺陷,而且专职的测试人员通常已经在以往的测试实践中积累了大量典型的容易找到缺陷的模式,所以测试人员与开发人员相比,往往更能客观且全面地做好测试。
从技术层面来看,由开发人员自己完成测试,会存在严重的“思维惯性”——通常开发人员在设计和开发过程中没有考虑到的分支和处理逻辑,在自己做测试的时候同样不会考虑到。比如对于一个函数,它有一个 string 类型的输入参数,如果开发人员在做功能实现的时候完全没有考虑到 string类型的参数存在 null 值的可能性,那么代码的实现里面也不会对 null 值做处理,在测试的时候就更不会设计针对null 值的测试数据,这样的“一条龙”缺失就会在代码中留下隐患。
上述分析非常客观,笔者曾经也非常认同,但是在经历并主导了国内外多家大型软件企业的开发者自测转型实践之后,笔者改变了看法。开发人员其实是最了解自己代码的人,所以他们能够最高效地对自己的代码进行测试,开发人员可以基于代码变更自行判断可能受影响的范围,实现高效的精准测试。同时,当开发人员有了质量责任和测试义务之后,测试能力就会成为其技能发展的重要方向。我们说“好马是跑出来的,好钢是炼出来的”,只有通过实战,开发人员的测试分析与设计能力才能提升,进而开发的内建质量才能提升。可以说,开发者自测是软件质量提升的必经之路。
4. 在代码开发阶段借助TDD的思想
这里的TDD是指测试驱动开发(Test Driven Development),但我们并不是要照搬TDD的实践,而是借助TDD的思想,用测试先行的思路,帮助开发人员梳理和理解需求,完成更好的代码设计与实现,缩短代码质量的反馈周期,提高软件质量。
5. 预留测试时间
在做项目计划的时候,尤其在让开发人员进行时间评估时,必须为自测预留时间。一个功能可以交付的标准不仅仅是功能的实现,对应的测试也是需要时间成本的,这需要管理层进行思维转换,否则测试左移只能停留在概念层面,很难真正落地。
6.提高软件的可测试性
提高软件的可测试性是测试左移中一个重要的实践,因为它可以有效地帮助我们设计适合团队的测试策略。我们需要测试人员在参与需求分析和方案设计的过程中,能够提出相关的可测试性需求,帮助研发人员设计出易于测试的软件架构和代码模块,从而提高测试工作的效率和有效性。关于软件的可测试性设计,详见1.3节。