发表于2024-11-22
软件测试概念与实践
软件测试入门指南
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章)。我们在讨论测试数据生成时,不仅要考虑能够直接从初始状态 软件测试概念与实践 [Software Testing: Concepts and Operations] 下载 mobi epub pdf txt 电子书 格式
软件测试概念与实践 [Software Testing: Concepts and Operations] 下载 mobi pdf epub txt 电子书 格式 2024
软件测试概念与实践 [Software Testing: Concepts and Operations] 下载 mobi epub pdf 电子书质量好
评分质量好
评分good good very very good
评分书比较小,厚,内容还没细看
评分书比较小,厚,内容还没细看
评分还没看
评分good good very very good
评分还没看
评分质量好
软件测试概念与实践 [Software Testing: Concepts and Operations] mobi epub pdf txt 电子书 格式下载 2024