软件测试概念与实践
软件测试入门指南
Amazo* 5星畅销书
本书探讨了软件测试面临的主要问题,软件测试概念、原则和演化过程,涵盖了软件质量工程和测试概念、测试数据生成、测试部署、测试输出分析,以及软件测试管理。
本书特色
◆ 本书没有将软件测试当作一项孤立的技术,而是将其视为完整的软件验证和确认原则的组成部分。
◆ 根据边际效用递减规律,建议在同一个数学模型基础上开展程序测试和程序正确性验证工作,从而能够协调应用两种技术。
◆ 定义了软件缺陷概念和相对正确性概念,指出相对正确性是如何描述单调缺陷去除的。
◆ 将软件测试活动描述为一种面向目标的活动,研究了如何根据选择的测试目标指导测试活动。
◆ 涵盖了软件测试生命周期全过程,包括测试数据生成、测试预言设计、测试驱动设计,以及测试输出分析。
对软件质量和软件工程专业学生而言,《软件测试概念与实践》一书是非常有用的,因为本书为学生提供了职业生涯的基础知识,而且这些基础知识在各种原则不断演化的条件下也不会过时。
第Ⅰ部分 软件测试介绍
第1章 软件工程:一种与众不同的原则 3
1.1 年轻而动荡的原则 3
1.2 压力下的行业 6
1.3 规模庞大的复杂产品 7
1.4 昂贵的产品 10
1.5 缺乏重用实践 12
1.6 容易出错的设计 13
1.7 矛盾的经济学 14
1.7.1 劳动力密集的产业 15
1.7.2 缺少自动化 15
1.7.3 质量控制手段有限 16
1.7.4 不平衡的生命周期成本 16
1.7.5 不平衡的维护成本 17
1.8 本章小结 19
1.9 参考书目注释 19
第2章 软件质量属性 21
2.1 功能属性 22
2.1.1 布尔属性 22
2.1.2 统计属性 23
2.2 操作属性 25
2.3 可用性属性 27
2.4 业务属性 28
2.5 结构属性 30
2.6 本章小结 32
2.7 练习 32
2.8 参考书目注释 33
第3章 软件测试生命周期 35
3.1 软件工程生命周期 35
3.2 软件测试生命周期 41
3.3 软件测试的V模型 48
3.4 本章小结 51
3.5 参考书目注释 51
第Ⅱ部分 软件测试基础
第4章 软件规约 55
4.1 坚实可靠规约的原则 57
4.2 关系数学 58
4.2.1 集合与关系 58
4.2.2 关系操作 59
4.2.3 关系的属性 61
4.3 简单的输入输出程序 63
4.3.1 表达规约 63
4.3.2 对规约排序 67
4.3.3 规约生成 69
4.3.4 规约确认 75
4.4 可靠性和安全性 83
4.5 基于状态的系统 86
4.5.1 关系模型 86
4.5.2 公理表达 89
4.5.3 规约确认 98
4.6 本章小结 101
4.7 练习 101
4.8 问题 106
4.9 参考书目注释 109
第5章 程序正确性和验证 111
5.1 正确性的定义 113
5.2 正确性:命题 117
5.2.1 正确性和精化 118
5.2.2 集合论的特征 120
5.2.3 解释 121
5.3 验证 124
5.3.1 公式样例 126
5.3.2 推理系统 128
5.3.3 用于解释的示例 133
5.4 本章小结 138
5.5 练习 139
5.6 问题 141
5.7 参考书目注释 141
第6章 失效、错误和缺陷 143
6.1 失效、错误和缺陷 143
6.2 缺陷和相对正确性 146
6.2.1 缺陷,一个含糊的概念 146
6.2.2 相对正确性 148
6.3 视情况而定的缺陷和确定性缺陷 151
6.3.1 视情况而定的缺陷 151
6.3.2 单调的缺陷去除 155
6.3.3 一个单调缺陷去除的框架 161
6.3.4 确定性缺陷 162
6.4 缺陷管理 164
6.4.1 多道防线 164
6.4.2 混合确认 166
6.5 本章小结 171
6.6 练习 172
6.7 问题 174
6.8 参考书目注释 174
第7章 软件测试分类 175
7.1 联合测试存在的问题 175
7.2 分类方案 176
7.2.1 主要属性 178
7.2.2 次要属性 183
7.3 测试分类 190
7.3.1 单元级测试 190
7.3.2 系统级测试 192
7.4 练习 194
7.5 参考书目注释 195
第Ⅲ部分 测试数据生成
第8章 测试生成概念 199
8.1 测试生成和目标属性 199
8.2 测试输出 203
8.3 测试生成需求 206
8.4 测试生成准则 211
8.5 基于经验的充分性评价 216
8.6 本章小结 222
8.7 练习 223
8.8 参考书目注释 225
8.9 附录:变异程序 226
第9章 功能准则 229
9.1 域划分 229
9.2 使用表格表达式生成测试数据 237
9.3 基于状态的系统的测试生成 244
9.4 随机测试数据生成 255
9.5 将测试数据选择比喻为一次旅行 260
9.6 本章小结 263
9.7 练习 264
9.8 参考书目注释 267
第10章 结构化准则 269
10.1 路径和路径条件 270
10.1.1 执行路径 270
10.1.2 路径函数 273
10.1.3 路径条件 279
10.2 控制流覆盖 281
10.2.1 语句覆盖 281
10.2.2 分支覆盖 284
10.2.3 条件覆盖 286
10.2.4 路径覆盖 289
10.3 数据流覆盖 296
10.3.1 定义和使用 296
10.3.2 测试生成准则 300
10.3.3 测试准则的层次结构 304
10.4 基于缺陷的测试生成 305
10.4.1 感知缺陷 306
10.4.2 为感知缺陷选择输入数据 311
10.4.3 针对错误传播选择输入数据 313
10.5 本章小结 314
10.6 练习 315
10.7 参考书目注释 319
第Ⅳ部分 测试部署与分析
第11章 测试预言设计 323
11.1 测试预言设计的困境 323
11.2 从规约到预言 327
11.3 基于状态的软件产品的测试预言 332
11.3.1 从公理到测试预言 333
11.3.2 从规则到预言 335
11.4 本章小结 342
11.5 练习 343
第12章 测试驱动设计 347
12.1 选择一种规约 347
12.2 选择一种过程 350
12.3 选择一种规约模型 352
12.3.1 随机测试生成 353
12.3.2 预先生成的测试数据 360
12.3.3 缺陷和缺陷检测 365
12.4 使用符号执行进行测试 370
12.5 本章小结 376
12.6 练习 376
12.7 参考书目注释 383
第13章 分析测试输出 385
13.1 逻辑解释 386
13.1.1 具体测试 386
13.1.2 符号测试 388
13.1.3 具体-符号测试 389
13.2 随机解释:缺陷密度 391
13.3 随机解释:失效概率 395
13.3.1 缺陷与缺陷并不相同 395
13.3.2 定义/量化可靠性 398
13.3.3 软件可靠性建模 400
13.3.4 认证测试 405
13.3.5 可靠性估计和可靠性增长 406
13.3.6 可靠性标准 411
13.3.7 作为经济函数的可靠性 412
13.4 本章小结 422
13.5 练习 423
13.6 问题 425
13.7 参考书目注释 426
第Ⅴ部分 软件测试管理
第14章 软件测试的度量 429
14.1 缺陷倾向性 431
14.1.1 圈复杂度 431
14.1.2 规模 433
14.2 缺陷可检测性 434
14.3 错误可检测性 439
14.4 错误可掩盖性 442
14.5 避免失效 445
14.6 容错 447
14.7 解释示例 449
14.7.1 圈复杂度 450
14.7.2 规模 450
14.7.3 状态冗余 450
14.7.4 函数冗余 451
14.7.5 非内射性 452
14.7.6 不确定性 452
14.7.7 小结 453
14.8 本章小结 454
14.9 练习 455
14.10 参考书目注释 456
第15章 软件测试工具 457
15.1 分类方案 457
15.2 脚本工具 459
15.2.1 CppTest 459
15.2.2 SilkTest 460
15.3 录制-回放工具 462
15.3.1 TestComplete 462
15.3.2 Selenium IDE 463
15.4 性能测试工具 465
15.4.1 LoadRunner 465
15.4.2 Grinder 466
15.4.3 QF-Test 467
15.4.4 Appvance PerformanceCloud 468
15.4.5 JMeter 469
15.5 预言设计工具 471
15.5.1 JUnit 471
15.5.2 TestNG 472
15.6 异常检测 473
15.6.1 Rational Purify 473
15.6.2 Astree 474
15.7 协同工具 475
15.8 本章小结 476
第16章 测试产品线 477
16.1 PLE:流水线重用模型 477
16.2 测试问题 482
16.3 测试方法 485
16.4 解释 486
16.4.1 领域分析 486
16.4.2 领域建模 490
16.4.3 参考架构 494
16.4.4 领域实现 496
16.4.5 在领域工程阶段进行测试 503
16.4.6 在应用程序工程阶段进行测试 508
16.5 本章小结 511
16.6 练习 512
16.7 问题 513
16.8 引用的参考书目 513
参考文献 515
前 言
软件工程是唯一一种产品测试成为主要技术,同时产品测试还得到了开发机构关注,并成为一项具有重要成本因素的工程原则。这种现状的产生来源于以下几点原因:
● 软件测试获得了极大关注的首要原因是软件产品的规模和复杂性,其导致软件产品设计成为一种高风险且容易出错的工作。
● 第二个原因是软件产品缺少一种标准开发过程,这就意味着产品质量无法通过过程控制进行保障,因此只能通过产品控制来保证产品质量。
● 第三个原因是缺少能够通过静态产品分析来保证产品质量并能适应产品规模变化的实用方法,因此只能通过动态方法来保证产品质量。
● 其他原因还包括:缺少一种通用的重用规则,缺少适用于不同产品规模且能够保证产品正确性的开发方法,以及在产品开发、维护、演化过程中无处不在的规约变更,等等。
本书的主题是研究软件测试;与当前其他同一主题的众多书籍相比,本书在以下几个方面具有突出的特点:
● 将软件测试视为软件质量保障的有机组成部分。我们将软件测试作为软件质量保障总体策略中的一个组成部分,而软件质量保障总体策略还包含了多项其他技术。边际效用递减规律(The law of diminishing returns)支持使用多种不同的互补性技术,而且需要将不同技术应用于能够得到最大投入回报的场合。这样,软件测试才能在一个包含了其他方法、更为广泛的语境下得到更深入的研究,而不仅仅是作为一个孤立的技术集进行研究。
● 将软件测试视为静态分析的一种补充技术。在软件工程发展早期,针对有效性、可伸缩性、易用性等方面内容,人们对软件测试和静态程序分析的优势进行了丰富多彩的讨论。我们的立场是:某种技术在某些场合下能够发挥最大的效能,而在其他场合下可能就没有那么有效了;另一种常见的情况是,当我们感觉某种技术很难应用的时候,实际上往往不是因为技术本身存在问题,而是因为基于错误的规约类型使用了这项技术。为了保证产品正确性,不应该执着于选择某一种规约。实际上,我们应该将一种复杂的规约分解为不同的组成部分,然后将不同的组成部分映射到最为合适的技术。本书的第6章讨论了这个问题。
● 将软件测试视为一个系统化的逐步完成的过程。早期的软件测试被视为一种证明程序缺陷存在的方法,而不是一种证明程序缺陷不存在的方法。实际上,这种看法是不恰当的,因为测试可以用于多种目的,这一点我们将在第7章讨论。无论这种看法是否合适,它都带来了两种后果:第一,人们认为软件测试的唯一目的是暴露缺陷、诊断程序和去除缺陷;第二,结果是,人们认为测试仅仅是生成测试数据的过程,特别是生成那些能够最大可能地暴露程序缺陷的测试数据。与这些看法不同的是,我们认为测试是一个多步骤的过程,包括识别与分析测试目标、测试数据生成、测试预言设计、测试驱动程序设计、测试部署、测试输出分析。我们将用不同的章节分别讲解这些内容。
● 将软件测试视为一个形式化或可形式化的过程。对被测试的软件产品或软件产品规约而言,测试所需的分析工作量比较小,因此测试往往被视为一项可以随意执行的工作,并且无须考虑形式化问题。但是,我们却认为测试应该与静态程序分析一样严格。为有效地进行测试,测试人员必须具备软件规约、程序正确性、相对正确性(relative correctness)、缺陷的含义、缺陷去除等知识。这些内容将在第6章详细讨论。
● 将软件测试视为一个面向目标的活动。我们认为,软件测试不仅是查找和去除缺陷,还可能具有更广泛的目标,包括诸如估计缺陷密度、估计可靠性、可靠性认证(certification)等。这些内容将在第7章详细讨论。
本书的内容来自软件测试及质量保障课程的讲义,因此主要用于课堂使用。当然,本书也可以满足软件工程师的实际工作需要和软件工程研究人员的研究需求。本书分为五个主要部分,每个部分包括了3~4章内容,全书共计16章。
● 第Ⅰ部分在软件工程的语境下比较宽泛地介绍软件测试,并且将探讨软件测试希望达到或确定的质量目标,还会探讨软件测试的生命周期。
● 第Ⅱ部分介绍软件测试的数学基础,包括软件规约、程序正确性和程序验证、软件可依赖性概念以及软件测试分类学。一般的软件测试书籍很少像本书这样讨论规约、验证、可依赖性等内容。本书这样做是基于以下原因:
首先,我们相信,在没有深入理解软件规约的前提下,是不可能研究软件测试的,因为软件规约规定了被测试程序的功能属性,而这些功能属性也是测试预言设计的基础。
其次,当我们在产品认证(product certification)或者验收测试(acceptance testing)的语境下执行程序测试时,最受关注的是被测试的程序是否正确,而我们必须理解“正确”到底是指什么。
第三,如果打算协同使用动态程序测试和静态程序分析,并且希望获得比单独用一种方法更为全面的结论,那么就必须在同一个数学模型下使用这些方法。
第四,从一个程序中去除缺陷的行为是测试的核心任务,这个行为只能通过定义相对正确性(relative correctness)的属性来建立模型。相对正确性是指当程序中的缺陷被去除后,程序将更正确。因此,相对正确性只能在理解了(绝对)正确性属性的前提下进行定义。
软件测试技术分类学是指将软件测试技术根据一组准则进行分类,特别是软件测试的目的:在指导软件测试的过程中,识别不同的软件测试目的是很重要的,不同的软件测试目的将影响测试生命周期的全部阶段,包括测试数据生成、测试预言设计,乃至测试部署和测试输出分析。
● 第Ⅲ部分研究软件测试过程中最为吸引研究人员和测试人员的步骤,这个步骤常常被视为软件测试过程中唯一有意义的工作:测试数据生成。在这一部分中,我们将简要讨论测试数据生成的一些通用概念,然后研究测试数据生成的两种通用准则,也就是功能准则(第9章)和结构化准则(第10章)。我们在讨论测试数据生成时,不仅要考虑能够直接从初始状态映射到终止状态的简单程序,还要考虑与状态历史相关的程序,也就是输出依赖于输入历史的程序。
● 第Ⅳ部分讨论软件测试生命周期中除了测试数据生成之外的其他阶段,包括测试预言设计、测试驱动程序设计、测试输出分析。测试预言(第11章)是从目标规约导出的,而目标规约是根据正确性的定义来定义的,并且取决于我们研究的是与状态无关的简单程序,还是存在内部状态的程序。测试驱动程序设计(第12章)取决于测试数据是脱机生成的,还是来自一个现有的介质,或者测试数据是根据某些概率法则而随机生成的。测试输出分析(第13章)则依赖于测试目的,分析内容可以是可靠性估计、可靠性验证、缺陷密度估计、以及产品验收等。
● 第Ⅴ部分探讨软件测试管理方面的内容,包括软件度量(第14章)、软件测试工具(第15章),以及软件产品线测试(第16章)。
在编辑本书内容材料的过程中,我们集中关注针对软件测试的重要方面的分析和建模,而不仅是研究和综述最新的软件测试研究内容,主要原因如下:
● 本书主要是面向教学的,而非一部研究专著。
● 在软件测试这一类充满活力的研究领域中,学生最好要掌握那些将在一段很长的时期内都能够发挥作用的基础概念,而不应该过分关注最新的技术。这是因为,从较长的时期看来,最新的技术总会过时。
针对应该为学生在较短时间内提供操作技能还是应该为学生打下坚实的基础,并使他们在未来工作中具备适应能力的问题,在学术上存在着长期的争论。我们决定采取第二种策略。
致谢
我们在此向已经去世的Lawrence Bernstein教授致以特别的谢意,他邀请我们将本书纳入了他编纂的系列丛书,这套系列丛书十分出色。
感谢学生对我们的不断支持,在我们多个学期不断精化和优化讲义内容的过程中,他们对我们给予了极大的包容。我们还要感谢Slim Frikha,这是一位来自法国巴黎理工学院(ParisTech)的实习生,他认真审查和评估了本书第15章实用的软件测试工具。在一定程度上,本书能够出版还需要感谢卡塔尔国家研究基金(Qatar National Research Fund)的资助,资助编号为NPRP 04-1109-1-174。本书作者对本书的内容负完全责任,其中的内容不代表QNRF的官方观点。
Fairouz Tchier
Ali Mili
对于我这样一个在测试行业摸爬滚打多年的老兵来说,《软件测试:概念与实践》这本书提供了一个重新审视和巩固基础知识的绝佳机会。市场上充斥着各种技术栈和工具的培训资料,但真正能触及“概念与实践”核心的书籍却不多。这本书恰恰填补了这一空白。它没有过分强调某个特定工具的使用,而是将重点放在了测试理念的形成和原则的遵循上。书中对测试设计的原则,如“测试应该具有可预测性”、“避免重复测试”等,进行了深入的剖析,让我反思了自己以往的一些测试习惯,并从中找到了可以优化和改进的空间。尤其是在风险分析和测试策略制定方面,作者提出的方法论具有很强的实践指导意义。我从中学习到了如何根据项目的具体情况,合理地分配测试资源,确定优先级,从而最大化测试效果。书中关于不同测试类型(如功能测试、性能测试、安全测试)的区分和应用场景的阐述,也让我对测试的广度和深度有了更清晰的认识。它不仅仅是告诉“怎么做”,更是强调了“为什么这么做”,这种追根溯源的讲解方式,对于提升测试人员的思维深度和解决问题的能力大有裨益。总而言之,这是一本值得反复品读、并在实践中不断对照学习的宝贵书籍。
评分我是一名对软件测试充满好奇心的学生,一直以来都对这个行业抱有浓厚的兴趣。《软件测试:概念与实践》这本书,简直是我求知路上的“及时雨”。它以一种极其友好的方式,将复杂深奥的测试理论变得通俗易懂。书中关于缺陷管理和生命周期的描述,让我第一次真正理解了“bug”是如何产生、如何被发现、如何被跟踪和最终如何被修复的完整过程。作者列举的各种缺陷案例,生动形象,让我能轻易地将理论知识与实际情况联系起来。书中对不同测试工具的介绍,虽然不是重点,但却为我打开了探索新领域的大门,让我知道原来有这么多工具可以辅助我们进行更高效、更全面的测试。让我印象特别深刻的是,书中不仅关注了“发现问题”,还强调了“预防问题”。对测试用例设计的各种技巧,如等价类划分、边界值分析等,都进行了详细的讲解和举例,让我明白了如何编写出更具代表性、更有效的测试用例,从而在早期就尽可能地发现潜在的问题。这本书让我觉得,软件测试不仅仅是“找茬”,而是一门需要严谨逻辑、细致观察和创新思维的艺术。它为我构建了一个坚实的理论基础,也激发了我进一步深入学习的动力。
评分作为一名初涉软件测试领域的新手,我怀揣着满腔的热情和一丝丝的忐忑,翻开了《软件测试:概念与实践》这本书。最初吸引我的是它那直观的书名,似乎预示着它将为我铺就一条清晰的学习路径。翻开第一页,我便被书中严谨而又不失条理的逻辑所折服。作者并没有一开始就抛出枯燥的技术术语,而是从软件开发生命周期的角度切入,让我明白测试并非是开发的“附属品”,而是贯穿始终、不可或缺的一环。书中对不同测试级别的阐述,如单元测试、集成测试、系统测试以及验收测试,都通过生动的案例和图示,让我对它们之间的联系和侧重点有了深刻的理解。尤其是在讲解单元测试时,作者不仅强调了其重要性,还细致地介绍了如何编写有效的单元测试用例,以及在实际开发中,开发者和测试人员如何协同完成这项工作。这种由宏观到微观的讲解方式,极大地降低了我的学习门槛,让我能够循序渐进地掌握核心概念。更令我惊喜的是,书中还探讨了许多“软技能”的重要性,例如沟通能力、团队协作以及对细节的敏锐度,这些看似与技术无关的要素,实则在软件测试工作中扮演着至关重要的角色。这本书就像一位经验丰富的导师,在我迷茫时给予指导,在我困惑时点亮明灯,让我对软件测试这个行业充满了信心和期待。
评分说实话,刚拿到《软件测试:概念与实践》这本书时,我并没有抱太大的期望。市面上关于测试的书籍太多了,很多都流于表面,或者过于侧重技术细节而忽略了根本。但是,这本书带给我的惊喜却远超预期。它并没有用大量的篇幅去堆砌各种技术名词,而是从更宏观的视角,为我们构建了一个关于软件测试的完整知识体系。书中对测试度量和报告的讲解,让我意识到,测试的结果不仅仅是“通过”或“失败”,更需要用数据来量化和呈现,以便管理者能够更清晰地了解项目的健康状况。它教会我如何有效地沟通测试发现,如何用清晰的数据和逻辑来支撑我的观点,这对于我们在团队中争取资源和影响力至关重要。书中对自动化测试的讨论,也让我对未来的测试趋势有了更深的认识,但它并没有将自动化视为万能药,而是强调了自动化测试的适用场景和局限性,以及如何将自动化测试与手动测试有机地结合起来。这种理性而又富有前瞻性的分析,让我在面对快速发展的技术浪潮时,能够保持一份清醒和冷静。这本书对我来说,不仅仅是一本技术手册,更是一本关于“如何思考”的实践指南,它让我从一个单纯的执行者,逐渐成长为一个有策略、有远见的测试专业人士。
评分作为一名在产品研发一线工作多年的资深工程师,我深知软件质量对于产品成功的重要性。在接触《软件测试:概念与实践》这本书之前,我对测试的理解更多停留在“发现bug”的层面。然而,这本书却将我的认知提升到了一个新的高度。作者以其深厚的行业经验,阐述了测试在整个软件生命周期中的战略意义,以及如何通过前期的规划和设计,最大限度地减少后期出现的缺陷。书中对测试过程的标准化和优化,提供了一套系统性的解决方案。我特别欣赏书中对“可维护性”和“可扩展性”等非功能性需求的关注,这在很多技术书籍中往往会被忽略。它让我明白,好的测试不仅仅是验证功能是否正常,更要确保软件在未来的迭代中,能够易于维护和扩展,从而降低长期成本。书中关于度量和改进的章节,更是为我提供了一个持续优化的框架,让我能够定期评估测试过程的有效性,并根据反馈进行调整。这种“持续改进”的理念,贯穿了整本书,让我深受启发。它不仅仅是一本关于“测试”的书,更是一本关于“如何构建高质量软件”的书,为我提供了一个更为广阔的视野和更深入的思考维度。
评分还没看
评分质量好
评分good good very very good
评分书比较小,厚,内容还没细看
评分质量好
评分质量好
评分good good very very good
评分还没看
评分还没看
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.tinynews.org All Rights Reserved. 静思书屋 版权所有