书籍详情

Effective软件测试

Effective软件测试

作者:[荷]毛里西奥·阿尼什(Maurício Aniche)著,朱少民 李洁 张元 译

出版社:清华大学出版社

出版时间:2023-06-01

ISBN:9787302629375

定价:¥98.00

购买这本书可以去
内容简介
  《Effective软件测试》将帮助你交付优质软件。在软件开发过程中,测试是最关键的部分。为编写良好测试以及防止bug进入生产环节,你必须精通掌握基于需求规格的测试、边界测试、结构化测试以及其他核心策略。 这本实用指南将引导开发者了解不同类型的单元测试和集成测试。开发者将学会如何使代码便于测试,以及如何编写易于维护的测试代码,从而创建无缺陷的软件。本书的讲解全面、系统且透彻,富有清晰注释的示例代码,呈现紧贴现实的场景,并对此做了深刻的阐述。 主要内容 ?设计严格的测试套件来查找bug。 ?适时地使用单元测试、集成测试和系统测试 ?前置条件、后置条件、不变式、契约测试和基于属性的测试 ?设计测试友好的系统 ?测试**实践和测试坏味道 ?利用基于Java的示例来阐释概念,这些概念也适用于其他面向对象的语言
作者简介
  Maurício Aniche博士是荷兰代尔夫特理工大学软件工程系的助教,并兼任Adyen公司技术部总监。
