登入帳戶  | 訂單查詢  | 購物車/收銀台( 0 ) | 在線留言板  | 付款方式  | 運費計算  | 聯絡我們  | 幫助中心 |  加入書簽
會員登入 新用戶登記
HOME新書上架暢銷書架好書推介特價區會員書架精選月讀2023年度TOP分類瀏覽雜誌 臺灣用戶
品種:超過100萬種各類書籍/音像和精品,正品正價,放心網購,悭钱省心 服務:香港台灣澳門海外 送貨:速遞郵局服務站

新書上架簡體書 繁體書
暢銷書架簡體書 繁體書
好書推介簡體書 繁體書

八月出版:大陸書 台灣書
七月出版:大陸書 台灣書
六月出版:大陸書 台灣書
五月出版:大陸書 台灣書
四月出版:大陸書 台灣書
三月出版:大陸書 台灣書
二月出版:大陸書 台灣書
一月出版:大陸書 台灣書
12月出版:大陸書 台灣書
11月出版:大陸書 台灣書
十月出版:大陸書 台灣書
九月出版:大陸書 台灣書
八月出版:大陸書 台灣書
七月出版:大陸書 台灣書
六月出版:大陸書 台灣書

『簡體書』Effective软件测试

書城自編碼: 3881545
分類:簡體書→大陸圖書→計算機/網絡程序設計
作者: [荷]毛里西奥·阿尼什[Maurício Aniche]著
國際書號(ISBN): 9787302629375
出版社: 清华大学出版社
出版日期: 2023-06-01

頁數/字數: /
書度/開本: 16开 釘裝: 平装

售價:HK$ 117.6

我要買

 

** 我創建的書架 **
未登入.


新書推薦:
接纳真实的自我(日本超人气禅师小池龙之介力作!"与自己和解"指南!)
《 接纳真实的自我(日本超人气禅师小池龙之介力作!"与自己和解"指南!) 》

售價:HK$ 67.9
敦煌及周边区域荒漠植物图鉴
《 敦煌及周边区域荒漠植物图鉴 》

售價:HK$ 78.2
吴哥王朝兴亡史(方尖碑)
《 吴哥王朝兴亡史(方尖碑) 》

售價:HK$ 79.4
夜幕之下.6:神祸降临
《 夜幕之下.6:神祸降临 》

售價:HK$ 63.3
叶锦添自传:向前迈进的日子(奥斯卡艺术指导获得者 叶锦添 50多年的人生经历,近40年的从业经历,向前迈进,步履不停)
《 叶锦添自传:向前迈进的日子(奥斯卡艺术指导获得者 叶锦添 50多年的人生经历,近40年的从业经历,向前迈进,步履不停) 》

售價:HK$ 148.4
四十自述:中国现代传记文学的名篇代表之作(胡适回顾自己前四十年的成长轨迹与心路历程)
《 四十自述:中国现代传记文学的名篇代表之作(胡适回顾自己前四十年的成长轨迹与心路历程) 》

售價:HK$ 78.2
特权与焦虑:全球化时代的韩国中产阶级
《 特权与焦虑:全球化时代的韩国中产阶级 》

售價:HK$ 90.9
供应链金融(第4版)
《 供应链金融(第4版) 》

售價:HK$ 113.9

 

建議一齊購買:

+

HK$ 74.7
《敏捷软件开发实践 估算与计划》
+

HK$ 113.3
《DevOps实施手册 在多级IT企业中使用DevOps》
+

HK$ 200.6
《敏捷软件测试:测试人员与敏捷团队的实践指南》
+

HK$ 80.7
《改善敏捷回顾 提升团队效率》
+

