图书前言

关 于 作 者

Rex Black 拥有长达1/4个世纪的软件与系统工程的丰富经验,他现任Rex Black 咨询公司(RBCS)的总裁与首席咨询师,RBCS是软件、硬件和系统测试领域的领先者。在过去十多年间,RBCS为全球范围内的许多客户提供了与测试和质量保证相关的咨询、外包、评测和培训服务。RBCS的100多个客户分布在全球六大洲的20个国家,这些客户包括Adobe(India)、ASB Bank、Bank One、Cisco、Comverse、Dell、美国国防部、Hitachi、NDS以及Schlumberger。

Rex已经出版了4本相关著作,是当今在测试和质量保证领域著作最多的作者。他的第一本书《管理测试过程》(Managing the Testing Process)非常流行,现在已经出了第2版,并已在全世界销售了超过25 000本,其中包括在日本、中国和印度发行的版本。他的另外一本关于测试管理的书,《关键测试过程》(Critical Testing Process),以及本书的早期版本,当时题为《有效且高效的软件测试》(Effective and Efficient Software Testing),都已经销售了数千本,并出版了希伯来语、印度语、日语,以及俄语的版本

Rex还是国际软件测试认证委员会(ISTQB)(www.istqb.org)和美国软件测试认证委员会(ASTQB)(www.astqb.org)的主席。他是ISTQB现在使用的基础课程大纲(2005版),以及将要出版的高级课程大纲(2007版)的主要作者,并同Isabel Evans、Dorothy Graham和Erik van Veenendaal一起编写了ISTQB考试使用的权威教材——《软件测试基础》(Foundations of Software Testing)。

除了上述著作之外,Rex还发表了超过25篇期刊论文;并在会议和研讨会上发布了数百篇论文;他还在世界各地的学术会议和活动中发表过十多次主题演讲。

Rex除了环游世界进行工作和旅游之外,其他时间居住在美国德克萨斯州的Bulverde小镇,和他一起居住的还有:他的妻子Laurel Becker;两个女儿Emma Grace和Charlotte Catherine;还有他的两条狗Cosmo 和 Hank。

前    言

哪怕是测试一个简单的系统,也可能会是一个旷日持久的任务。在经费和进度紧张的情况下,测试者需要使用实用的技术,亲自实践的经验和正确的策略来有效而高效地进行软件测试。

本书将会把这些内容交到你的手中。通过一系列表述完好,清晰透彻而实用的章节,你将掌握对软件测试至关重要的技能。

* 如何分析系统的质量风险,并根据风险的级别来恰当地安排你的测试工作。

* 不同的测试策略,以及每次如何选择正确的测试策略,包括选择处理回归测试的高效策略。

* 如何基于系统的预期行为来设计(黑盒)测试,包括边界值(boundary value)、等价性划分( equivalence partitioning)、决策表(decision table)、用况(use case)、状态转换图表(state diagram and table)、所有对值表 (all-pairs table)、正交表(orthogonal arrays),以及域分析(domain analysis)。

* 如何基于一个系统的内部结构来设计(白盒)测试,包括代码覆盖等级、数据流覆盖和基本路径覆盖。

* 如何规划和执行集成测试。

* 如何使用你的直觉、经验和知识去探测和攻击系统。

* 如何让你的辛勤工作服务于项目的需要。

* 因为测试是一个切身实践体验的活动,本书包括11个完整章节,以真实而原汁原味的练习来展示所有主要的测试技术,以及具体的解决方案 。

如果你从来没有读过一本关于测试设计的书,如果你已经读过其他的测试设计的书却发现它们很难付诸实施,如果你已经读过某本测试设计的书却发现它在事情变得真正有意思的时候就嘎然而止,那么这本书就是为你写的。读完本书后,你学到的关于测试的具体技巧会比多数测试人员在其整个职业生涯中学到的还要多,你将会胸有成竹地把这些知识运用到你下一个测试项目中去。

引    言

这是一本什么样的书?