目录
第1章 有效和系统的软件测试 1
1.1  测试的开发者与不测试的开发者的对比 2
1.2  开发者的有效软件测试 14
1.2.1  开发过程中有效的测试 14
1.2.2  有效测试是一个迭代过程 16
1.2.3  专注于开发,然后专注于测试 16
1.2.4  “设计正确性”的神话 17
1.2.5  测试的成本 17
1.2.6  有效和系统的含义 17
1.2.7  测试自动化的作用 18
1.3  软件测试的原则(或者,为什么测试如此困难) 19
1.3.1  详尽的测试是不可能的 19
1.3.2  知道何时停止测试 19
1.3.3  可变性很重要(杀虫剂悖论) 20
1.3.4  缺陷在某些地方更容易发生 20
1.3.5  测试永远不可能完美或充分 20
1.3.6  上下文信息特别重要 21
1.3.7  验证不同于确认 21
1.4  测试金字塔,以及我们应该关注的地方 22
1.4.1  单元测试 22
1.4.2  集成测试 24
1.4.3  系统测试 25
1.4.4  何时使用每个测试层次 27
1.4.5  偏爱单元测试的原因 28
1.4.6  在不同层次上测试什么 28
1.4.7  如果你不同意测试金字塔,该怎么办 29
1.4.8  本书能帮助大家找到所有bug吗 31
1.5  练习题 32
1.6  本章小结 34
第2章 基于需求规格的测试 35
2.1  需求告诉我们一切 36
2.1.1  步骤1:理解需求、输入和输出 39
2.1.2  步骤2:探索程序在各种输入情况下的行为 39
2.1.3  步骤3:探索可能的输入和输出,并确定分区 41
2.1.4  步骤4:分析边界 43
2.1.5  步骤5:设计测试用例 46
2.1.6  步骤6:测试用例的自动化 48
2.1.7  步骤7:用创造力和经验增补测试集 51
2.2  基于需求规格的测试简述 52
2.3  通过SBT发现缺陷 54
2.4  实际工作中的SBT 64
2.4.1  测试过程是迭代的,而不是顺序的 64
2.4.2  SBT的测试深度 64
2.4.3  分区还是边界?这并不重要 65
2.4.4  上点和离点就足够了,但可以加入一些内点和外点 65
2.4.5  通过相同输入的变化来促进理解 65
2.4.6  当组合数量激增时,务实一点 66
2.4.7  有疑问时,选择最简单的输入值 66
2.4.8  为无关紧要的输入选取合理的值 66
2.4.9  测试null值和异常情况,但只在有意义的时候 67
2.4.10  当测试用例的骨架相同时,采用参数化测试方法 67
2.4.11  适用于任何层次的需求或单元测试以外的测试 67
2.4.12  如何测试有状态的类 68
2.4.13  经验和创造力的影响 70
2.5  练习题 70
2.6  本章小结 73
第3章 结构化测试与代码覆盖 75
3.1  代码覆盖的正确使用方式 76
3.2  结构化测试概述 79
3.3  代码覆盖标准 81
3.3.1  行覆盖 81
3.3.2  分支覆盖 82
3.3.3  条件 分支覆盖 82
3.3.4  路径覆盖 84
3.4  复杂条件语句和MC/DC覆盖标准 84
3.4.1  一个抽象的例子 84
3.4.2  创建一个实现MC/DC的测试集 85
3.5  处理循环语句及类似结构 88
3.6  标准之间的包含关系及标准的选择 89
3.7  基于需求规格的测试结合结构化测试:一个实例 90
3.8  边界测试和结构化测试 96
3.9  单靠结构化测试往往不够 97
3.10  实际工作中的结构化测试 99
3.10.1  为什么有些人痛恨代码覆盖率 99
3.10.2  100%的覆盖率意味着什么 101
3.10.3  应该选择哪种覆盖率标准 103
3.10.4  MD/DC:非常复杂且不能简化的表达式 103
3.10.5  其他覆盖标准 105
3.10.6  哪些代码不应被覆盖 105
3.11  变异测试 106
3.12 练习题 109
3.13 本章小结 113
第4章 契约式设计 115
4.1  前置条件和后置条件 116
4.1.1  断言关键字 118
4.1.2  前置条件和后置条件的强弱 119
4.2  不变式 121
4.3  契约变更与里氏替换原则 125
4.4 契约式设计和测试的关系 130
4.5 实际工作中的契约式设计 131
4.5.1 弱契约还是强契约 131
4.5.2  输入确认与契约必须2选1吗 131
4.5.3  断言语句还是异常处理 134
4.5.4  抛出异常还是软返回值 135
4.5.5  契约式设计有不适用的情况吗 136
4.5.6  前置条件、后置条件和不变式的代码需要测试吗 136
4.5.7  工具支持 137
4.6  练习题 137
4.7  本章小结 139
第5章 基于属性的测试 141
5.1  示例1:PassingGrade程序 141
5.2  示例2:测试unique方法 146
5.3  示例3:测试indexOf方法 148
5.4  示例4:测试Basket类 155
5.5  示例5:创建复杂的领域对象 163
5.6  实际工作中的基于属性的测试 165
5.6.1  基于实例的测试与基于属性的测试 165
5.6.2  基于属性测试中的常见问题 165
5.6.3  创造性是关键 167
5.7  练习题 167
5.8  本章小结 168
第6章 测试替身和模拟对象 169
6.1  哑对象、伪对象、桩对象和模拟对象 172
6.1.1  哑对象 172
6.1.2  伪对象 172
6.1.3  桩对象 172
6.1.4  模拟对象 173
6.1.5  间谍对象 173
6.2  模拟框架的介绍 174
6.2.1  依赖项插桩 174
6.2.2  模拟对象及预期 180
6.2.3  捕获参数 184
6.2.4  模拟异常 188
6.3  实际工作中的模拟 190
6.3.1  模拟的局限性 191
6.3.2  适合使用模拟的场景 193
6.3.3  日期和时间包装器 197
6.3.4  模拟第三方类库 200
6.3.5  其他人对模拟的看法 202
6.4  练习题 204
6.5 本章小结 205
第7章 可测试性设计 207
7.1  基础设施代码和领域代码分离 208
7.2  依赖注入和可控制性 217
7.3  让类和方法具有可观察性 221
7.3.1  示例1:引入有助于断言的方法 221
7.3.2  示例2:观察void方法的行为 223
7.4  构造函数的依赖项,还是使用方法的参数 227
7.5  实际工作中的可测试性设计 230
7.5.1  被测试类的内聚性 231
7.5.2  被测试类的耦合 232
7.5.3  复杂条件与可测试性 233
7.5.4  私有方法的可测试性 233
7.5.5  静态方法、单例模式与可测试性 233
7.5.6  六边形架构与设计技术中的模拟 234
7.5.7  延伸阅读 234
7.6  练习题 235
7.7 本章小结 237
第8章 测试驱动的开发 239
8.1  第一个TDD练习 239
8.2  针对TDD练习的思考 249
8.3  实际工作中的TDD 251
8.3.1  采用TDD还是不采用TDD 251
8.3.2  需要100%的TDD吗 252
8.3.3  TDD适用于所有应用程序和领域吗 252
8.3.4  学术研究对TDD的观点 253
8.3.5  TDD的其他学派 254
8.3.6  TDD和彻底的测试 256
8.4  练习题 256
8.5  本章小结 258
第9章 编写大型测试 259
9.1  什么时候使用大型测试 259
9.1.1  测试大型组件 260
9.1.2  测试超出代码库的大型组件 269
9.2  数据库与SQL测试 275
9.2.1  SQL查询中测试的内容 275
9.2.2  为SQL查询写自动化测试 277
9.2.3  为SQL测试设置基础设施 284
9.2.4  最佳实践 286
9.3  系统测试 287
9.3.1  Selenium简介 288
9.3.2  设计页面对象 291
9.3.3  模式与最佳实践 301
9.4  关于大型测试的最后说明 305
9.4.1  如何让所有的测试技术匹配 305
9.4.2  执行成本效益分析 306
9.4.3  当心那些已覆盖但未测试的方法 306
9.4.4  适当的编码基础设施是关键 307
9.4.5  干系人编写测试的DSL和工具 307
9.4.6  测试其他类型的Web系统 307
9.5  练习题 308
9.6  本章小结 309
第10章  测试代码的质量 311
10.1  可维护的测试代码的原则 312
10.1.1  测试要快 312
10.1.2  测试应该是内聚的、独立的和隔离的 312
10.1.3  测试要有存在的理由 313
10.1.4  测试应该是可复用且稳定的 313
10.1.5  测试应该有强断言 314
10.1.6  行为改变时测试要中断 315
10.1.7  测试失败应该有单一且明确的原因 315
10.1.8  测试应该易于编写 316
10.1.9  测试应该易于阅读 316
10.1.10  测试应该易于修改和演化 321
10.2  测试坏味道 321
10.2.1  过度重复 322
10.2.2  不明确的断言 322
10.2.3  对复杂或外部资源的处理不当 323
10.2.4  过于通用的测试夹具 324
10.2.5  敏感断言 325
10.3 练习题 327
10.4  本章小结 330
第11章  全书总结 333
11.1  尽管模型看起来是线性的,但迭代是基础 333
11.2  没有缺陷的软件开发:现实还是神话 334
11.3  让最终用户参与进来 335
11.4  尽量多使用单元测试 335
11.5  在监控上投入精力 336
11.6  未来的方向 337
附录  习题答案 339
 
猜您喜欢

读书导航