软件测试技术——基于案例的测试
作者 : 赵翀 孙宁 编著 贲可荣 主审
出版日期 : 2011-05-19
ISBN : 978-7-111-33697-6
适用人群 : 高等院校计算机本科或研究生。
定价 : 36.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 339
开本 : 16
原书名 :
原出版社:
属性分类: 教材
包含CD :
绝版 :
图书简介

本书以案例为线索系统介绍软件测试的基本原理和常用方法,阐述覆盖准则的理论知识,介绍软件测试战术和软件测试策略;针对具体测试工作,介绍图形用户界面测试、嵌入式软件测试、Web应用软件测试和安全性测试的方法;概要介绍测试管理和测试工具。
本书重点讲述案例测试用例设计和软件测试技术的实际应用,为学生分析案例提供样板。本书内容丰富,理论联系实际,可作为高等院校计算机专业本科生和研究生的教材,也可为从事软件测试和软件质量工作的工程技术人员学习提供参考。

图书特色

软件测试技术
基于案例的测试
赵羽中  孙宁 编著 贲可荣 主审

软件测试是发现软件缺陷、提高软件可信性的重要手段,它贯穿软件工程的整个软件生命周期,涉及各种软件开发技术、应用技术以及测试技术,覆盖软件的各种应用领域。本书基于软件测试对实践动手能力和工程应用能力的要求,结合作者多年从事软件工程和软件测试的研究以及多年讲授软件测试课程的经验与体会编写而成。
本书以案例为牵引系统地介绍了软件测试的基本原理和常用方法,阐述了覆盖准则的理论知识,介绍了图形用户界面测试、嵌入式软件测试、Web应用软件测试和安全性测试等,并介绍了测试过程管理和测试工具。

本书特点
通过案例展示各种测试方法的使用。书中提供了许多可以借鉴和参考的案例,并且围绕案例给出实际应用方法的背景,为学生分析案例提供样板。
系统论述覆盖准则的理论知识。覆盖准则提供了何时停止测试的有效规则,书中将覆盖准则分为图覆盖、逻辑覆盖、输入空间覆盖和语法结构覆盖几类,有助于学生系统地理解和深入地掌握测试的方法和技术。
详细介绍针对特定环境、体系结构和应用的测试方法,为学生从事实际测试工作奠定基础。

本书为教师提供教学课件,有需要者可登录华章网站(www.hzbook.com)下载。

图书前言