这是一本关于软件和系统测试的书。这是一本雄心勃勃的书。我在本书中讲解了有效和高效的测试专业人员进行工作所需要的策略、技术和概念。本书包括了很多这方面的知识。

这是一本关于实践概念,并可用于实际工作的书。如果你愿意费力气弄懂本书的话,你可以进行很多真实的练习来立即应用这些概念。你还可以把你的解决方法和我的解决方法进行比较。

理所当然,本书也要经过测试。我的软件开发经历起于一个Fortran和C编程工作的职位,在4年之后的1987年,我开始作为了一个测试专业人员,此后的职业生涯中我一直在使用本书中的概念。而从1997年开始,实际上有数千位遍布全球的软件和系统专业人员接受了我的培训课程,这些课程为本书提供了基本素材。因此我们已经对书中的概念进行过讨论,并对书中的练习进行过演练。

我们讨论了哪些主题?

第一部分讨论了有效而高效测试的目标、策略和战术。即使是有经验的测试人员也会在这里发现一些新东西,我鼓励刚接触测试的人们完整地读完这些章节。

第二部分讲述了基于风险测试的测试技术的基础。你将学习使用非正规或者正规的技术,如何分析系统质量的风险、如何为这些风险划分优先级以及为风险编写文档。除非你已经是一个有经验的风险分析专家,否则我推荐你仔细地通读这一部分,包括完成练习。

在本书的核心部分,根据通过质量风险分析定义来进行测试的目的,你将开始充实你的测试工具箱。在第三~第五部分中,你将学习设计、开发各种类型的测试,以及最后为它们编写文档。你将学习静态、黑盒以及白盒测试技术,包括如下内容:

* 需求、设计和代码复审

* 等价类和边界值分析

* 决策表

* 实况数据和客户工作流测试

* 状态转换图

* 域测试

* 正交表

* 语句、分支、条件和循环代码覆盖

* McCabe复杂度和单元基本测试

* 数据流覆盖

* 集成测试技术

* McCabe集成基本测试

这些都是最基础的测试技术,是将一个测试专业人员和兼职或业余测试人员区分开来的技术。我建议你通读所有这些章节包括练习,即使你已经是一个有经验的测试人员。如果你已经掌握了这些主题,这些材料和练习对你而言应该是容易的,但是你可能会在这些章节中发现新的细微差别,我在准备这些章节时就发现了不少。

第六部分是Omninet市场和系统需求文档,以及参考书目和进一步阅读的建议。

我能跳过一些主题吗?

如果你感觉其中一个或两个主要的测试技术对你来说并不适用,尽管跳过它们。例如,你可能在一个完全注重于黑盒技术的团队中工作,那么就可以跳过静态和白盒测试的部分。黑盒测试部分可独立成篇,每个技术也都可以独立地进行学习。同样地,你可以阅读静态测试和白盒测试,而跳过黑盒测试。这都由你来决定。

虽然所有这些都是基础的测试技术,它们的适用度却并不尽相同。我将它们划分到三个类别中:

* 普遍适用的--等价类、边界值、复审、代码覆盖和集成测试技术。

* 经常适用的--决策表、状态转换图、实况数据和客户工作流、McCabe圈复杂度以及正交表。

* 有时适用的--域分析、数量覆盖以及McCabe集成基本测试。

你当然可以决定只学习普遍适用和经常使用的部分,如果这些就是你感到需要现在就学习的东西。本书中的这些材料是按照模块化设计的,便于选择性地阅读。

然而,如果你的目标是成为一个技能全面的测试专家,你需要熟悉所有这些主要的测试技术,不仅仅对你当前的工作而言,而且也要为你未来的工作考虑。如果你想要追求一个主流的测试认证,诸如由国际软件测试认证委员会的国家委员会所颁发的基本或高级认证,你就需要经过这些概念中的大多数的考试。

