软件测试基础(原书第2版)
作者 : [美]保罗·阿曼(Paul Ammann);杰夫·奥法特(Jeff Offutt) 著
译者 : 李楠 译
丛书名 : 计算机科学丛书
出版日期 : 2018-10-23
ISBN : 978-7-111-61129-5
定价 : 79.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 295
开本 : 16
原书名 : Introduction to Software Testing ,Second Edition
原出版社: Cambridge University Press
属性分类: 教材
包含CD : 无CD
绝版 :
图书简介

This extensively classroom-tested text uses an innovative approach to explaining software testing, and covers the latest techniques to test software such as OO, web applications, and embedded software. This new edition features vastly expanded coverage of the basics and the JUnit framework, as well as many new examples and exercises.

图书特色

图书前言

自本书的第1版发行以来,软件测试领域已经发生了太多变化。高水平的测试现在在工业界已经变得非常普遍。测试自动化已经无处不在,工业界绝大多数领域都默认必须使用测试自动化。敏捷过程和测试驱动开发变得广为人知而且许多人都在使用。更多的学校在本科和研究生阶段开设了软件测试的课程。ACM关于软件工程的课程大纲在很多地方都包括了软件测试,并且把它设置为强烈推荐的课程[Ardis et al.,2015]。
第2版包括了新的特点和内容,同时保留了第1版中深受数百位教师喜欢的结构、理念和在线资源。
第2版的新内容
当拿到一本书的新版本时,任何教师要做的第一件事就是研究所讲的课程中需要做哪些改动。因为我们已经经历过很多次这样的情况了,所以我们想让读者很容易地明白第2版的改动。
第1版 第2版 主题
第一部分 软件测试基础
第1章 第1章 为什么测试软件(动机)
第2章 模型驱动测试设计(抽象)
第3章 测试自动化(JUnit)
第4章 测试优先(TDD)
第5章 基于准则的测试设计(准则)
第二部分 覆盖准则
第2章 第7章 图覆盖
第3章 第8章 逻辑覆盖
第4章 第9章 基于语法的测试
第5章 第6章 输入空间划分
第三部分 实践中的测试
第6章 第10章 管理测试过程
第11章 编写测试计划
第12章 测试实现
第13章 软件演化中的回归测试
第14章 编写有效的测试预言
第7章 N/A 技术
第8章 N/A 工具
第9章 N/A 挑战
第2版最明显、最大的改动是将第1版中导言性质的第1章扩展成了5个不同的章节。这个重大的扩展使本书变得更加完善。新版的第一部分是由我们的课程讲义发展而来的。第1版发行之后,我们开始不断地向测试课程中添加更多的基础内容。这些新的想法最终组织成了这5个新的章节。新版第1章用到了很多第1版第1章的内容,包括动机和基本概念。第1章结束的时候包括了一段来自2002年的RTI报告,这篇报告讨论的是在开发晚期才进行测试所造成的巨大成本。每个软件测试研究的项目提案都会引用这个重要的调查研究结果。在完成第1版后,我们意识到这本书的关键创新点在于将测试设计成抽象的活动,独立于用来生成测试用例的软件工件(artifact)。这个观点暗示软件设计已经变成一个和以往不同的过程。这样的想法引出了第2章,这一章讲述如何将测试准则和实践相结合。在我们做咨询的过程中,我们已经帮助软件公司包含这一模型以修正其测试过程。
第1版中有个遗憾是没有提及JUnit或其他的测试自动化架构。2016年,JUnit已经在工业界广泛使用,而且通常用在CS1和CS2的课堂上给作业自动打分。第3章改正了这个疏忽。在这一章里,我们叙述了测试自动化的概况,说明了实施测试自动化的难点,也明确地教授了JUnit。虽然本书所讲的内容在很大程度上并不依附于某个具体技术,但在全书的例子和练习中使用统一的测试架构是方便读者理解的。在课堂上,我们通常要求测试必须自动化,也经常要求学生在作业中尝试别的 “*-Unit”单元测试架构,比如HttpUnit。我们认为在拥有自动化的测试用例之前,测试机构还不具备成功应用测试准则的能力。
很自然地,我们在第4章讲到了测试驱动开发(TDD)。虽然TDD和本书的其余部分不太一样,但这对测试教育者和研究人员来说却是一个令人激动的主题。原因是TDD把测试提前且放到了软件开发的中心位置,测试变成了需求。在第一部分的最后,第5章用抽象的方式介绍了测试准则的概念。软心豆粒糖(jelly bean)的例子(尤其是在课堂上讲述这个例子的时候,我们的学生都很喜欢)和其他概念(如包含关系)依然在第2版中保留了下来。
第二部分是本书的核心,但在第2版中改动最少。2014年的一天,Jeff问了Paul一个简单的问题:“第二部分四个章节的顺序为什么是现在这样?”答案是惊愕地沉默,因为我们意识到我们从未想过它们应该出现的顺序。事实上,无可争议地处于软件测试中心地位的RIPR模型已经给出了一个逻辑顺序。具体来说,输入空间划分不需要可达性、影响或传播(这些概念在第2章介绍)。图覆盖准则只需要测试执行“经过”待测软件的一些部分,这就是可达性而没有影响和传播。逻辑覆盖准则需要到达而执行谓词,还要以一种特别的方式使用它进而改变它的结果。这就是说,这个谓词被影响了。最后,语法覆盖不仅要求到达程序的某个地方,同时“变异”的程序状态必须和原程序不同,而且这个不同之处必须在程序执行之后观察到。这就是说,程序状态的变化要传播出来。第2版依据RIPR模型按顺序列出来这四个概念,而它们所对应章节的要求在递进地增强。从实用的角度来说,我们只是将前一版的第5章(现为第6章)移到了图覆盖章节(现为第7章)之前。
结构上的另一个主要改动是第2版没有再包含第1版中的第7章到第9章。第1版中的这三章已经过时,相比本书的其他部分,这三章用到的频率较少,所以我们决定在重写这部分之前先发表现有的章节。我们计划在第3版中更好地描述这三章。
我们还做出了数百处更加细微的改动。最近的研究发现,测试能够成功不仅需要一个错误值传播到输出结果,而且要求自动化测试预言检查合适的输出结果。这就是说,测试预言必须揭示软件失败。因此,新的RIPR模型取代了旧的RIP模型。本书在一些地方有拓展性或深度的讨论,超出了对概念理解的基本要求。第2版现在包括了“深入讨论”。这个附加的讨论部分可能会激发一些学生的兴趣或让他们产生有见解的想法。而对其他学生来说,则不必阅读这些略有难度的讨论。
新的第6章现在包含了一个完整的例子。这个例子展示了如何由广泛使用的Java类库的接口推出输入域模型(6.4节)。我们的学生发现这个例子能够帮助他们理解怎样使用输入空间划分技术。第1版有一节是关于如何使用代数来表示图的。虽然我们中的一个人认为这部分内容有趣,但是我们都认同很难找到使用这个技术的动机而且这个技术在实践中很少使用。此外,这个技术也有一些小的缺陷。因此,我们在第2版中没有再包含这部分。新的第8章(逻辑覆盖)有一个重大的结构改动。DNF准则(之前在3.6节)被合理地放到了本章的前面部分。第8章现在以8.1节的语义逻辑准则(ACC和ICC)开始,然后进入8.2节的语法逻辑准则(DNF)。语法逻辑准则也做了改动。我们去掉了UTPC准则而加上了MUTP和MNFP准则。这两个准则和CUTPNFP一起组成了MUMCUT准则。
整本书(特别是第二部分)中,我们改进了例子,简化了定义,还包括了更多的习题。当第1版问世的时候,只有一个包括部分习题答案的手册,而这个手册前前后后花了五年的时间才完成。我们从中得到了一个教训,因此定下一个规矩(而且会一直坚持下去):不会在没有添加答案的情况下增加习题。读者可以把这个规矩视为对习题的测试。我们很高兴地宣布本书第2版的网站上线之际就配有完整的习题答案。
第2版还改正了很多第1版的错误,部分来源于第1版网站的错误列表,剩下的发现于我们编写第2版的时候。第2版的索引也变得更好了。写第1版时,我们只用了大约一天完成了索引。这次我们一边写书一边制作索引,而且在成书的最后时刻专门花时间来完善。给未来的作者一个建议,做索引是一项艰巨的任务,不要轻易地把这项工作交给作者之外的人。
第2版和第1版的相同之处
第1版的成功之处在第2版中都得到了保留。总体来说,我们以四种结构来归纳测试准则的视角依然是第2版的核心组织原则。第2版还采用了工程师的视角。我们假设读者是工程师,目的是想用最低的代价写出高质量的软件。本书的所有概念都有理论支撑,但是以实践的方法来展示。这就是说,本书将理论实践化。理论部分从研究文献的角度来说是可靠的,而我们展示了如何将理论应用到实际。
本书还可以当作教材来用。本书有清晰的解释、简单但生动的例子,还有很多适用于课内或课外的练习题。每一章的最后还有参考文献的注解,这可以帮助刚进入研究领域的学生学习软件测试中涉及的更深的思想。本书的网站(https://cs.gmu.edu/~offutt/softwaretest/)
有很多内容丰富的材料,包括习题答案手册、本书中所有程序样例的列表、高质量的PowerPoint讲义,以及帮助学生理解图覆盖、逻辑覆盖和变异分析的软件。我们还用一些视频来做讲解,希望将来能做更多这样的视频。习题答案手册有两种形式。一种是学生答案手册,面向所有人,但是只有一半习题的答案。另一种是教师答案手册,包括所有习题的答案,但是我们只提供给教授软件测试课程的教师。
如何在不同课程中使用本书
我们使用模块化的方法来组织本书的章节。虽然我们以一定的顺序来展示这些章节,但大部分章节都是相互独立的。章节之间没有什么关系,教师几乎可以以任意顺序来使用它们。在我们学校,主要的目标课程是一门大四的课程(SWE 437)和一门研究生第一年的课程(SWE 637)。有兴趣的读者可以在网上搜索我们的课程(“mason swe 437”或“mason swe 637”)来查看课程安排以及我们是如何使用本书的。这两门课都是必修课。SWE 437在应用计算机科学专业软件工程方向是必修课。SWE 637是软件工程专业硕士的必修课。第1和3章可以从两个方面应用在早期的课程(如CS2)中。这样,首先学生在早期就可以充分认识到软件质量的重要性,其次让学生开始学习测试自动化(我们在乔治梅森大学使用JUnit架构)。大二的测试课程可以覆盖第一部分的全部、第二部分的第6章和第三部分的全部或部分。对大二的学生来说,第二部分的其他章节可能有些超出他们的需要,但输入空间划分是高级结构化测试中的入门技术,非常容易理解。在北美计算机科学课程中,通常大三学生要上的一门课是软件工程。本书的第一部分对于这样的课程将会是非常合适的。2016年,我们新开了一门软件测试的研究生高级课程。这门课程包含了最新的知识和目前的研究成果。这门课将会用到第三部分的一些内容、我们正在编写的第四部分内容,还有一些节选的研究论文。
如何讲授软件测试
本书的两位作者在过去的十年中都在学习如何教学。21世纪初,我们授课的模式依然是传统的。我们在课堂上的大部分时间里做演讲,将大量的PowerPoint讲义组织得井井有条,要求学生独立完成课后作业,并且组织一些有挑战性和高强度的考试。第1版的PowerPoint讲义和习题均为此模式所设计。
然而,我们的教学一直在发展中。我们用每周的小测验代替了期中考试。每次测验占用课堂的前15分钟。这样的测验占了整个学期成绩相当大的比例,缓解了期中考试的压力,使学生每周都能跟上进度而不是在考前死记硬背。这样也能帮助我们在学期的早期发现哪些学生毫不费力,哪些学生则比较吃力。
我们学到了一种称为“翻转课堂”的教学模式。我们试验性地开始应用此模式。我们提前录制授课内容,要求学生在课前观看,然后在课堂上完成“课后”作业,而我们则在旁边提供及时的帮助。我们发现这个方法对讲授涉及复杂数学的内容特别有帮助,同时对学习吃力的学生尤其有效果。当教育研究实际验证了传统讲课方式的弊端时,我们开始渐渐地放弃了教师直接演讲两个小时的方式,即所谓的“讲台上的圣人”模式。现在我们经常只讲10~20分钟,给出当堂的练习,然后由学生立即试着去解决问题或给出答案。我们承认这对我们来说很难,因为我们喜欢演讲。我们使用的另一种方法是在课堂上不直接讲解例子,而是引出一个例子,让学生以小组的方式来完成下一步,然后分享结果。有时候我们的解决方案更好,有时候学生的更好,而其他的时候我们各自的方案难分高下,各有特点,从而激发了课堂上的讨论。
毫无疑问,这种新的教学方式花费时间而且不能和我们所有的PowerPoint讲义相适应。我们相信虽然我们覆盖的讲义更少,但是启发更多,这个看法和我们的学生在期末考试中的表现是一致的。
大部分的课堂练习都是分小组来完成的。我们也鼓励学生合作完成课外的作业。这不仅是因为有证据显示学生一起合作(“同事间学习”)时可以学到更多的东西,而且他们乐在其中,这也符合工业界的实际情况。非常少的软件工程师是独自工作的。
当然,你们可以以自己认为合适的方式来使用此书。我们提供的这些看法只是适合我们的情况。简单总结一下我们现在的讲课哲学:少讲话,多解惑。
致谢
我们很高兴在此感谢众多为此书做出贡献的人们,我们会将他们的名字一一列出。首先从乔治梅森大学的学生开始,他们为第2版的早期草稿提供了非常棒的反馈。他们是:Firass Almiski, Natalia Anpilova, Khalid Bargqdle, Mathew Fadoul, Mark Feghali, Angelica Garcia, Mahmoud Hammad, Husam Hilal, Carolyn Koerner, Han-Tsung Liu, Charon Lu, Brian Mitchell, Tuan Nguyen, Bill Shelton, Dzung Tran, Dzung Tray, Sam Tryon, Jing Wu, Zhonghua Xi, Chris Yeung。
我们特别感谢已经使用了第2版初始章节的同事们,他们提供了很有价值的反馈意见,对最终的完备版本起了极大的作用。他们是:Moataz Ahmed, King Fahd University of Petroleum & Minerals; Jeff Carver, University of Alabama; Richard Carver, George Mason University; Jens Hannemann, Kentucky State University; Jane Hayes, University of Kentucky; Kathleen Keogh, Federation University Australia; Robyn Lutz, Iowa State University; Upson Praphamontripong, George Mason University; Alper Sen, Bogazici University; Marjan Sirjani, Reykjavik University; Mary Lou Soffa, University of Virginia; Katie Stolee, North Carolina State University; Xiaohong Wang, Salisbury University。
其他的一些人对第1版提供了绝好的反馈意见:Andy Brooks, Mark Hampton, Jian Zhou, Jeff (Yu) Lei, 以及六位出版社联系的匿名评审。以下各位改正或编写了练习答案:Sana’a Alshdefat, Yasmine Badr, Jim Bowring, Steven Dastvan, Justin Donnelly, Martin Gebert, 顾晶晶, Jane Hayes, Rama Kesavan, Ignacio Martín, Marcel Medina-Mora, Xin Meng, Beth Paredes, Matt Rutherford, Farida Sbry, Aya Salah, Hooman Safaee, Preetham Vemasani, Greg Williams。下面的乔治梅森大学的学生发现并且通常顺带改正了第1版中的错误:Arif Al-Mashhadani, Yousuf Ashparie, Parag Bhagwat, Firdu Bati, Andrew Hollingsworth, Gary Kaminski, Rama Kesavan, Steve Kinder, John Krause, Jae Hyuk Kwak, 李楠, Mohita Mathur, Maricel Medina Mora, Upsorn Praphamontripong, Rowland Pitts, Mark Pumphrey, Mark Shapiro, Bill Shelton, David Sracic, Jose Torres, Preetham Vemasani, 汪爽, Lance Witkowski, Leonard S. Woody III, Yanyan Zhu。下面来自别的组织和机构的人发现并通常顺带改正了第1版中的错误:Sana’a Alshdefat, Alexandre Bartel, Don Braffitt, Andrew Brooks, Josh Dehlinger, Gordon Fraser, Rob Fredericks, Weiyi Li, Hassan Mirian, Alan Moraes, Miika Nurminen, Thomas Reinbacher, Hooman Fafat Safaee, Hossein Saiedian, Aya Salah, Markku Sakkinen。北京大学的郁莲将第1版翻译成简体中文。
我们也想感谢以下已经对第1版做出明确贡献进而对第2版做出贡献的人们:Aynur Abdurazik, Muhammad Abdulla, Roger Alexander, Lionel Briand, Renee Bryce, George P. Burdell, Guillermo Calderon-Meza, Jyothi Chinman, Yuquin Ding, Blaine Donley, Patrick Emery, Brian Geary, Hassan Gomaa, Mats Grindal, Becky Hartley, Jane Hayes, Mark Hinkle, Justin Hollingsworth, Hong Huang, Gary Kaminski, John King, Yuelan li, Ling Liu, Xiaojuan Liu, Chris Magrin, Darko Marinov, Robert Nilsson, Andrew J. Offutt, Buzz Pioso, Jyothi Reddy, Arthur Reyes, Raimi Rufai, Bo Sanden, Jeremy Schneider, Bill Shelton, Michael Shin, Frank Shukis, Greg Williams, Quansheng Xiao, Tao Xie, Wuzhi Xu, Linzhen Xue。
当编写第2版的时候,乔治梅森大学的研究生助教给了我们关于早期草稿出色的反馈:邓琳,顾晶晶,李楠,Upsorn Praphamontripong。特别强调的是,李楠和邓琳实现了软件覆盖率的工具,而且在本书网站上不断地演化和维护了此工具。
我们还要感谢编辑Lauren Cowles提供了坚定不移的支持,并且设定了截止期限来推进本书的项目。我们也要感谢以前的编辑Heather Bergmann为这个长期项目所提供的强有力的支持。
最后,如果没有家庭的支持,我们当然无法完成任何的事情。谢谢Becky、Jian、Steffi、Matt、Joyce和Andrew能让我们的工作和生活平衡。
就像所有的程序都有故障一样,所有的书也都有错误。本书也不例外。同理,就像程序员对软件故障负责一样,我们也对本书的错误负责。特别强调的是,软件测试领域是浩瀚的,其中涉及的技术是复杂的,参考文献注解只反映了我们对测试领域的认知。我们对漏掉的文献表示歉意,同时欢迎指出相关文献的出处。

上架指导

计算机\程序设计

封底文字

我喜欢的软件测试教科书在这一版更好了!我特别喜欢关于模型驱动测试、JUnit、测试计划和测试预言的新章节。和之前的版本一样,这一版覆盖了对学生和实践者来说很重要的概念和技术。新版结构依然紧凑,内容深入且容易理解。
—— Anneliese Amschler Andrews, 丹佛大学
本书以简洁、清晰且精确的形式抓住了软件测试领域重要的概念。这是目前对软件测试领域最好的介绍。书中包括许多对理论和实践的深入见解,可以给读者提供这方面坚实的基础。
—— Lionel Briand,安全、可靠性和信任交叉学科中心,卢森堡大学
这书创造性地使用四种模型来囊括目前的软件测试技术,这样可以帮助学生、研究人员和实践者从抽象和系统的角度来理解这些技术。本书在理论和实践之间做出了很好的平衡。第2版增加了很有价值的新内容,使读者可以在工业界的常用环境中学习软件测试技术。
—— 谢涛,伊利诺伊大学香槟分校

本书特点
清楚地解释了覆盖准则理论,以帮助学生先理解相关的概念再深入钻研实际应用程序。
广泛使用了JUnit测试框架,使学生获得使用工业界广泛应用的测试框架的经验。
提供了为练习定制的工具,这样学生可以自己检查作业。

作者简介
保罗·阿曼(Paul Ammann) 是乔治梅森大学软件工程副教授。他于2007年获得Volgenau工程学院的杰出教学奖。他领导开发了应用计算机科学学位,现任软件工程硕士项目主任。Ammann在软件工程领域已经发表了超过80篇文章,尤其着重于软件测试、软件安全、软件依赖性和软件工程教育方向。
杰夫·奥法特(Jeff Offutt) 是乔治梅森大学软件工程教授。他于2013年获得乔治梅森大学杰出教学奖。他在基于模型测试、基于准则测试、测试自动化、经验软件工程和软件维护等方面已经发表了超过165篇文章。他是《软件测试、验证和可靠性》期刊的主编。他还帮助创建了IEEE国际软件测试大会,同时也是μJava项目的创始人。

作者简介

[美]保罗·阿曼(Paul Ammann);杰夫·奥法特(Jeff Offutt) 著:保罗·阿曼(Paul Ammann)是乔治梅森大学软件工程副教授。他于2007年获得Volgenau工程学院的杰出教学奖。他领导开发了应用计算机科学学位,现任软件工程硕士项目主任。Ammann在软件工程领域已经发表了超过80篇文章,尤其着重于软件测试、软件安全、软件依赖性和软件工程教育方向。
杰夫·奥法特(Jeff Offutt)是乔治梅森大学软件工程教授。他于2013年获得乔治梅森大学杰出教学奖。他在基于模型测试、基于准则测试、测试自动化、经验软件工程和软件维护等方面已经发表了超过165篇文章。他是《软件测试、验证和可靠性》期刊的主编。他还帮助创建了IEEE国际软件测试大会,同时也是uJava项目的创始人。

译者序

伴随着软件的大规模应用以及与人们日常生活的紧密结合,软件已经改变了人们的行为方式。同时,软件质量也在某种程度上决定着人们的生活质量,所以软件质量变得尤其重要。软件测试是保证软件质量最有效也最常用的手段。与早期相比,软件测试活动已经处于软件开发的中心地位。在测试驱动开发(test-driven development)中,开发者需要写测试用例来帮助设计和完成代码。而在目前流行的敏捷开发(agile development)中,在执行每个开发故事(story)之前,开发者都必须与测试者一起开会,并且在代码实现之前就需要定义如何测试软件。基于这样的背景以及测试自动化的潮流,软件测试领域的两位权威专家Paul Ammann和Jeff Offutt推出了目前全球颇具影响力的软件测试教科书——《软件测试基础》,即本书。
本书的特点非常鲜明:紧密地围绕模型驱动测试设计来展开。模型驱动测试设计指的是在自动化测试中建立模型来产生测试需求,生成测试用例覆盖需求,执行并评估测试用例的过程。模型驱动设计中最重要也最难的部分是测试用例设计。测试用例的有效性和成本直接决定了测试的成功与否,这部分也是软件测试最主要的研究方向。生成测试用例的技术有数百种甚至更多,但Paul和Jeff在本书中创造性地将几乎所有技术归纳为对四种基本模型的应用:图、逻辑表达式、语法和输入域。第2版不仅保留了这些模型,还对第一部分软件基础进行了扩展:明确地提出了模型驱动测试设计,并且加入了测试自动化框架和测试驱动程序开发的内容。
本书自2008年第1版发行以来,已经用于美国、欧洲、中国数所大学的软件测试课程当中,是当今软件测试领域最受欢迎也最具影响力的教科书。作为一本教科书,本书包括了软件测试领域过去40年研究的精华,系统地介绍了软件测试的基础理论,比如覆盖理论,包含理论、RIPR模型等。在讲述理论的同时,本书还重点考虑了与工业界的结合。在包含通用的测试过程和测试计划之外,本书主要强调的是在自动化测试的每个阶段,实践者应该选择在正确的抽象层次上和模型中应用有效合理的测试技术。注意,本书没有描述如何使用具体的测试工具,因为如果那样的话,当工具被淘汰时,书中的内容就会过时。通过讲述理论以及描述与实际结合的样例,本书试图激发实践者的智慧和潜力来在实践中应用这些理论,并提出更有效和有效率的方法。每章末尾包括参考文献注解,这些注解详尽地解释了所引用的每个概念和技术的出处,并对不同的技术进行比较。这对软件测试方向的博士生和研究人员有很大的帮助。事实上,本书在学术论文中的引用数已经超过了1 300次。
译者观察到,目前国内有很多关于测试工具操作以及测试过程和方法实践的书籍,但是缺乏系统讲述软件测试理论的书籍。本书正好填补了这方面的空白。从译者参加的多个国内外软件测试研究和实际项目来看,本书作为参考资料经常能够发挥巨大的作用。有人认为现在很多IT公司并没有应用太多书中的技术,所以在实践中本书作用不大。但译者认为:
1)本书不仅覆盖早期理论研究的沉淀,还囊括了一些最新研究的成果,这些成果的价值将会在未来得以体现,所以本书不仅应用于当代,更是面向未来;2)大部分IT公司的要求是在保证一定质量的前提下,对产品进行快速迭代。所以目前看来有些复杂的技术,由于成本原因并没有得到应用(同时也给予了实践者改进它们的机会)。但是,对其他行业软件(如航天航空和高铁上的安全关键软件)来说,使用复杂技术对其进行严格的测试是必要的,同时也是具有一定成本边际效应的(因为需求相对固定且潜在的人民生命财产损失巨大)。综上所述,译者认为本书为各个行业的软件测试都提供了理论和实践上的全方位支持。
译者在过去近一年中,尽自己的最大努力,对每个概念、术语、定义的翻译都进行了认真细致的斟酌。译者也参考了第1版的中文翻译,尽可能多地保留了之前的术语译法。当然,有些概念和术语都比较新,目前在国内还没有统一的翻译标准。欢迎各位专家、同仁、读者提出宝贵意见,以期尽快对某些术语的翻译达成统一意见。在翻译的过程中,译者就一些疑问向作者Paul和Jeff进行了请教。对某些不易理解的部分,译者加了注释;对错误的部分,译者进行了改正。所以,从理论上来讲,本书比英语原版要更加完善。当然任何书籍的翻译都很难做到完美,在此希望读者提出指正意见和建议。
感谢原书作者Paul Ammann和Jeff Offutt对此次翻译的支持。还要感谢机械工业出版社华章分社的编辑朱捷和赵静,他们对此次翻译工作提出了很多宝贵的建议并做了大量的校订工作。最后,感谢太太郭昀在翻译过程中为家庭的付出以及对我工作的理解。当然也要感谢我的父母、妹妹、岳父岳母在精神上给予我的鼓励。

