从微软的今天看软件测试的明天[1] 软件测试
陈天的办公室并不小,但却因堆满了机器而显得狭仄不堪。他解释说,因为微软亚洲工程院(ATC)部门准备扩充,而“新的几个实验室还在装修中”,所以就形成了现在的这个局面——几十台Dell主机和一箱箱显示器堆放在眼前的办公空间里。当听说微软亚洲工程院的测试工程师人均拥有四五台计算机、且正在搭建的测试实验室将拥有上千台机器时,我跟陈天开玩笑说,看来你是微软亚洲工程院最大固定资产的拥有者,陈天微笑着对这一判断表示认同。
“人机比例”如此悬殊,并不是说微软亚洲工程院的软件测试工程师都是多臂超人——事实上,这是由微软独特的软件测试文化所决定的。陈天表示,“微软的软件测试80%-90%都是自动化的。所谓自动化,就是由测试工程师写出测试程序来运行测试案例,而并非人们所想象的人工点、点、点的那种测试方式。”
在拜访微软亚洲工程院之前,提到微软的测试,我会想到比尔盖茨说的一句话:“很多人都认为微软是一家软件开发公司,而事实上,我们是一家软件测试公司”。这种说法也让我们对微软亚洲工程院的测试团队充满了好奇。
微软亚洲工程院创立之初,仅有两位从微软亚洲研究院转过来的测试人员,而且这两个人还不属于任何一个组,只是在项目组有测试需求的时候临时帮一下忙。对于一支完整的产品开发体系,软件测试团队是极其重要的组成部分。因此,院长张宏江对此高度重视——于是,从微软总部找来了在微软从事测试五年的陈天和周庆晖担当起了搭建微软亚洲工程院软件测试团队的重任。
招募到合适的测试人员是工作的第一步,由于国内对软件测试工作的重视不够,有经验的人员因而少得可怜,培养刚毕业的学生便成为了优先的选择,不过,“我们的学生由于勤奋好学成长得很快”。到现在,微软亚洲工程院已拥有一百多名测试工程师,其中有一些人已经成长为技术骨干和Leader.在微软的测试体系中,主要的测试人员分为两种,一种是SDET(Software Design Engineer Tester),一种是STE(Software Test Engineer)。对SDET编程能力的要求和对开发人员的要求基本上是一样的。他们都须有扎实的计算机基础知识和编程能力。区别可能在于开发人员对算法更加精通,或某一方面的技术钻研的更深入一些。而微软亚洲工程院要求SDET的技术面很宽,要能使用很多种技术,比如可以用C、C#、脚本等来写程序。陈天说:“我喜欢在面试的时候看他们直接在电脑上编程。如果一个人经常写程序,他调试程序的表现会与编程不熟练的人有很大的不同。”
因为SDET懂开发,有扎实的编程能力,所以他能够做一些其他普通软件测试人员做不了的工作,比如可以将源代码打开做代码的静态分析,还可以做测试用例的代码覆盖率调查。所谓的代码覆盖率调查,是指考察测试用例能否将所有的源代码都调用到,是一种对测试质量的初步评估标准。
更高深的一些测试方法还包括错误注射(Fault Injection),也就是将错误注射到源程序中。因为很多错误很不容易在某种机器环境中出现,比如一个用户的机器内存特别少的时候,微软要求程序仍然不能丢失数据和发生安全漏洞,但测试人员不能把测试机器的内存拆下来,也不能非常精确的把内存消耗到期望的数值,这时他们会通过注射一段代码来模拟内存的分配。要做到这点,需要掌握编程及熟悉操作系统的内存分配算法。由于SDET的存在,微软可以更加有效地对软件进行测试。
当然,STE的角色也很重要。这些人必须非常聪明,解决问题的能力特别强;有钻研精神,绝不放弃;很细心,而且很有创造力。陈天说:“好的STE不是只按照规定好的测试用例来执行,而是可以想到很多一般用户想不到的地方,他可以用非常规的思路来寻找软件的bug.而且他会懂很多各种各样的软件。事实上,很多bug不是在程序本身找到的,而是在其与其它程序交互时找到的。”不过,就测试工作而言,微软未来的趋向是,纯粹的STE将越来越少,而且微软会要求STE“也要学会用程序工具去进行测试”。
普通的测试工程师若想臻至“优秀”,需要经历很长的阶段。除了要学习很多测试方面的技巧外,还需对测试全局有着全面的了解和充分的掌控——这同样是实现个人成长的重要前提。“测试人员一开始学到的信息都是分块的,比如开始会写测试用例,后来知道了要做代码覆盖率,而后可以学到更深的知识,但最终是要把这些知识都融会贯通起来,大家都需要经历这样一个过程,这是很难避免的。”陈天说,“因此,我要求大家不要只看自己做的部分,而要看其他人做的事情,要看产品开发到哪个阶段,就像玩拼图一样, 只有对整个软件开发流程了解,这个时候你才知道每块拼图应该在哪里。” 为了让软件测试工程师更快速地成长,微软亚洲工程院经常让大家转换角色,轮流负责不同的任务,或者将一个大的部分拆分为几个小块,每个人负责其中一个小块的全部测试内容。