软件是一个逻辑体,软件中的错误都是人类自己造成的。由于软件规模、复杂性等因素,使得软件的正确性难以证明。软件中的错误是不可避免的,人们只能根据需要尽可能地减少软件中的错误。软件测试是发现软件缺陷,提高软件可信性的重要手段。
  由浅入深逐步发展中的软件测试
  人类认识问题是一个由浅入深逐步发展的过程,从软件测试的发展过程,我们也可窥见一斑。
  软件测试的历史可以追溯到1947年。第一个软件隐错发现于哈佛大学。在Mark II中的一只飞蛾导致计算机功能混乱,这也是IT词汇中的术语“bug”的由来。1949年,Alan Turing发表了一篇关于软件测试的文章“On Checking a Large Routine”。文章中解释了计算机规则检查对发现错误的效力,并试图回答这样一个问题:如何检查一个规则,以使我们确信它是正确的。接着他于1950年在文章“Computing Machinery and Intelligence”中提出了著名的图灵测试。直到1956年之前,测试和调试都没有进行清晰的划分,测试经常与调试相关,这个时期可以称为是面向调试的阶段。
  20世纪50年代的很多实践表明了软件测试是多么有效。1957年,Charles L. Baker 在《数字计算机编程》(Digital Computer Programming)中描述了关于调试和测试实践以及它们的区别。从那时起到1978年是面向演示执行的阶段,这时对调试和测试进行了区分,但在这个阶段主要表明软件满足需求。1958年第一个软件测试团队产生。它是由Gerald M. Weinberg组建的,他当时是Mercury项目的操作系统开发经理。  Mercury项目是美国第一个载人宇宙飞行项目。1961年,Gerald Weinberg和Herbert Leeds在一本名为《计算机编程基础》(Computer Programming Fundamentals)的书中专门写了一章关于测试的内容。Weinberg和Leeds认为测试应该证明计算机程序的适应性而不是处理信息的能力。在IBM白皮书《评估控制程序的功能测试》中,William Elmendorf给出了一个称为受过训练的软件测试方法,这时更关注软件测试的方法。
  20世纪70年代,随着计算机程序的广泛应用,代码的错误数量也不断增加。人们开始失去对计算机工业中撰写的代码的信任,因为它没有任何清晰的标准。这是由于缺少质量控制措施造成的。1979年出版了Glenford J. Myers的《软件测试的艺术》(The Art of Software Testing),其中介绍了更多关于有效软件测试的原则。John Good Enough和Susan Gerhart在1975年发表了论文“测试数据选择的原理”(Toward a Theory of Test Data Selection),从此软件测试开始成为一个研究方向。他们在文中讨论了形式化证明方法以及基于结构测试的限制,也概括了判定表的使用。
  从1979年到1982年可以称为面向破坏的阶段,这时的目标是找到错误。Myers在他的著作中对测试做了定义:测试是为发现错误而执行一个程序或者系统的过程。
  1983年开始人们逐渐认识到测试生命周期的重要性。1983年发布了标准IEEE 829,规定了软件测试8个已定义阶段使用的文档形式。同年,美国联邦政府发布了V&V 标准,名为“确认、验证以及计算机软件测试生命周期指南”(Guideline for Life-Cycle Validation, Verification and Testing of Computer Software),该标准描述了应该能保证成功的软件测试生命周期,它是一种通过测试需求、设计和实现来侦查缺陷的方式。1983年,Bill Hetzel在《软件测试完全指南》中指出:测试是以评价一个程序或者系统属性为目标的任何一种活动,测试是对软件质量的度量。1986年Paul E. Brook 发布了V模型,第一次将测试放入软件开发生命周期中。1987年软件可靠性的开创性工作《Software Reliability: Measurement, Prediction, Application》由John D. Musa等人发布,软件可靠性成为软件质量的关键部分。因此1983年到1987年可视为面向评估的时期:其目的是在软件生命周期的过程中提供产品评估以及质量度量。
  1988年出版了Boris Beizer的《软件测试技术》(Software Testing Techniques)。书中不仅指出侦查缺陷的重要性,也指出在整个软件测试生命周期中预防缺陷的重要性。1988年“探索测试”引入,Cem Kaner在《测试计算机软件》(Testing Computer Software)的书中第一次使用术语“探索测试”,该书以实际的面向真实世界的方法而著称。David Gelperin 和William Hetzel 在论文“软件测试的生长过程”中讨论了四种测试模型以及测试的发展过程。因此,从1988年开始被看成是面向预防的阶段,这期间测试是用来验证软件满足规约、发现缺陷以及预防缺陷。
  1989年性能测试工具LoadRunner诞生。20世纪90年代,测试工具盛行起来。1995年记录和回放测试工具WinRunner发布。1998年缺陷跟踪工具Bugzilla发布。
  1990年Boris Beizer在《软件测试技术(第2版)》中对“bug”进行了分类,并给出了术语“杀虫剂悖论”。1991年John Wiley & Sons出版了期刊《Software Testing, Verification and Reliability》。1992年第一届Software Testing Analysis & Review会议在拉斯维加斯举行。
  1993年Herzlich提出了W模型,Matthias Grochtmann 和Klaus Grimm针对划分测试提出了分类树方法。1996年测试成熟度模型(TMM)在伊利诺伊技术学院开发出来。1998年第一个欧洲软件测试认证ISEB创建,1999年国际软件测试认证CSTP创建。2001年引入SaaS(Software as a Service)模型,软件作为一种服务的概念首次出现在论文“Software as a Service: Strategic Backgrounder”中。2002年ISTQB(国际软件测试资格委员会)在爱丁堡成立。Rick和Stefan在《系统的软件测试》一书中对软件测试做了进一步定义:测试是为了度量和提高被测软件的质量,对测试软件进行工程设计、实施和维护的整个生命周期过程。2003年Bret Pettichord发表文章将软件测试思想划分为五个学派。2005年TMMi(Test Maturity Model Integration)发布,该模型被当做评估和改进测试过程的标准。2007年5月ISO成立工作组来开发新的软件测试标准ISO 29119。2008年STaaS(Software Testing as a Service)引入。STaaS是用来测试一种应用程序的软件测试模型,该应用程序通过Internet为用户提供服务。2009年Michael Bolton的文章《Testing vs.Checking》将检查和测试进行了区分,检查(checking)是证实、确认和验证,而测试是探索、发现、调查和学习。2009年8月Weekend Testers建立,为测试协作、测试不同种类的软件以及同行认可等提供一个平台,它在印度、欧洲、澳大利亚和美国都有分会。
  在过去的30年中,随着社会对软件测试需求的增加,软件测试理论和技术得到了较快的发展。特别是近十年来,国际上一些著名学术机构,以及微软、IBM等众多国际IT巨头的参与,使得软件测试理论正在走向成熟,软件测试对缺陷和错误的发现能力,软件测试工具的自动化程度都得到了大幅度的提升,以软件测试工具、软件测试服务为主导的软件测试产业正在兴起。