在我20余年作为一个测试专业人员或者软件工程师的职业生涯的某些时候,本书涵盖的每个章节都曾是重要而实用的。在本书行文中,我将指出为什么我发现这些主题是重要的,通常会伴以在我曾经工作过、或者从可靠来源听说过的一些典故。有道是,“任何傻瓜可以从他自己的错误中学到教训(我希望我已经做到了这一点),但是我们中最聪明的人可以从别人的错误中学到教训。”因此,我将不仅和你分享成功的故事,也会说到一些前车之鉴。

我能用真实的练习来实践吗?

本书使用了一个逼真的项目Omninet来构造许多练习。Omninet是一个在诸如购物中心、剧场和其他公共场所部署Internet访问公共自助服务机网络的一个项目。用户将可以使用现钞、借记卡或者信用卡来购买Web浏览时间。这个虚拟项目的真实度和复杂度将使读者能够了解我们所谈及的许多测试概念(尤其是那些测试技术)的机会。

本书附录中包括了该项目的市场需求文档和系统需求文档。我推荐你在开始阅读第1章之前先看一下它们。

因为Omninet不是展示每一个概念的完美途径,我也讲述了一些其他的例子。当我们遇见这些例子时我会在练习中进行解释的。

在现场课程中和培训材料中分配给练习的时间是严格限制的,通常在30分钟~120分钟。乍看起来这并不真实,但是在现实中,作为测试专家的许多工作也都是受到时间限制的。出于这个原因,我为每个练习建议了时间限制。这些时间限制意味着你在你的解决方案中会有简洁易用的问题。

我在我的解决方案中也遵循这些限制。在我的解决方案中,简洁易用指在一个典型的时间有限的测试项目中我期望应当具有的简洁易用的水平。在现实生活中,我们不总是需要(或者有机会来)润色我们的工作,特别是对于我们自己的内部用途而言。

在很多情况下,存在超过一个的正确解答。所以,如果只是你的解答和我的不同,这并不意味着你的解答或者我的解答是错的。这些差异可能意味着我们对哪些东西有着重要的假设不同。如果你得到了一个和我不一样的解答,问问你自己在视角和优先级中有哪些不同可能导致这些差异。

我曾经(或者未曾)读过其他关于测试的书籍会有关系吗?

本书是独立成文的,所以你不需要阅读其他的测试书籍。如果你读过我的其他著作,《管理测试过程》(Manage the Testing Process)和《关键测试过程》(Critical Testing Processes),它们和本书除了在质量风险分析的材料上有一点重叠外,其他内容的重叠部分很少,即使已经熟悉了该主题上我的一些早期著作,你也可能在这里发现一些新的观点。

如果已经读过其他测试设计书籍,你也会在那些主题上发现新的观点。我都从基本观点开始讲述每个测试设计技术,但在有些讨论中--尤其是在我对练习解答的讨论中,我也会进行深入讨论。

软件测试实践:成为一个高效能的测试专家

引    言

译 者 序

软件测试是软件开发过程中不可或缺的阶段,自20世纪70年代开始,业界就公认,在一个典型的编程项目中,测试会占到一半乃至更多的时间和资源。30年来编程语言和软件开发技术的发展日新月异,今天我们拥有了更成熟更丰富的手段来便利地构造精妙复杂的软件,但是测试依然扮演着同样重要的角色。并且,随着计算机软件技术在各行各业的普及运用,人们对软件质量的要求也越来越专业化和多样化。软件开发团队必须尽可能地在交付产品之前控制未来的质量风险,这就必然需要依赖于卓有成效的软件测试。

软件测试远比人们所直观想象的要复杂,哪怕是测试一个简单的系统,也会是一个潜在的旷日持久的任务。在经费和进度紧张的情况下,测试者需要切合实用的技术,亲自实践的经验和正确的策略来有效而高效地进行软件测试。

