
第1版前言
在过去的半个世纪,软件获得了空前的发展,逐渐渗透到各个领域,从最早的科学计算、文字处理、数据库管理、银行业务处理到工业自动控制和生产、办公自动化、新闻媒体、通信、汽车、消费电子、娱乐等,软件无处不在,改变了人类的生活与生产方式。随着计算机软件在各行各业的普及应用,人们对软件质量的要求也越来越高,专业化和多样化的特点越来越显著。但同时,我们看到软件产业还不够成熟,软件质量状况不容乐观,软件在运行和使用过程中出现的问题还比较多。例如,2008年互联网Web发展十大失败的事件中,90%的失败都是由软件质量问题造成的,与“宕机”“停机”“崩溃”等一系列严重的质量问题联系在一起。
软件质量一直是软件工程中的一个焦点,成为人们几十年来不断研究、探索的领域。为了改善软件质量,人们不仅从企业文化、软件过程模型、需求工程、设计模式等不同方面来获取有效的方法和最佳的实践,而且开始重视软件测试,在软件测试上有更多的考虑和投入。虽然质量是内建的,但软件测试依旧承担着非常重要的作用。软件测试自身也在发生变化,已经不再只充当门卫的角色——在软件发布之前进行检验,而是正在成为一个持续的反馈机制,贯穿软件开发的整个过程,能尽早地发现问题,降低开发成本,提高软件开发生产力。软件测试人员不再是软件开发的辅助人员,而是软件开发团队的主体之一、积极的参与者。从项目开始的第一天,测试人员就参与项目需求和设计的讨论、评审等各种活动,尽早发现软件需求定义和设计实现上的问题,及时发现软件项目中存在的质量风险。软件开发团队必须尽可能地在交付产品之前控制未来的质量风险,这就必然需要依赖于卓有成效的软件测试。将传统的程序测试的狭义概念扩展到今日业界逐渐认可的、广义的软件测试概念,测试涵盖了需求验证(评审)、设计验证(评审)等活动。软件测试贯穿整个软件生命周期,从需求评审、设计评审开始,就介入软件产品的开发活动或软件项目实施中,和其他开发团队相互协作、相互补充,构成软件生命周期中的有机整体。
软件测试不是一项简单的工作,远比人们所直观想象的要复杂。高效、高质量地完成一个软件系统的测试,涉及的因素很多,也会碰到各种各样的问题,并且要在测试效率和测试风险之间找到最佳平衡点和有效的测试策略,这些都需要测试人员一一克服。要做好软件测试,不仅需要站在客户的角度思考问题,真正理解客户的需求,具有良好的分析能力和创造性的思维能力,完成功能测试和用户界面的测试,而且能理解软件系统的实现机理和各种使用场景,具有扎实的技术功底,通过测试工具完成相应的性能测试、安全性测试、兼容性测试和可靠性测试等更具挑战性的任务。软件测试的主要目的是发现软件中的缺陷,坚持“质量第一”的原则,在实际操作中会遇到一些阻力,需要测试人员去克服。从这些角度看,要成为一个优秀的测试工程师,其实比对成为设计、编程人员的要求还要高,测试人员不仅要体现高超的技术能力,如系统平台设置、架构设计分析、编程等方面的能力,而且要展示自己的业务分析能力、对客户需求的理解能力和团队沟通协作的能力。
本书在内容上进行了精心组织,从概念到方法,再从方法到实践,满足知识层次和逻辑关系的要求,使课程教学和学习更加自然和有效。例如,先介绍软件测试用例的基本内容和基本方法,然后结合单元测试、功能测试和系统测试来介绍测试用例的具体设计方法,包括白盒方法和黑盒方法。再如,先介绍自动化测试的特点、原理和方法,然后在后面各章结合实际测试需要,引入所需要的测试工具,使方法、工具和测试实践有机地结合起来,使读者更容易理解和掌握工具的使用。
本书全面介绍了软件测试的先进理念和知识体系,演绎了如何使用软件测试的方法、技术和工具,帮助大家尽快成为优秀的测试工程师。首先,在第1章回答了一系列关于软件测试的基本问题。
•为什么要进行软件测试?
•软件测试是什么?
•软件测试学科是如何发展而来的?
•软件测试带给我们什么?
然后逐步地深入到软件测试领域的各个知识点,包括需求和设计的评审、测试用例设计、自动化测试、缺陷报告、单元测试、功能测试、系统测试、测试计划和管理等。
•第2章,不仅介绍了各种评审方法,而且从测试人员角度出发,讨论了如何理解需求和设计实现、如何对需求和设计进行评审,包括清晰地描述了需求评审和各类设计评审的标准。
•第3章,从一个简单的实例引入测试用例,阐述了为什么需要测试用例以及如何从书写、基本设计方法和评审等各个方面保证测试用例的质量,并说明如何组织、使用和维护测试用例。
•第4章,也是从一些有趣的、简单的实验和一个实实在在的自动化测试的例子,引入软件测试自动化,然后介绍自动化测试的概念、原理、特点和优势,包括代码分析、对象识别和脚本技术。最后,讨论了如何引入自动化测试以及选择测试工具。
•第5章,重点介绍了单元测试中白盒测试方法和代码评审,包括分支覆盖、条件覆盖法、基本路径、组合覆盖等方法和代码缺陷检查表等。而且,还讨论了集成测试的策略和方法,以及单元测试工具,包括JUnit和微软VSTS等。
•第6章,重点介绍了功能测试用例的各种设计方法,包括等价类划分、边界值分析、因果图、决策表、功能图和正交试验等方法,并讨论了可用性测试、功能测试执行策略和实践、功能测试工具及其使用。
•第7章,介绍了国际化和本地化的概念及其关系,详细展示了国际化测试和本地化测试的要求、方法、工具和具体的技巧,包括功能、数据格式、UI、配置、兼容性和翻译等方面的验证。
•第8章,内容丰富,详细讨论了负载测试、压力测试和性能测试等概念及其联系,重点讨论了负载测试和性能测试的方法、技术和工具,包括输入/输出参数、场景设置、结果分析等。然后,介绍了兼容性测试、安全性测试、容错性测试和可靠性测试等。
•第9章,描述了缺陷报告的内容、格式和各种属性,如类型、来源、严重性和优先级等,重点阐述了缺陷生命周期、如何有效地报告和处理缺陷、各种缺陷分析方法及其作用。
•第10章,强调了测试原则,详细介绍了软件测试计划的过程,包括如何制定测试的目标和策略、如何分析测试范围和预估测试的工作量、如何完成资源安排和进度管理等。最后,讨论了测试风险、测试报告和测试管理工具等。
本书特别重视理论与实践相结合,使读者既能领会软件测试的思想和方法,又能将这些方法和技术应用到实际工作中去。因此,本书既适合作为计算机应用、计算机软件、软件工程、软件测试等学科的大学教材,也适合从事软件开发和维护的工程技术人员阅读,包括软件测试人员、开发人员、项目经理和产品经理。
由于作者水平有限,本书不可避免会存在一些错误、不准确以及其他问题,恳请读者见谅并能及时提出宝贵意见。
作者
2009年1月