软件测试是软件工程的一个重要分支
  在20世纪60年代计算机发展早期,程序设计是少数聪明人做的事。“手工作坊”式的软件开发过程中,程序的编写者和使用者往往是同一个人。由于规模小,程序编写起来相当容易,也没有什么系统化的方法,对软件开发工作更没有进行任何管理。这种个体化的软件环境,使得软件设计往往只是人们头脑中隐含进行的一个模糊过程,除了程序清单之外,根本没有其他文档资料保存下来。这些智力与技能超群的人编写的程序,既能控制计算机,又能让旁人看不懂,更不会复用。但是随着软件规模的扩大,程序复杂性的增加,维护难度的增加,产生了许多问题:程序质量低下,错误频出,进度延误,费用剧增等。这些问题导致了“软件危机”。
  1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,讨论软件危机问题,通过借鉴传统工业的成功做法,他们主张通过工程化的方法开发软件来解决软件危机,并提出“软件工程”这一术语。四十余年来,尽管软件的一些隐错如人类的感冒一样无法根治,但软件的发展速度超过了任何传统工业,如今软件工程成为了一门学科。
  软件工程主要讲述软件开发的道理,基本上是软件实践者的成功经验和失败教训的总结。软件工程的观念、方法、策略和规范都是朴实无华的,平凡之人皆可领会,关键在于运用。软件工程方法学包括方法、工具和过程三要素。
  脱离软件工程框架的软件测试是不可想象的,软件工程的工程思想和方法作用在软件产品的每个阶段,当然软件测试也不能例外。
  软件测试是软件工程的一个重要分支,是软件质量保证的重要基础。现代软件测试与传统的软件测试不一样,它贯穿软件工程的整个软件生命周期(从需求分析、软件设计、代码开发,一直到最后测试、验收和维护),涉及各种软件开发技术、应用技术以及测试技术,覆盖软件各种应用领域(图形用户软件、嵌入式系统、Web应用系统等),面临不同的专业领域知识,所要求的投入与软件开发相比规模同等甚至更高。
  实际上,软件作为信息化的产品,其测试是软件开发企业必不可少的质量监控环节,软件测试在整个软件开发的系统工程中占据相当大的比重。在软件产业发达国家,软件企业一般把40%的工作花在测试上,测试人员和开发人员之比平均在1∶1以上,软件测试费用占整体开发费用的30%~50%,对于要求高可靠性、高安全性的软件,测试费用则相当于整个软件项目开发所有费用的3~5倍。这些足以说明软件测试的重要性。
