软件测试价值的转变

软件测试的历史应该从程序诞生的那一天就有了,随着软件的发展,特别是互联网应用对软件发布的影响, 软件测试的价值也在逐渐发生了很多变化。 软件测试从单纯的发现软件缺陷,发展到“软件质量度量”,“预防质量缺陷” 等更大的质量范畴。随着从单纯的“质量保证” ,发展到“开发效率的提升”。     首先,我们回顾一下软件测试的定义, 1979年Fred Mayer发布的测试经典 《软件测试的艺术》(The art of software testing ),它将软件测试定义为“带着发现错误的目的,执行被测软件”,简单的说就是通常人说的:软件测试就是找缺陷,找Bug。 1995年Stephen H.Hank 写过一本书(《软件质量工程的度量和模型》) metrics and models in software quality engineering,它用工程的方法引入软件质量度量和软件质量周期的管理,质量度量包括代码覆盖率,测试用例的覆盖率和执行情况,用户满意程度,运维的质量管理等等。 2007年 微软的几个资深测试人员写了一本书"The Practical Guide to Defect Prevention "(《质量缺陷预防实践指南》 讲的就是如何通过在软件过程,方法和技术上,预防软件缺陷的产生。 2008年 喜欢数据说话的Caper Jones 推出了 "Global Analysis of Productivity and Quality"《全面分析生产率和质量》, 从经济学,软件流程等的方面分析了生产率和软件质量之间的关系,其中也包括一些好的实践。 然后,我们再看一看软件公司的变化 微软:比尔 盖茨说过 “微软是一个测试公司”,可以说微软是非常重视软件测试的,在有些团队,软件测试人员数量超过开发人员。在光盘发布软件的时代,修复Bug的成本是非常高的。随着,Internet 应用的发展,应用软件有了更加快速的发布周期,服务器端修复Bug成本降低了很多,同时通过引入Testing In Production。微软也在引入一些变化,微软的开发人员有更多的责任,进行质量保证,包括单元测试,产品中缺陷的支持等,软件测试人员更加注重E2E的测试,测试框架,提高整个软件的开发效率等。 谷歌:谷歌的开发和测试人员的比例是10:1,同时测试人员属于Productivity的部门,测试团队大部分是由丰富经验的测试人员,能够在新项目刚开始的时候,帮助建立测试框架,将其他项目好的测试经验带到这个项目中,项目执行起来以后,开发人员来编写,执行测试用例,并且对产品的缺陷直接负责。


Testing In Production 在生产环境中进行测试 摘要

Testing In Production 的概念大约出现3年前,那时候Web Service正在风靡Internet,各种系统都走向更加可扩展的架构,这使得A/B Testing和后期的数据分析更加容易。同时,整个互联网应用对用户体验提出了更高的要求,对算法的精准性的要求更加严格。另外,软件开发的节奏明显加快,这使得测试无法在发布前做的非常完善。快节奏的软件发布,对测试有了更高的要求。 “先发布,后测试”成为一种加快发布节奏的一种必要的方法。 动物学家达尔文说过 ”世界上进化下来的动物,并不是那些最强大的动物,也不是那些最聪明的动物,而是那些最能够适应变化(Responsive to change)的动物”,例如说老鼠,人,蚂蚁等等。软件系统也一样,能够传承发扬的软件,能够快速适应变化化。 TiP的核心思想就是通过在生产环境里面测试,最小化产品风险,加快发布节奏。TiP通过暴露新代码给有限用户,减少缺陷可能带来的负面影响,通过在产品中暴露这些新代码,可以快速获得这些新代码的反馈,这些反馈来之于真实的用户,而不是少量的测试人员和有限的测试用例。另外,一旦发现新代码有严重的缺陷,那么TiP需要快速修复这些缺陷,通过发布新版本或则滚回到老版本。 那么这是不是对软件质量的一种妥协呢? 我觉得不是,相反在生产环境中测试可以更好的满足用户,它是传统发布前测试的一个积极的补充。例如,TiP可以帮我们提高测试覆盖率,找到一些平时无法测试到的场景。 我相信,所有的互联网软件都需要支持TiP,这是互联网软件的特性决定的:灵活的软件架构,快速的发布周期。 考虑一下几个问题可以帮助我们思考什么类型的软件最适合TiP方法。 用户体验和经济利益影响的程度 如果产品有问题,是否有能力快速检查产品中的问题,并且快速回退到没有问题的版本? 软件发布的频率? 进行TiP 所带来的成本和收益 这里有几个TiP的例子 1) 微软:在互联网的产品开发过程中,微软也大量利用了TiP的方法 a. 很多用户场景的改进,都是通过A/B测试获得最好的效果 b. 算法实验,在灵活的平台中进行算法的调优和筛选 2) Facebook : Facebook如何发布代码的 Link a. Facebook有多个级别的代码部署 (内部的,少量外部的,全部外部的等等..), b. 如果有问题出现,工程师马上修复问题;然后重新发布 c. Ops负责部署的实际过程,包括检测产品的健康状态(错误日志,CPU,内存,甚至包括用户的行为变化等) 3) Google: 非常善于做A/B测试 a. 谷歌在算法改进方面,就是利用在产品中的实验平台。一个搜索结果中可能包括多个算法的结果,另外不同的搜索可能触发不同的算法。最后通过用户的反馈,对算法进行评价和挑选。 一些参考资料: 人物: Seth Eliot 微软测试经理,Testing in Production的倡导者 Blog 参考文章: 1)…