在现实生活中,有效而高效的软件开发技能常常成为业界人员的热门话题和追逐目标,有效而高效的软件测试技能却相对为人们所冷落。正如软件测试泰斗Glenford Myers在其经典著作《软件测试艺术》中所言,“我们的学生每年毕业进入业界,几乎全无软件测试方面的知识,甚至,我们几乎从未指导过学生应该如何来测试和调试他们写下的课程程序。”IBM的测试教育专家Gerald D. Everett在他的著作《软件测试:贯穿整个生命周期的测试》中谈到,在他对美国21所大学进行的一个调查中发现,其中18所大学均没有开设任何软件测试方面的课程。这说明软件测试的培训与教育并无法满足当今IT产业的需求。

这个现象在中国的软件产业中也有所反映,尽管客户对高质量高可靠度软件产品的需求日益增加,尽管软件测试愈来愈为国内业界重视,高效的软件测试工程师依然是各开发团队争相网罗的人才。另一方面,随着敏捷开发方法等新一代软件工程概念的风靡,软件编码和测试过程多次迭代,测试人员更积极地参与到软件生命周期的各个阶段中,使得整个项目团队收取事半功倍的成效。编码和测试人员越来越紧密地协同工作,优秀的程序员必然需要了解测试的方法和概念,优秀的测试人员所具备的技能也不再是仅仅是对现成的程序进行直观的功能测试,软件测试的涵义和策略日益复杂,软件质量风险控制涉及到愈来愈多的方面。故而软件企业对员工进行测试概念、过程、技巧、工具等方面的培训,能显著地提高整个团队的工作效率。

本书是一本测试技术的入门手册。即使对软件测试毫无所知的读者,阅读完本书后也会对软件测试的概念和方法有一个较为扎实的知识基础,从而可以参与实际的软件测试活动。作者Rex Black是一个有20余年软件和系统工程经验的资深专家,曾出版《管理测试过程》等著作。他也是国际软件测试认证委员会和美国软件测试认证委员会的主席。

本书深入浅出地探讨了测试专业人员须知的方法和概念。阐述了测试的基础技术,并且清晰地展示给你在经费和时间有限的情况下,如何选择和运用成功的策略来测试一个系统。本书将为读者提供下列各方面的指导:

* 如何分析系统的质量风险,并且依据风险级别来分配测试工作的侧重点。

* 介绍多种不同的测试策略,以及如何每一次实践中如何选择最好的策略。

* 如何依据系统的期望行为(黑盒)来设计测试。

* 如何依据系统的内部结构(白盒)来设计测试。

* 如何采用你的直觉、经验、知识来更好地进行测试。

值得特别指出的是,本书把测试与风险分析结合起来,详尽探讨了通过测试来控制风险的方法。质量风险概念成为指引测试活动的量标。这种视角有助于测试人员站在软件质量保证的高度上来思考所从事的测试活动,在学术探讨和实际应用中均颇具价值,即使是新入门的测试人员,也能藉此为线索,领悟到软件开发过程的精华理念。

本书涉及的软件测试实践中大多数耳熟能详的经典概念和技术,主要包括如下内容。

* 第一部分:测试的基本知识简介。包括测试的目标、策略、与技巧。本部分是全书的基础,后面介绍的内容都围绕这些基本目标展开。

* 第二部分:基于风险的测试介绍。通过理解系统质量风险,把测试与风险控制结合起来,是本书提供给读者的一个新的视角。

* 第三部分:静态测试。本部分简要介绍静态测试的主要方法之一:复审的技术以及相关练习。

* 第四部分:行为测试。本部分详细介绍了多种主要的行为测试技术,包括同等类与边界值、决策表、状态迁移图、领域测试、正交数组等测试方法,每种测试技术均配备了练习与参考解答。

* 第五部分:结构测试。本部分涉及到的主要技术包括控制流测试、数据流测试、集成测试,每种测试技术均配备了练习与参考答案。

本书的叙述简明清晰,可操作性强,并且提供了大量有价值的练习以供实践。本书适合从事软件测试与软件开发的IT从业人员或者高等院校计算机专业的高年级本科生以及研究生阅读。

鉴于译者的水平有限,书中错误与疏漏在所难免,敬请读者批评指正。

郭 耀  李 琦

于北京大学