理解软件测试的主要内容
  软件测试是软件质量管理的技术之一。软件质量管理体系的知识涵盖了软件工程中生命周期模型、项目管理(PMP)、软件能力成熟度集成模型(CMMI)以及软件测试技术等理论。其中CMMI着重于过程的定义,有些具体的操作方法和技术就必须参考PMP理论或软件测试理论的相关知识。软件测试一直以来都被很多人误解为等同于软件质量管理,各种各样的软件测试技术正是CMMI 中VER(验证)的重要补充内容。
  软件测试最大的局限就是测试只能显示失效,而不能显示有效。这是一个基本的理论缺陷,即在一个程序中找出所有的失效问题是不可能的。测试人员通常称找到一个错误就是成功(或有效)的测试。
  要区分的最重要的术语是验证与确认。验证是指确保软件正确地实现某一特定功能的一系列活动。确认则指的是确保开发的软件可追溯到用户需求的另外一系列活动。验证与确认包含了广泛的软件质量保证(SQA)活动,其中包括正式技术评审、质量和配置审核、性能监控、仿真、可行性研究、文档评审、数据库评审、算法分析、开发测试、易用性测试、合格性测试以及安装测试。虽然测试在验证与确认中发挥着重要作用,但其他的一些活动也是必不可少的。测试确实为软件质量的评估提供了最后的防线,但是不要将测试看成是一个安全网,并且它不应当被看做安全网。测试的根本动机都是使用经济且能有效应用的方法来认可软件质量。
  另一组要区分的术语是缺陷、错误和失效。软件缺陷是软件中一种静态的缺点。软件失效是关于需求或其他预期行为描述的外部的不正确行为,它是动态的。而缺陷表现为不正确的内部状态,称为软件错误。正如医生为患者做诊断的场景。患者带着一张“失效”的列表(即症状)进入医生的办公室。然后医生必须揭示患者的“缺陷”,或者说症状的根本原因。为了帮助诊断,医生可能需要一系列的测试来寻找患者体内的异常,诸如血压偏高、心律不齐、血糖偏高或胆固醇偏高。这些异常的内部状况就叫错误。而软件测试和医生诊断的区别在于软件缺陷是设计错误,医学问题通常是身体机能退化的结果。这个差异是很重要的,因为它解释了在哪个范围的过程可以控制软件的缺陷。
  测试用例输入值是测试过程中测试人员特别关注的内容,它们实际上给出了需要完成哪类测试。而关于软件测试常见的两个实际问题如何给输入值提供正确的预期值以及如何观察软件行为的细节。对大多数程序而言,潜在输入的数量如此之大,以至于可以看做无穷。由于我们不能测试所有输入,因此可以用覆盖准则决定使用哪些输入来测试。有效地利用覆盖准则,软件测试人员找到程序中错误的可能性更大,并且为软件的高质量和高可靠性提供了依据。本书依据测试需求定义覆盖准则,在第4章将系统论述覆盖准则的理论知识。
  软件测试涉及的内容广泛,业界对软件测试人员也有更多的要求:不仅要掌握程序设计思想和方法、高级程序设计语言、操作系统、网络技术、数据库技术,还要具备软件测试领域特定的知识和技术,包括软件测试基础理论、测试用例设计方法、测试流程和测试工具的应用等。本书借鉴了Pressman所著的《软件工程:实践者的研究方法(第6版)》1  中软件测试的战略战术思想以及Jorgensen所著的《软件测试(原书第2版)》2 对软件测试知识点的组织方式。
  本书叙述软件测试的一般原理和各种基本方法,分为五个部分。第一部分介绍软件测试基础、测试的数学基础和案例,包括第1章至第3章。第二部分介绍软件测试战术,涉及覆盖准则、黑盒测试和白盒测试,包括第4章至第6章。第三部分是软件测试策略,包括第7章至第11章,详细介绍单元测试、集成测试、系统测试和面向对象的测试的方法和技术。第四部分是针对特定环境和特定体系结构的测试,包括第12章至第15章,详细介绍图形用户界面测试、嵌入式软件测试、Web应用软件测试以及安全性测试的方法和技术。第五部分介绍测试管理与工具,包括第16章和第17章。
  软件测试的方法是辩证统一的,它们相互依赖而存在,相互对立又相互补充,任何一种测试方法都有其优点,在特定的测试领域都能得到充分发挥。同时,任何一种测试方法都不能覆盖所有测试的需求,在某些场合存在一定的局限性和不足。