HK$ 99.8
《ALM+UFT+LoadRunner自动化测试实战》
編輯推薦:
近年来出现了一 些新的出版方式,MEAP(Manning Early Access Program)就是其中的一种,把开源运动扩展到出版行业。在MEAP中,读者可在图书出版前逐章阅读早期版本。在作者写作过程中,读者可以及时提供反馈,帮助作者写出更好的作品。
本书正是基于MEAP诞生的一本软件测试图书,其质量已得到多位读者的检验。本书作者Mauricio Aniche试图帮助开发人员避免常犯的错误。Mauricio博士是开发人员出身,曾亲赴现场交付和部署软件;在客户提出问题后,及时对软件进行了调试、分析和修正。教训是深刻的,他对测试非常重视,亲力亲为,深信“要成为一名高效的开发者,必先成为一名高效的软件测试者”,并强烈推荐在开发系统时构建一个 自动化测试集,随时反馈测试结果,从而显著提高软件工程师的工作效率。
內容簡介:
《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
內容試閱
像大多数软件工程一样,软件测试是一门艺术。在过去十年中,我们的社区了解到自动化测试是测试软件的最佳方式。计算机可在瞬间运行数百个测试,而这样的测试集使公司能自信地每天发布数十个版本的软件。
有大量资源(书籍、教程和在线课程)可用于解释如何进行自动化测试。无论使用哪种语言或正在开发哪种类型的软件,我们都可以找到要使用的工具的有关信息,但我们缺少与设计有效测试用例相关的资源。计算机自动执行开发者设计的测试,如果测试不是很好,或没有执行包含错误的代码部分,则测试集的用处不大。
开发社区将软件测试视为一种艺术形式,认为与缺乏创造力或经验的开发者相比,富有激情和创造力的开发者可以创建更有效的测试集。但我在本书中对这个观点提出了疑问,并表明软件测试不需要依赖专业知识、经验或创造力,它在很大程度上可以被系统化。
遵循有效、系统的软件测试方法,则不需要依赖非常有经验的软件开发者来编写好的测试。如果可以找到将大部分流程自动化的方法,将能专注于需要创造力的测试。
本书读者对象
本书是为那些想学习更多有关测试知识或提高测试技能的开发者编写的。如果你有多年的软件工程经验并且写过很多自动化测试,但总是按照自己的直觉来判断下一个测试用例应该是什么,那么本书将为你呈现系统性的思维过程。
具有不同专业水平的开发者将从本书中受益。新手开发者可以跟随笔者介绍的所有代码示例和技术来学习。高级开发者可以了解他们可能不熟悉的技术,并从每一章的务实讨论中学到知识。
笔者所描述的测试技术旨在供编写代码的开发者采用。虽然将程序视为黑匣子的专业软件测试人员可以阅读本书,但本书是站在被测代码的开发者的角度来编写的。
本书中的代码示例是用 Java 编写的,但我们尽量避免使用其他编程语言的开发者不熟悉的花哨结构。我们还概括了同类技术,即便这些代码不能直接转换到不同的环境,思路也是可供借鉴的。
在第 7 章中,我们讨论了如何设计可测试系统。相比于函数式编程人员,这些想法对面向对象的软件系统的开发者更有意义。
本书的组织结构——路线图
本书分为11章。在第 1 章中,我构建了系统且有效的软件测试的案例。我们举了一个涉及两名开发者的例子——两者都实现了相同的功能,一个是随意的,另一个是系统性的——并指出了两种方法之间的差异。然后讨论了单元测试、集成测试和系统测试之间的区别,并认为开发者首先应该关注快速的单元测试和集成测试(众所周知的测试金字塔)。
第2章介绍领域测试。这种测试实践侧重于基于需求的工程测试用例。软件开发团队在需求方面使用不同的实践(用户故事、UML或内部格式),并且领域测试会使用这些信息。每个测试会话都应该从正在开发的功能需求开始。
第3章展示了如何在领域测试之后,使用程序的源代码和结构来增强测试。可运行代码覆盖率工具,并使用其结果来反映最初的测试集没有覆盖的代码部分。一些开发者不认为代码覆盖率是一个有用的指标,但在该章中,我们希望让大家相信,如果应用得当,代码覆盖率测试应该是测试过程的一部分。
在第 4 章中,我们讨论质量超越测试的想法:效果取决于如何为代码建模,以及我们的方法和类赋予系统其他类和方法的确定性。契约式设计使代码的前置条件和后置条件明确。这样一来,如果出现问题,程序将停止而不会引起其他问题。
第5章介绍基于属性的测试。我们不是基于单个具体例子编写测试,而是测试程序的所有属性。测试框架负责生成与属性匹配的输入数据。掌握这项技术可能很棘手:表达属性并不容易,而且需要很多练习。基于属性的测试也更适合某些代码片段。该章有很多证明这个概念的示例。
第 6 章讨论了超越设计良好的测试用例的实用性。在更复杂的系统中,类依赖于其他类,编写测试可能成为一种负担。我们介绍了模拟对象(Mock)和桩对象(Stub),它们让我们在测试期间可以忽略一些依赖关系。还讨论了一个重要的权衡:尽管模拟对象简化了测试,但也使测试与生产代码更加耦合,这可能导致测试代码不能优雅地演化。该章讨论了模拟对象的利弊,以及何时使用(或不使用)它们。
第7章解释了在设计时考虑了可测试性的系统与不考虑可测试性的系统之间的区别。我们讨论了几种简单的模式,它们将帮助我们编写易于控制和易于观察的代码(任何进入测试世界的开发者的梦想)。该章讨论了软件设计和测试的关系——正如我们将看到的,它们之间有着密切的关系。
第8章讨论测试驱动开发(TDD):在开发产品代码之前编写测试。 TDD是一种非常流行的技术,尤其是在敏捷实践者中。即使你已经熟悉了 TDD,也建议你阅读这一章——笔者对如何应用TDD有一些不同寻常的看法,尤其是在你认为TDD没有太大作用的情况下。
在第9章中,我们超越了单元测试,讨论了集成和系统测试。将之前章节中所讨论的测试技术(例如领域测试和结构化测试)直接应用到这里。编写集成测试和系统测试需要更多的代码,所以如果我们不能很好地组织代码,最终可能得到一个复杂的测试集。该章介绍了编写可靠且易于维护的测试集的几个最佳实践。
在第10章中,我们讨论了测试代码的最佳实践。以自动化方式编写测试是测试流程的基本内容。我们还希望编写易于理解和维护的测试代码。该章介绍了最佳实践(我们希望从测试中得到的)和不良实践(我们不希望在测试中出现的)。
在第11章中,我们重新审视了本书涵盖的一些概念,强化了重要的主题,并就下一步的发展方向提供了一些建议。
本书未涵盖的内容
本书不涉及针对特定技术和环境的软件测试,例如如何选择测试框架,或者如何测试移动应用程序、React 应用程序或分布式系统等。
讨论的所有实践和技术都将适用于大家正在开发的任何软件系统。本书可以作为任何测试的基础,但是每个领域都有自己的测试实践和工具,因此阅读本书后,你应该寻找正在构建的应用程序类型的更多资源。
本书侧重于功能测试而不是非功能测试(性能、可扩展性和安全性)。如果你的应用程序需要这种类型的测试,建议你寻找有关该主题的特定资源。
关于代码、参考资料和彩图
本书使用 Java 来说明所有的想法和概念,但其他语言的开发者也可以直接借鉴并理解这些技术。
受篇幅限制,代码示例中不包括所有必需的引用(imports)和包。但是,你可扫描封底二维码下载完整的源代码、参考资料和彩图。代码使用 Java 11 进行了测试,我估计新版本不会有任何问题。

 

 

書城介紹  | 合作申請 | 索要書目  | 新手入門 | 聯絡方式  | 幫助中心 | 找書說明  | 送貨方式 | 付款方式 香港用户  | 台灣用户 | 大陸用户 | 海外用户
megBook.com.hk
Copyright © 2013 - 2024 (香港)大書城有限公司  All Rights Reserved.