
1.1 软件测试的发展历程
伴随着软件行业的发展,软件测试也在不断地发展,软件测试大概经历了图1.1所示的几个重要的阶段。

图1.1 软件测试发展的几个阶段
早期软件的复杂度相对较低,软件规模也比较小,因此软件错误大部分在开发人员的调试阶段就发现并解决掉了。这个阶段的测试就等同于调试。
现在,大部分开发工具都把调试工具集成进来,调试已经成为开发人员开发工作中不可或缺的一部分。甚至测试脚本的开发工具也会把基本的调试功能集成进来。
在20世纪50、60年代,调试功能倾向于解决编译、单个方法的问题。随着需求的复杂化,软件规模越来越大,人们开始意识到仅仅依靠调试还不够,还需要验证接口逻辑、功能模块、不同系统间的功能是否正常,所以引入一个独立的测试组织来进行独立的测试。
这个阶段的测试绝大部分是在产品完成后进行的,因此测试分析方法简单、力度不足、时间有限,软件交付后还是存在大量的问题。
这个阶段没有形成测试方法论,主要靠错误猜测和经验推断。人们对软件测试也没有明确的定位、深入地思考软件测试的真正含义。
1973年,Bill Hetzel博士给出了软件测试的第一个定义,即“软件测试就是对程序能够按预期的要求运行建立起一种信心”。1983年,他又对这个定义进行了修订,改成“软件测试就是以评价一个程序或系统的品质或能力为目的的一项活动。”
因此这个阶段对软件测试的认识是:软件测试是用于验证软件产品是正确工作的、符合要求的。
但同一时期,Glenford J. Myers则认为,软件测试不应该专注于验证软件是工作的,而是将验证软件是不工作的作为重点,他提出的软件测试定义是“测试是以发现错误为目的而进行的程序或系统的执行过程”。
20世纪80年代后,软件行业飞速发展,软件规模越来越大,复杂度越来越高。人们对软件的质量开始重视。软件测试的理论和技术都得到了快速的发展。人们开始把软件测试作为软件质量保证的重要手段。
1982年在美国北卡罗来纳大学召开了首次软件测试的正式技术会议,软件测试理论开始迅速发展,随之出现了各种软件测试方法和技术。
1983年,电气电子工程师协会(Institute of Electrical and Electronics Engineers,IEEE)对软件测试做出了如下定义。
●使用人工或自动的手段来运行或测量软件系统的过程,目的是检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。
●这个阶段认为,软件测试是一门需要经过设计、开发和维护等完整阶段的软件工程。
从此,软件测试进入了一个新的时期,软件测试成为一个专门的学科,形成了各种测试的理论方法和测试技术,某些测试工具开始得到广泛应用。
20世纪90年代后,软件工程百花齐放,出现了各种新的软件开发模式,以敏捷开发模式为代表的新一代软件开发模式开始出现,并且赢得很多开发团队的拥护。
由此带来的是对软件测试的重新思考,而大部分人倾向于软件测试将与软件开发融合的观点。开发人员将担负起软件测试的责任,测试人员将更多地参与到测试代码的开发中去。软件开发与测试的界限变得模糊起来。TDD把测试作为起点和首要任务。
尽管软件测试经过几十年的发展,已经得到了长足的进步,但是与软件开发的发展比较起来,可以看到软件测试的发展还是比较缓慢的。
软件开发得益于计算机硬件的发展、计算速度的提高,还有计算机语言的发展、编译器的发展、开发工具的发展。因此比起软件早期的开发,无论是开发速度还是工作效率都有了很大的提高。
软件开发摆脱了早期的机器语言编码方式和汇编语言,跨越了结构化编程语言,进入面向对象的时代,开发人员的编程能力得到了很大的提高。而开发工具的不断改进,则起到了推波助澜的作用,使得开发人员无论是在编码速度还是调试方面都受益匪浅。
反观软件测试,虽然测试工具层出不穷,但是并没有革命性的发展。测试人员大部分情况下还是要依赖手工的测试。
软件测试受到越来越多人的重视,但是大部分的软件测试方法和理论还是沿用20世纪的研究结果。因此,软件测试的发展还需要更多热爱测试的人投入,需要更多的研究,无论是在测试的理论、方法,还是工具上。
软件测试发展比较缓慢的另外一个原因是质量成熟度模型和质量风险评估没有一个比较广泛和可用的业界标准。