学习软件测试的方法
  软件测试是一项需具备较强专业技术、学习和创新能力的工作。软件测试人员必须具有缜密的逻辑思维能力、全面的技术能力、敢想敢干的创新能力,要有较强的责任心和团队合作精神以及出色的沟通能力等专业素质。要成为一名合格的软件测试人才需要经过严格系统化的专业培养,在专业培养过程中强调实践动手能力和工程应用能力。学习的过程中需要学习者亲历亲为,结合案例实际动手分析,在实践中体会测试的真谛。
  软件测试的教学实践表明,没有亲身的测试体验就不能对软件测试的方法真正理解并灵活应用。目前软件测试课程的教学都缺少实际案例的支撑,没有相应的实验室或实训环境。其主要原因是软件测试这个行业较新,有些高校本身的计算机教师在这方面没有求学经验;此外这门课程实践性较强,很难自学,所以就造成有些高校教师讲授这门课程时没有任何实际的例子可以操作,进而更难给学生以测试经验方面的知识,这无疑会在教学中造成很大的遗憾。“软件测试”课程使用的工具和测试的对象都是摸不着的软件产品,实验与实训课程的组织和实施有较大的难度,容易造成实验的随意性。在海军工程大学贲可荣教授的鼓励下,我们在案例教学方面进行了一些尝试。
  我们在多年从事软件工程和软件测试的研究以及多年讲授软件测试课程经验与体会的基础上,对软件测试课程教学内容的知识点以案例为牵引进行调整、补充和完善。特别结合最近几年海军工程大学军用软件测评中心对国防工业如船舶、电子、通信等大量国防和军用软件测试的实际情况,针对软件测试用于各种应用领域的要求选择授课的知识点。
  本书的一个主要特点是:为教师教学和学生自学提供了大量可以借鉴和参考的案例,通过案例分析、展示各种测试方法的使用。在教学中通过案例来引入相应的方法,围绕案例使学生有一个实际应用方法的背景,同时通过对案例的剖析来加深对方法的理解和应用。
  本书中对案例的介绍主要是给出进行测试设计需要的输入信息。软件工程中对软件进行设计的方法不在本书讨论范围之内,因此我们只给出各阶段的产品作为测试依据。工资支付系统是一个按工程化方法进行软件设计比较完整的例子,学生必须学习如何提取测试依据以及测试设计所需的信息。三角形问题是测试界的一个古老的例子,其他的案例还包括简单自动柜员机问题(SATM)、面向对象的NextDate问题、挡风玻璃雨刷以及货币转换程序系统、简化的录像机系统等。
  本书的第二个特点是系统论述了覆盖准则的理论知识,对覆盖准则进行了分类:图覆盖、逻辑覆盖、输入空间覆盖和语法结构覆盖。从实践的观点看,覆盖准则提供了何时停止测试的有效规则。这部分内容可以作为研究生教学或本科教学的较高层次的部分,对于学生系统地理解和深入地掌握测试的方法和技术有深远影响。
  考虑到学生毕业后从事测试工作的特点,本书详细介绍针对特定环境、体系结构和应用的测试,包括图形用户界面测试、嵌入式软件测试、Web应用软件测试和安全性测试的方法。第五部分对测试过程管理和测试工具进行了阐述。
  近年来,海军工程大学在软件质量保证、软件可靠性、软件测试、软件维护等方面开展了许多研究,海军工程大学军用软件测评中心与海军装备软件北京测评中心的软件测试项目开展了深入的合作,为研究生培养和案例的提取提供了相关背景环境。
  本书第1~6章以及第12~15章由赵翀编写,第7~11章以及第16章和第17章由孙宁编写,全书由赵翀统稿。米巧丽、吴峰和凌波参与了部分资料的整理工作。贲可荣教授组织了本书的编写工作,对本书进行了全面仔细的审定,在审稿过程中提出了大量宝贵意见,谨表示衷心的感谢。
  在本书的编写过程中,参考和引用了许多专家、学者的著作和论文,在文中未一一注明。在此谨向相关参考文献的作者表示衷心的谢意。限于编者的水平,本书难免存在不足和不当之处,恳请读者批评指正。

编者
2010年12月

 本书第7版(中文版:978-7-111-33581-8,英文版:978-7-111-31871-2已由机械工业出版社出版。——编辑注)
 本书中文版(ISBN:7-111-12166-X)已由机械工业出版社出版。——编辑注

上架指导

计算机\软件工程

封底文字

软件测试是发现软件缺陷、提高软件可信性的重要手段,它贯穿软件工程的整个软件生命周期,涉及各种软件开发技术、应用技术以及测试技术,覆盖软件的各种应用领域。本书基于软件测试对实践动手能力和工程应用能力的要求,结合作者多年从事软件工程和软件测试的研究以及多年讲授软件测试课程的经验与体会编写而成。
本书以案例为牵引系统地介绍了软件测试的基本原理和常用方法,阐述了覆盖准则的理论知识,介绍了图形用户界面测试、嵌入式软件测试、Web应用软件测试和安全性测试等,并介绍了测试过程管理和测试工具。

本书特点
 通过案例展示各种测试方法的使用。书中提供了许多可以借鉴和参考的案例,并且围绕案例给出实际应用方法的背景,为学生分析案例提供样板。
 系统论述覆盖准则的理论知识。覆盖准则提供了何时停止测试的有效规则,书中将覆盖准则分为图覆盖、逻辑覆盖、输入空间覆盖和语法结构覆盖几类,有助于学生系统地理解和深入地掌握测试的方法和技术。
 详细介绍针对特定环境、体系结构和应用的测试方法,为学生从事实际测试工作奠定基础。

本书为教师提供教学课件,有需要者可登录华章网站(www.hzbook.com)下载。

图书目录

