当有人来问我,Google成功的关键是什么,我的第一个建议就是,不要招聘太多的测试人员。
Google在测试人员如此缺乏的情况下,是如何应对的呢?简单地说,在Google,写代码的开发人员也承担了质量的重任。质量从来就不仅仅是一些测试的问题。在Google,每个写代码的开发者本身就是测试者,质量在名义上也由这样的开发测试组合共同承担,如图1.1所示。在Google,谈论开发测试比(译注:这里指在人员数量上,开发和测试的比率)就像讨论太阳表面的空气质量一样,这本身没有任何意义。如果你是一名工程师,那么你同时也是一名测试人员。如果在你的职位头衔上有测试的字样,你的任务就是怎样使那些头衔上没有测试的人可以更好地去做测试。
图1.1 与功能相比Google工程师更看重质量
Google可以打造出世界级的软件,这也足以证明其对待质量的独特方法值得学习。或许其中的一些经验在其他的公司组织中也能适用。当然里面也有需要改进的地方。接下来所述就是关于Google测试方法的概要介绍。在后面的章节里,我们会深入到细节中,以此来阐述在以开发为中心的文化中Google是如何做测试的。
1.1 质量不等于测试
质量不是被测试出来的--这句看似陈词滥调的话却包含着一定的道理。从汽车行业到软件行业,如果在最开始设计创建的时候就是错的,那它永远不会变成正确的。试问一下汽车行业的公司,大量召回事实上有质量问题的产品,代价是多么的昂贵。因此,从最初的创建阶段就要做正确,否则将会陷入混乱的万劫深渊。
然而,这句话也并不像听起来那样的简单和准确。虽然质量不是被测出来的,但同样有证据可以表明,未经测试也不可能开发出有质量的软件。如果连测试都没有做,如何保证你的软件具有很高的质量呢?
有一个简单的办法可以解决这个难题,那就是停止开发与测试的隔离对立。开发和测试应该并肩齐趋。你的每一段代码写完后都要立刻测试这段代码,当完成了更多的代码时就做更多的测试。测试不是独立隔离的活动,它本身就是开发过程的一部分。质量不等于测试,当你把开发过程和测试放到一起,就像在搅拌机里混合搅拌那样,直到不能区分彼此的时候,你就得到了质量。
质量不等于测试。当你把开发过程和测试放到一起,就像在搅拌机里混合搅拌那样,直到不能区分彼此的时候,你就得到了质量。
在Google,这正是我们的目标,就是把开发过程和测试融合在一起--开发和测试必须同时开展。写一段代码就立刻测试这段代码,完成更多的代码就做更多的测试,但这里的关键是由谁来做这些测试呢?众所周知,在Google,专职测试人员的数量非常稀少,与开发相比根本不成比例,唯一可能的去做这些的就只能是开发人员。还有谁能比实际写代码的人更适合做测试呢?还有谁能比实际写代码的人更适合去寻找bug呢?是谁会为了避免受更大刺激而去想办法避免产生bug呢?Google能用如此少的专职测试人员的原因,就是开发对质量的负责。如果某个产品出了问题,第一个跳出来的肯定是导致这个问题发生的开发人员,而不是遗漏这个bug的测试人员。
这意味着质量更像是一种预防行为,而不是检测。质量是开发过程的问题,而不是测试问题。我们已经成功地将测试实践融入为开发过程的一部分,并创建了一个增量上线的流程。如果一些项目在线上被证实的确是bug重重,它将会被回滚到之前的版本。在确保不出现回滚级别bug发生的前提下,预防了许多客户问题的同时,也很大程度降低了专职测试人员的数量。在Google,测试的目标就是来判断这种预防工作做的怎么样。
把开发过程和测试混合在一起,密不可分,从代码审核问询时的"你的测试在哪儿",再到在卫生间张贴着的、用来提醒开发人员的最佳测试实践(注3:参见http://googletesting.blogspot. com/2007/01/introducing-testing-on-toilet.html)。测试是开发过程中必不可少的一部分,当开发过程和测试一起携手联姻时,既是质量达成之时。
测试是开发过程中必不可少的一部分,当开发过程和测试一起携手联姻时,既是质量达成之时。