图书目录

出版者的话
译者序
前言
第一部分 软件测试基础
第1章 为什么测试软件 2
1.1 软件何时会出现问题 3
1.2 软件测试的目的 6
1.3 参考文献注解 13
第2章 模型驱动测试设计 15
2.1 软件测试基础 15
2.2 软件测试活动 17
2.3 基于软件活动的测试级别 17
2.4 覆盖准则 19
2.5 模型驱动测试设计 21
2.5.1 测试设计 22
2.5.2 测试自动化 22
2.5.3 测试执行 23
2.5.4 测试评估 23
2.5.5 测试者和抽象 23
2.6 MDTD为什么重要 25
2.7 参考文献注解 25
第3章 测试自动化 27
3.1 软件可测性 27
3.2 测试用例的构成 28
3.3 测试自动化框架 30
3.3.1 JUnit测试框架 31
3.3.2 数据驱动测试 35
3.3.3 在单元测试中添加参数 36
3.3.4 从命令行运行JUnit 38
3.4 超越自动化 38
3.5 参考文献注解 41
第4章 测试优先 42
4.1 驯服改动成本曲线 42
4.1.1 改动成本曲线真的被驯服了吗 43
4.2 测试装具——守护者 44
4.2.1 持续集成 45
4.2.2 敏捷方法中的系统测试 45
4.2.3 将测试加入遗留系统 46
4.2.4 敏捷方法中测试的弱点 47
4.3 参考文献注解 48
第5章 基于准则的测试设计 49
5.1 定义覆盖准则 49
5.2 不可行性和包含 52
5.3 使用覆盖准则的好处 53
5.4 下一个部分 54
5.5 参考文献注解 54
第二部分 覆盖准则
第6章 输入空间划分 58
6.1 输入域建模 60
6.1.1 基于接口的输入域建模 61
6.1.2 基于功能的输入域建模 61
6.1.3 设计特征 62
6.1.4 选择区块和测试值 63
6.1.5 检查输入域模型 65
6.2 组合策略准则 66
6.3 检查特征之间的约束 71
6.4 扩展实例:从JavaDoc中推导IDM 72
6.4.1 设计基于IDM的测试用例中的任务 72
6.4.2 为迭代器设计基于IDM的测试用例 73
6.5 参考文献注解 78
第7章 图覆盖 82
7.1 概述 82
7.2 图覆盖准则 86
7.2.1 结构化的覆盖准则 87
7.2.2 游历、顺路和绕路 90
7.2.3 数据流准则 97
7.2.4 图覆盖准则间的包含关系 103
7.3 基于源代码的图覆盖 104
7.3.1 基于源代码的结构化图覆盖 104
7.3.2 基于源代码的数据流图覆盖 108
7.4 设计元素的图覆盖 116
7.4.1 设计元素的结构化图覆盖 116
7.4.2 设计元素的数据流图覆盖 118
7.5 设计规范的图覆盖 124
7.5.1 测试顺序约束 125
7.5.2 测试软件的行为状态 127
7.6 用例的图覆盖 134
7.6.1 用例场景 137
7.7 参考文献注解 137
第8章 逻辑覆盖 141
8.1 有效的语义逻辑覆盖准则 141
8.1.1 简单的逻辑覆盖准则 142
8.1.2 有效子句覆盖 144
8.1.3 无效子句覆盖 148
8.1.4 不可行性和包含 148
8.1.5 让子句决定谓词 150
8.1.6 找到满足准则的取值 153
8.2 语法逻辑覆盖准则 157
8.2.1 蕴涵项覆盖 158
8.2.2 极小DNF 159
8.2.3 MUMCUT覆盖准则 160
8.2.4 卡诺图 163
8.3 程序的结构化逻辑覆盖 166
8.3.1 满足谓词覆盖 169
8.3.2 满足子句覆盖 170
8.3.3 满足有效子句覆盖 171
8.3.4 谓词转换问题 174
8.3.5 谓词中的副作用 176
8.4 基于规范的逻辑覆盖 178
8.5 有限状态机的逻辑覆盖 180
8.6 参考文献注解 184
第9章 基于语法的测试 187
9.1 基于语法的覆盖准则 187
9.1.1 基于通用语法的覆盖准则 187
9.1.2 变异测试 189
9.2 基于程序的语法 192
9.2.1 编译器的BNF语法 192
9.2.2 基于程序的变异 193
9.3 集成测试和面向对象测试 206
9.3.1 BNF集成测试 206
9.3.2 集成变异 206
9.4 基于规约的语法 212
9.4.1 BNF语法 212
9.4.2 基于规约的变异 212
9.5 输入空间的语法 215
9.5.1 BNF语法 215
9.5.2 变异输入语法 218
9.6 参考文献注解 222
第三部分 实践中的测试
第10章 管理测试过程 226
10.1 概述 226
10.2 需求分析和规约 227
10.3 系统和软件设计 227
10.4 中间设计 228
10.5 详细设计 228
10.6 实现 229
10.7 集成 229
10.8 系统部署 229
10.9 运行和维护 229
10.10 实现测试过程 230
10.11 参考文献注解 230
第11章 编写测试计划 231
11.1 分层测试计划模板 231
11.2 参考文献注解 233
第12章 测试实现 234
12.1 集成顺序 234
12.2 测试替身 235
12.2.1 桩和模拟:测试替身的变种 236
12.2.2 使用测试替身来代替组件 237
12.3 参考文献注解 240
第13章 软件演化中的回归测试 241
13.1 参考文献注解 243
第14章 编写有效的测试预言 244
14.1 应该检查的内容 244
14.2 决定正确的测试值 245
14.2.1 对输出进行基于规约的直接验证 246
14.2.2 冗余计算 246
14.2.3 一致性检查 247
14.2.4 蜕变测试 247
14.3 参考文献注解 248
测试准则表 250
参考文献 252
索引 269

教学资源推荐
作者: [美]罗杰 S.普莱斯曼(Roger S. Pressman),[美]布鲁斯 R. 马克西姆(Bruce R. Maxim) 著
作者: 韩万江 姜立新 编著
作者: [英]伊恩·萨默维尔(Ian Sommerville) 著
参考读物推荐
作者: [加]托马斯·埃尔(Thomas Erl) [德]安德烈·托斯特(Andre Tost) [印]萨塔德鲁·罗伊(Satadru Roy) [英]菲利普·托马斯(Philip Thomas)著
作者: Michael Sutton, Adam Greene;Pedram Amini
作者: Michael Kircher, Prashant Jain