前言
教学建议
第一部分 软件测试背景知识
第1章 软件测试基础 1
1.1 软件质量 1
1.1.1 软件质量的内涵 1
1.1.2 软件质量与软件危机 3
1.1.3 软件质量保证 6
1.1.4 软件错误与缺陷 7
1.2 软件测试过程 10
1.2.1 软件测试的模型 10
1.2.2 测试过程成熟度 11
1.2.3 测试活动的自动化 12
1.3 软件测试术语 13
1.4 软件的可测性 14
1.5 软件测试原则 17
1.6 测试与调试 18
1.7 小结 20
习题 20
第2章 图论 21
2.1 无向图 21
2.2 有向图 23
2.3 用于测试的图 25
2.3.1 程序图 25
2.3.2 有限状态机 26
2.3.3 Petri网 27
2.3.4 事件驱动的Petri网 28
2.3.5 状态图 29
习题 29
第3章 测试案例 31
3.1 工资支付系统 31
3.2 三角形类型问题 34
3.3 简化的录像机系统 35
3.4 简单自动柜员机问题 36
3.5 货币转换程序 39
3.6 面向对象的NextDate问题 43
3.7 挡风玻璃雨刷系统 44
3.8 小结 45
习题 45
第二部分 软件测试战术
第4章 覆盖准则 46
4.1 引言 46
4.2 图覆盖准则 47
4.2.1 结构化的覆盖准则 50
4.2.2 案例:寻找主路径 53
4.2.3 数据流覆盖准则 56
4.2.4 案例:三种数据流覆盖准则的区别 59
4.2.5 图覆盖准则之间的包含关系 59
4.3 逻辑覆盖准则 60
4.3.1 逻辑谓词和子句 60
4.3.2 逻辑表达式覆盖准则 61
4.3.3 活动子句覆盖准则 62
4.3.4 案例:带气门的系统CACC和RACC设计 63
4.3.5 非活动子句覆盖准则 64
4.3.6 逻辑覆盖准则的包含关系 65
4.3.7 建立判定谓词的子句 65
4.3.8 案例:工资支付系统查找满足覆盖准则的值 66
4.4 输入空间的划分准则 68
4.4.1 输入域建模 69
4.4.2 组合策略准则 73
4.4.3 划分中的约束 75
4.5 基于语法的覆盖准则 76
4.5.1 BNF覆盖准则 77
4.5.2 变异测试覆盖准则 78
4.5.3 案例:stream语法的MOC和MPC覆盖 79
4.5.4 基于程序的语法覆盖准则 80
4.5.5 案例:min方法的变异测试 83
4.6 小结 84
习题 84
第5章 白盒测试 88
5.1 路径测试 88
5.1.1 程序图的表示 88
5.1.2 DD-路径 89
5.1.3 基路径测试 92
5.1.4 独立程序路径 92
5.1.5 案例:计算平均值的程序 93
5.2 控制结构测试 95
5.2.1 条件测试 95
5.2.2 案例:三角形问题的条件测试 96
5.2.3 数据流测试 97
5.2.4 案例:三角形问题的数据流测试 98
5.2.5 循环测试 98
5.2.6 案例:计算平均值的程序 99
5.3 变异测试 100
5.3.1 结构化变异 100
5.3.2 面向对象变异 101
5.3.3 案例:工资支付系统 102
5.4 小结 103
习题 104
第6章 黑盒测试 105
6.1 基于图的测试 105
6.1.1 基于图的测试方法 105
6.1.2 案例:工资支付系统的活动图测试设计 106
6.2 等价划分 108
6.2.1 等价划分的测试方法 108
6.2.2 案例:工资支付系统的等价类测试设计 109
6.3 边界值分析 110
6.3.1 边界值分析的测试方法 110
6.3.2 案例:工资支付系统的边界值测试设计 112
6.4 正交表测试 113
6.4.1 正交表测试方法 113
6.4.2 案例:工资支付系统的正交表测试设计 115
6.5 健壮性测试 116
6.5.1 健壮性测试方法 116
6.5.2 测试用例生成要求 117
6.5.3 案例:工资支付系统的健壮性测试设计 117
6.6 决策表测试 118
6.6.1 决策表测试方法 118
6.6.2 案例:工资支付系统的决策表测试设计 119
6.7 有穷状态测试 119
6.7.1 有穷状态测试方法 120
6.7.2 案例:工资支付系统的有穷状态测试设计 121
6.8 小结 125
习题 125
第三部分 软件测试策略
第7章 软件测试的策略性方法 127
7.1 测试策略概述 127
7.2 验证与确认 128
7.3 软件测试的组织 129
7.4 软件测试的层次 129
7.4.1 测试层次的传统观点 130
7.4.2 生命周期模型对测试的影响 130
7.5 人工测试技术 131
7.5.1 走查 132
7.5.2 正式评审 132
7.5.3 审查 133
7.6 自动化测试与人工测试 133
7.7 测试完成的标准 135
7.8 回归测试 135
7.9 小结 136
习题 136
第8章 单元测试 137
8.1 单元测试概述 137
8.2 单元测试的任务 138
8.3 单元测试的规程 140
8.3.1 进入单元测试的条件 141
8.3.2 单元测试的类型及要求 141
8.3.3 通过准则 143
8.4 单元测试的测试代码编写 143
8.5 案例:测试Grow函数 144
8.6 小结 146
习题 146
第9章 集成测试 147
9.1 集成测试的概念 147
9.2 集成测试的策略 148
9.3 基于功能分解的集成测试 149
9.3.1 自顶向下集成测试 149
9.3.2 自底向上集成测试 150
9.3.3 三明治集成测试 151
9.3.4 基于功能分解方法的优缺点 151
9.4 基于调用图的集成测试 152
9.4.1 成对集成测试 152
9.4.2 相邻集成测试 152
9.4.3 基于调用图方法的优缺点 153
9.5 基于路径的集成测试 153
9.5.1 MM-路径的相关概念 154
9.5.2 MM-路径的集成测试 154
9.5.3 MM-路径复杂度 155
9.5.4 基于路径方法的优缺点 155
9.6 集成测试文档 156
9.7 面向对象环境中的集成测试 156
9.8 案例:SATM系统集成测试 156
9.9 小结 164
习题 164
第10章 系统测试 165
10.1 系统测试的概念 165
10.1.1 系统测试前的准备工作 165
10.1.2 系统测试的主要内容 166
10.1.3 系统测试的测试数据 167
10.1.4 系统测试与确认测试 167
10.2 系统级功能测试 168
10.2.1 线索的概念 168
10.2.2 需求规约的基本构造元素 169
10.2.3 寻找线索 171
10.2.4 线索测试的结构策略 173
10.2.5 线索测试的功能策略 174
10.2.6 案例:SATM系统的测试线索 176
10.2.7 系统测试线索的选择策略 180
10.3 压力测试 182
10.3.1 压力测试的概念 182
10.3.2 压力测试的方法 183
10.4 性能测试 183
10.4.1 性能测试的概念 183
10.4.2 性能测试与压力测试的区别 184
10.4.3 性能测试的步骤 184
10.5 恢复性测试 186
10.6 安全性测试 186
10.7 小结 186
习题 187
第11章 面向对象的测试 188
11.1 面向对象相关概念 188
11.1.1 继承 188
11.1.2 重用、封装和多态性 189
11.1.3 测试单元 189
11.1.4 测试层次 189
11.1.5 测试用例 189
11.2 类测试 190
11.2.1 以方法为单元 190
11.2.2 案例:Date.increment方法的单元测试 190
11.2.3 以类为单元 191
11.2.4 案例:windshieldWiper类的单元测试 192
11.2.5 类级可应用的测试方法 195
11.3 面向对象的集成测试 196
11.3.1 基于UML的集成测试 196
11.3.2 面向对象软件的MM-路径 197
11.3.3 案例:o_oCalendar的MM-路径测试 197
11.3.4 面向对象数据流集成测试框架 201
11.4 面向对象的系统测试 202
11.4.1 基于UML的系统测试 203
11.4.2 基于“状态图”的系统测试 204
11.5 小结 206
习题 207
第四部分 特定环境和特定体系结构的测试
第12章 图形用户界面测试 208
12.1 GUI测试的特点 208
12.1.1 GUI测试的独特性 208
12.1.2 一般Windows窗体构成部件 208
12.1.3 优秀GUI的构成要素 210
12.2 GUI测试技术 212
12.2.1 GUI测试验证的方法 212
12.2.2 测试标号和装饰性的GUI控件 214
12.2.3 测试带有键盘输入的文本框控件 215
12.2.4 测试RadioButton控件和CheckBox控件 215
12.2.5 GUI测试自动化中的菜单测试 216
12.3 GUI测试用例的设计方法 216
12.3.1 窗体的测试设计 217
12.3.2 菜单的测试设计 217
12.3.3 文本框控件的测试设计 217
12.3.4 按钮控件的测试设计 218
12.3.5 组合列表框、复选框、列表框控件的测试设计 218
12.3.6 滚动条控件的测试设计 218
12.3.7 各种控件在窗体中混合使用时的测试设计 218
12.4 案例:工资支付系统 219
12.5 小结 220
习题 220
第13章 嵌入式软件测试 221
13.1 嵌入式软件 221
13.1.1 嵌入式系统和嵌入式软件 221
13.1.2 嵌入式系统专用测试方法 222
13.1.3 嵌入式软件测试模型 225
13.2 嵌入式软件测试技术 226
13.2.1 嵌入式软件测试步骤 226
13.2.2 基于状态的测试设计技术 227
13.2.3 其他测试设计技术 230
13.3 嵌入式软件的测试环境 232
13.3.1 模拟阶段 232
13.3.2 原型阶段 233
13.3.3 临近生产阶段 234
13.3.4 开发后阶段 235
13.4 案例:简化的录像机状态转换测试 236
13.5 小结 239
习题 239
第14章 Web应用软件测试 240
14.1 Web应用软件概述 240
14.1.1 Web应用软件的特点 240
14.1.2 Web应用软件的质量维度 241
14.1.3 Web应用软件错误的特点 241
14.2 测试Web应用软件概述 242
14.2.1 测试策略 242
14.2.2 测试策划 242
14.2.3 测试建模方法 242
14.2.4 测试过程概述 244
14.3 内容测试 245
14.3.1 内容测试的目标 245
14.3.2 动态内容测试 246
14.4 界面测试 247
14.4.1 界面测试策略 247
14.4.2 测试界面机制 248
14.4.3 测试界面语义 249
14.4.4 可用性测试 249
14.5 导航测试 250
14.5.1 测试导航语法 250
14.5.2 测试导航语义 251
14.6 构件级测试 251
14.7 配置测试 252
14.8 性能测试 253
14.9 Web应用软件测试环境 254
14.10 案例:工资支付系统 255
14.11 小结 256
习题 257
第15章 安全性测试 258
15.1 软件中的安全漏洞 258
15.1.1 设计引入的安全漏洞 258
15.1.2 实现引入的安全漏洞 259
15.1.3 部署上的薄弱性 260
15.2 安全性测试技术 260
15.2.1 常见网络故障注入技术 260
15.2.2 会话攻击技术 263
15.2.3 Web应用程序攻击技术 265
15.2.4 本地故障注入技术 269
15.3 安全性测试的测试环境 274
15.3.1 建立用于测试的实验室 274
15.3.2 开展应用程序攻击 275
15.4 漏洞侦探试验 277
15.4.1 协议发现 277
15.4.2 SOAP和WSDL 278
15.4.3 使用SOAPpy库侦探漏洞 279
15.5 小结 282
习题 283
第五部分 测试管理与工具
第16章 测试过程管理 284
16.1 测试过程中的活动 284
16.2 软件测试过程要求 285
16.2.1 测试需求分析 285
16.2.2 测试策划阶段 286
16.2.3 测试设计和实现 287
16.2.4 测试执行 288
16.2.5 测试总结 289
16.3 软件测评项目管理 290
16.3.1 测评项目需求管理 290
16.3.2 测评项目策划 291
16.3.3 测评项目跟踪与控制 291
16.3.4 测评项目质量保证 291
16.3.5 测评项目配置管理 293
16.4 文档和记录的控制 294
16.5 测试过程改进 294
16.6 岗位与职责 295
16.7 评审与控制 296
16.8 测试过程规范 296
16.9 小结 297
习题 297
第17章 软件测试工具 298
17.1 软件测试工具概述 298
17.1.1 软件测试工具的引入 298
17.1.2 软件测试工具分类 299
17.2 静态分析工具 300
17.2.1 静态测试工具的原理 300
17.2.2 常用静态测试工具 301
17.3 动态分析工具 303
17.3.1 动态分析工具的原理 303
17.3.2 常见的动态分析工具 303
17.3.3 IBM Rational PurifyPlus简介 304
17.4 功能测试工具 308
17.4.1 功能测试自动化过程 308
17.4.2 HP WinRunner简介 309
17.5 性能测试工具 310
17.5.1 性能测试步骤 310
17.5.2 Rational Robot简介 311
17.6 小结 312
习题 312
附录 测试文档模板 314
参考文献 323

教学资源推荐
作者: Ian Sommerville
作者: 麻志毅
作者: 主编 宫云战 参编 赵瑞莲,张威,王雅文,张俞炜
作者: Jakob Nielsen
参考读物推荐
作者: (美)John D.Musa
作者: Dennis M.Ahern, Aaron Clouse, Richard Turnet
作者: Peter Herzum, Oliver Sims