谨以此书献给我的妻子Nell,感谢她在我用周末和假日写书的时候给我持之以恒的鼓励。
Jerry
谨以此书献给我的好朋友Carolyn,她的提醒、建议、和激励让我成为了一个更好的人、更好的父亲、并更加感激这个世界给予我们的美丽。
Ray
译 者 序
软件测试是软件开发过程中不可或缺的阶段,自20世纪70年代开始,业界就公认,在一个典型的编程项目中,测试会占到一半乃至更多的时间和资源。30多年来编程语言和软件开发技术的发展日新月异,今天我们拥有了更成熟更丰富的手段来便利地构造精妙复杂的软件,但是测试依然扮演着同样重要的角色。并且,随着计算机软件技术在各行各业的普及运用,人们对软件质量的要求也越来越专业化和多样化。软件开发团队必须尽可能地在交付产品之前控制未来的质量风险,这就必然需要依赖于卓有成效的软件测试。
软件测试远比人们所直观想象的要复杂,哪怕是测试一个简单的系统,也会是一个潜在的旷日持久的任务。在经费和进度紧张的情况下,测试者需要切合实用的技术,亲自实践的经验和正确的策略来有效而高效地进行软件测试。
在现实生活中,有效而高效的软件开发技能常常成为业界人员的热门话题和追逐目标,有效而高效的软件测试技能却相对为人们所冷落。正如软件测试泰斗Glenford Myers在其经典著作《软件测试艺术》中所言,“我们的学生每年毕业进入业界,几乎全无软件测试方面的知识,甚至,我们几乎从未指导过学生应该如何来测试和调试他们写下的课程程序。”本书作者在对美国21所大学进行的一个调查中发现,其中18所大学均没有开设任何软件测试方面的课程。这说明软件测试的培训与教育并无法满足当今IT产业的需求。
这个现象在中国的软件产业中也有所反映,尽管客户对高质量高可靠度软件产品的需求日益增加,尽管软件测试愈来愈为国内业界重视,高效的软件测试工程师依然是各开发团队争相网罗的人才。另一方面,随着敏捷开发方法等新一代软件工程概念的风靡,软件编码和测试过程多次迭代,测试人员更积极地参与到软件生命周期的各个阶段中,使得整个项目团队收取事半功倍的成效。编码和测试人员越来越紧密地协同工作,优秀的程序员必然需要了解测试的方法和概念,优秀的测试人员所具备的技能也不再是仅仅是对现成的程序进行直观的功能测试,软件测试的涵义和策略日益复杂,软件质量风险控制涉及到愈来愈多的方面。故而软件企业对员工进行测试概念、过程、技巧、工具等方面的培训,能显著地提高整个团队的工作效率。
本书就是在这样的产业与教育背景下的产物。本书的原作者旨在为有意走上软件测试工作领域的计算机专业的大学生以及其它专业人士提供一本基础性的、综合性的软件测试教程。我们相信本书所提供的软件测试方面的系统知识一定会为软件测试培训与教育的推广提供很好的促进作用。
本书深入浅出地介绍了软件测试的基本概念与方法,提供成为一个成功的测试专家所必须具备的技术与知识体系。全书中选择丰富有趣的例子贯穿全书,由简单到复杂,让读者可以轻松地掌握测试的关键技术。本书的主要内容如下。
* 引言(第1章) 简单介绍了测试的基本目标,从生活中非计算机相关的例子,比如购车过程中出现的与测试类似的活动入手,形象地介绍了测试的基本目标。
* 准备知识(第2~5章) 简要介绍了本书测试活动所使用的软件开发生命周期模型,所采用的结构化测试技术的基本流程,以及流程中所涉及到的主要问题。
* 常用软件测试技术(第6~9章) 详细介绍了常用的几类测试技术,包括静态测试、功能测试、结构(非功能)测试、性能测试等。针对每类测试技术中的每一个具体的技术都做了详细的介绍与分析。
* 测试环境与自动化测试工具(第10~11章) 软件测试离不开好的测试环境与自动化测试工具的支持。
* 测试结果的分析与解释(第12章) 讲解如何对测试结果进行分析,如何阅读和解释测试结果,特别是采用统计学的方法分析测试结果的方法。
* 一个跨越整个软件开发生命周期的测试实例(第13章) 通过针对一个应用进行整个软件生命周期的测试的过程的介绍,让读者看到如何把前面介绍的各种测试技术应用到实际的软件测试中。
* 软件测试高级知识(第14~15章) 包括复杂应用程序的测试,以及测试的未来发展方向的简要探讨。
由上述章节的安排可以看出,本书不仅涉及了软件测试的基础知识与基本技术,同时还介绍了一些普通的测试教程中很少涉及的内容,其中主要包括跨越整个软件开发生命周期的测试方法,以及用统计学的方法来进行测试结果的分析等。这些测试相关的理论有比较高的学术价值,可以为测试实践活动提供更好的指导。
本书适合从事软件测试与软件开发的IT从业人员或者高等院校计算机专业的高年级本科生以及研究生阅读。
本书中文版由北京大学郭耀博士负责翻译工作的总体组织与校稿。参与部分章节翻译工作的包括北京大学的博士生王啸吟、王立杰、刘殿兴、张磊、邵津、邵凌霜、王波等人。
由于译者的水平有限,书中错误与疏漏在所难免,敬请读者批评指正。
译 者
软件测试:跨越整个软件开发生命周期
序
III
序
作者进行过的一个非官方调查表明:在接受调查的21所美国大学中,有18所没有开设任何软件测试方面的课程。在走访仅有的三所开设软件测试课程的负责教授时,我们认识到开设软件测试课程的困难很大程度上在于缺乏一本好的教材。我们得知他们目前在选择教材时,需要三四本书组合起来才能覆盖相关的许多话题,然而还有很多重要的话题还是没有办法涉及到。这种情况使得讲课教师需要自己补充很多内容。但如果讲课教师本身缺乏软件测试的背景,那么教材本身的缺陷是很难弥补的。
虽然这样的现状看起来比较令人沮丧,然而相比美国而言,欧洲和亚洲的大学及产业界似乎对软件测试的专业技能更为看重。相比在美国21所大学中仅有3所开设相关课程,欧洲的大学中大致有七成学校均开设了测试相关课程。这种差别的原因在于他们的文化中对软件测试价值的看重已经不需要借助于一本全面的基础教科书来进行推动了。
软件测试的重要性
本书提供了软件测试的基础性概念和方法。这个话题的重要性在于两方面。第一,按照美国政府的调查,自2000年起,低质量软件造成了大约595亿美元的损失。第二,虽然现在有价值222亿美元的测试人员工作机会,作者却难以找到经验丰富的软件测试人员,这说明现在对经验丰富的软件测试人员的需求仍然很旺盛。
这个话题是值得专门出书论述的。因为就作者的意见来看,目前并没有单独一本全面的软件测试教科书能给刚入门的软件测试人员提供全局性的指导。目前有很多偏重某方面的、非常深入的软件测试书籍,它们可能比较适合于有经验的测试人员,然而这种较为深入的书籍容易让测试新手感到迷茫和沮丧。我们的任务就是为这些测试新手提供一个完整的软件测试概览:包括当前的实践技术、未来的实践技术以及作为选择职业生涯的指导。
本书所采用的方法
本书的写作采用了四个角度相结合的方法。第一,它使用诸如买车这样的非技术性的例子,来阐述一个测试人员的思维方式;第二,它详细介绍了着重于测试规划的结构化测试方法;第三,它考查了如何选择软件测试方法以及它们通常在软件开发生命周期中的何时被使用;最后,它引领读者们从头至尾地跟踪一个软件项目,阐述了如何在这个过程中适当地使用软件测试方法——这些方法在前述章节都是单独进行讨论的。
本书的特色
本书的最大特色在于:
* 本书包括了对于一个专业技术人员想要成为一个软件测试人员所需的知识的全面介绍。本书的表述包括了由浅入深的实例。书中所采用的描述和例子更多是针对实践者,而非学术研究人员。
* 本书包含专门一章用来讲解分别使用简单的和复杂的数学模型来对于测试结果进行有效地分析。我们还没有看到有其他的软件测试教材使用统计学方法对测试结果进行分析。正相反,其他软件测试教材的作者们认为统计并不属于测试教材的范围。
* 本书采用了两个案例。
案例A 第一个案例使用了Sun Microsystems公司开发的一个很流行的Internet应用PetStore2,该案例用于展示使用Java来开发应用系统的最佳实践。通过给读者提供的练习,本书阐述了如何在这个众所周知的应用程序上,规划和执行本书第7章到第12章中所提出的方法。对读者来说,这样做的好处有两方面。第一,提供给读者一个非常适合动手练习的应用系统,以便于读者获得直观的感受,以加强对本书所描述的方法的认识。第二,当读者成功地完成了本案例的练习之后,他们可以在简历上声称他们拥有对企业所认可的应用系统进行测试的经验。
案例B 第二个案例(第13章)是对一个成功的测试项目的一步一步的描述和练习。这是一个真实的项目,因此在整个过程都会遇到很多困难。这个案例给读者提供了一个将前述章节中独立阐述的概念与方法,以及在案例A中的动手实践的内容,进行融会贯通的机会。
本书的组织
第1章提供了一个对测试的概述,涉及了以下一些话题:测试的目标和局限性、测试的价值与开销的对比。第2章描述了测试所在的系统开发生命周期(SDLC)。讲述了SDLC的一些主要模型,如瀑布模型、原型开发、快速应用开发(rapid application development)以及逐步开发方法。本教材使用逐步开发方法作为它的基本软件开发框架。
第3章提供了结构化测试的概览,介绍了一种通用的结构化测试方法——SPRAE,这种方法包含下列部分:SPECIFICATION(规约),PREMEDITATION(预先策划),REPEATABILITY(可重复性),ACCOUNTABILITY(责任说明),以及ECONOMY(经济性)。接下来,第4章介绍了四个基本测试策略——静态测试、黑盒测试、白盒测试和性能(负载)测试。我们使用二维和三维的“棋盘”来阐述这些基本的策略。当这些基本策略确定之后,测试规划就可以开始进行了——这是我们在第5章所阐述的内容。本章我们提供了一些在真实世界中撰写测试计划和测试用例的指南。
第6~9章详细解释了第4章中所提到的测试的四种基本类型。第6章解释静态测试,第7章解释功能测试,第8章解释结构(非功能)测试,第9章解释性能测试。上述章节的内容都是细致而完善的,比如说,对结构化测试的讨论包括了接口测试、安全测试、安装测试,还有一个被称作是冒烟测试(Smoke Test)。
在理解了测试的机理之后,第10章将关注点转移到了测试环境上,讲解如何分辨好的和坏的测试环境。接着,第11章描述了自动测试工具的重要性。第12章讲解了如何分析和解释测试结果。
在打好了上面的基础之后,第13章基于本书的第一作者在科罗拉多州的一个项目,介绍了一个完整的软件开发生命周期的案例。
在本书的最后,第14章介绍了对复杂系统的测试,第15章对测试的未来趋势作了展望,以期对希望从事软件测试工作的人员有所帮助。
学习辅助
在测试概述一章之后,第2章作为本书的基础,介绍本书中方法和技术的概念基础。这一章非常依赖于框架形式的插图,以帮助读者成功的理解这些概念。描述测试过程的章节中也使用了大量的表格和示例,因此读者可以对实际过程有非常直观的了解。
配套网站
本书的配套网站是 ftp://ftp.wiley.com/public/sci_tech_med/software_testing/,由 John Wiley & Sons 有限公司提供,它包括如下内容:
* 每章附带的学习指南和习题,案例A和案例B。
* 一套教师指南,包括课程大纲,用于投影的教材图片,教学目标,教学技巧,讨论题和每一章的思考题。如果你需要访问教师指南,请联系 Wiley Interscience 高级编辑Paul Petrali,他的电子邮件是ppetrali@wiley.com。
致谢
从头至尾,作者都使用“我们”作为代词。尽管我们对本书的内容和表现形式负全部责任,我们对我们在成书过程中受到的大量帮助表示感谢。首先,我们感谢我们的数千名学生——包括学校里的和产业界的,他们不仅提供给我们整理和组织材料的机会,更提供给我们大量的反馈意见,使我们不至于走弯路。其次,我们要感谢我们的业务客户,他们为我们提供了真实的实验室,用于应用我们的知识和经验。最后,我们要感谢在 John Wiley & Sons 的相关工作人员,他们为本书的付梓提供了大量的专业经验。我们尤其要感谢 Valerie Moliere、Paul Petrolia、Whitney Lesch和Danielle Lacourciere。
