当前位置:首页 > 工业技术
Unit测试模式:测试码重构
Unit测试模式:测试码重构

Unit测试模式:测试码重构PDF电子书下载

工业技术

  • 电子书积分:18 积分如何计算积分?
  • 作 者:(美)梅扎罗斯著
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2009
  • ISBN:9787302191384
  • 页数:631 页
图书介绍:本书详细地描述了测试自动化,从测试策略一直介绍到深层测试编码。介绍了18种常见的“测试味道”,并提出了确定问题的根本原因以及最适用模式的检修指导原则。
《Unit测试模式:测试码重构》目录

第Ⅰ部分 总述 3

第1章 概览 3

1.1关于本章 3

1.2可能有效的最简单的测试自动化策略 3

开发过程 3

客户测试 4

单元测试 5

易测性设计 5

测试组织 6

1.3接下来要讨论的问题 6

第2章 测试味道 7

2.1关于本章 7

2.2测试味道简介 7

什么是测试味道 7

测试味道的种类 8

如何处理味道 8

2.3味道的种类 9

项目味道 9

行为味道 10

代码味道 11

2.4接下来要讨论的问题 12

第3章 测试自动化的目标 13

3.1关于本章 13

3.2为什么要测试 13

3.3测试自动化的目标 14

测试应该有助于提高质量 15

测试应该有助于理解SUT 16

测试应该降低(而不是引入)风险 16

测试应该易于运行 17

测试应该易于写和维护 19

随着系统的发展,测试应该只需要最低限度的维护 20

3.4接下来要讨论的问题 20

第4章 测试自动化的基本观点 21

4.1关于本章 21

4.2这些基本观点的重要性 21

4.3一些不同的基本观点 22

首先测试还是最后测试 22

测试还是示例 22

逐个测试还是全部一起测试 22

从外到内还是从内到外 23

状态验证还是行为验证 24

事先进行夹具设计还是逐个测试 25

4.4理解不同观点的存在 25

4.5我的基本观点 25

4.6接下来要讨论的问题 26

第5章 测试自动化的原则 27

5.1关于本章 27

5.2原则 27

原则:首先写测试(也称为测试驱动开发、测试优先开发) 27

原则:易测性设计 28

原则:使用前门优先(也称为前门优先) 28

原则:交流意图(也称为高级语言,简单易读) 28

原则:不要修改SUT 28

原则:保持测试独立(也称为独立测试) 29

原则:隔离SUT 29

原则:最小化测试重叠 30

原则:最小化不可测试的代码 30

原则:保持测试逻辑与产品代码分离(也称为产品代码中无测试逻辑) 31

原则:每个测试验证一种条件(也称为单一条件测试) 31

原则:单独测试关注点 32

原则:确保相同标准的努力和责任 32

5.3接下来要讨论的问题 32

第6章 测试自动化策略 33

6.1关于本章 33

6.2什么是策略 33

6.3应该自动化哪些类型的测试 34

总功能性测试 34

交叉功能测试 35

6.4使用哪些工具来自动化各种测试 36

测试自动化的方法 37

xUnit简介 38

使用xUnit的最佳时机 39

6.5使用哪种测试夹具策略 39

什么是夹具 40

主要的夹具策略 40

暂时新鲜夹具 42

永久新鲜夹具 42

共享的夹具策略 43

6.6如何确保易测性 44

最后测试——非常危险 44

易测性设计——在最前面 44

测试驱动易测性 45

控制点和观察点 45

交互风格与易测性模式 46

划分与测试 49

6.7接下来要讨论的问题 50

第7章 xUnit基础 51

7.1关于本章 51

7.2 xUnit简介 51

7.3共同特征 51

7.4最低要求 52

定义测试 53

什么是夹具 53

定义测试套件 53

运行测试 54

测试结果 54

7.5 xUnit的本质 55

测试命令 56

测试套件对象 56

7.6过程化世界里的xUnit 57

7.7接下来要讨论的问题 57

第8章 暂时夹具管理 59

8.1关于本章 59

8.2测试夹具术语 59

什么是夹具 60

什么是新鲜夹具 60

什么是暂时新鲜夹具 61

8.3建立新鲜夹具 61

内联夹具建立 61

委托夹具建立 62

隐式夹具建立 63

SetUp方法的滥用 64

混合夹具建立 65

8.4拆卸暂时新鲜夹具 65

8.5接下来要讨论的问题 65

第9章 永久夹具管理 67

9.1关于本章 67

9.2管理永久新鲜夹具 67

什么让夹具变得永久 67

永久新鲜夹具产生的问题 68

拆卸永久新鲜夹具 68

避免拆卸的需要 71

处理缓慢测试 72

9.3管理共享的夹具 72

访问共享夹具 73

引发共享夹具结构 73

9.4接下来要讨论的问题 75

第10章 结果验证 77

10.1关于本章 77

10.2让测试自检 77

10.3状态验证 78

使用内置断言 79

Delta断言 80

外部结果验证 80

10.4验证行为 80

过程行为验证 81

预期行为规范 82

10.5减少测试码复制 82

预期对象 83

自定义断言 84

结果描述验证方法 84

参数化测试和数据驱动测试 85

10.6避免条件测试逻辑 86

排除if语句 87

排除循环 87

10.7其他方法 88

逆向操作,由外到内 88

使用测试驱动开发来写测试实用程序方法 88

10.8将可重复使用的验证逻辑放在哪里 89

10.9接下来要讨论的问题 89

第11章 使用测试替身 91

11.1关于本章 91

11.2什么是间接输入和间接输出 91

为什么要关注间接输入 91

为什么要关注间接输出 92

如何控制间接输入 93

如何验证间接输出 94

11.3使用替身测试 96

测试替身的类型 97

提供测试替身 102

配置测试替身 103

安装测试替身 104

11.4测试替身的其他用法 108

内窥镜测试 108

需求驱动开发 108

加速夹具建立 108

加速测试执行 109

11.5其他需要考虑的问题 109

11.6接下来要讨论的问题 109

第12章 组织测试 111

12.1关于本章 111

12.2基本的xUnit机制 111

12.3合理精简测试方法 111

12.4测试方法和测试用例类 113

每个类一个测试用例类 113

每种特征一个测试用例类 113

每个夹具一个测试用例类 114

选择测试方法组织策略 115

12.5测试命名约定 115

12.6组织测试套件 116

运行测试组 117

运行单个测试 117

12.7测试码重用 118

测试实用程序方法位置 118

测试用例继承与重用 119

12.8测试文件组织 119

内置自测 119

测试程序包 120

测试依赖 120

12.9接下来要讨论的问题 120

第13章 使用数据库的测试 121

13.1关于本章 121

13.2使用数据库的测试 121

数据库测试的原因 121

数据库带来的问题 122

13.3不使用数据库的测试 123

13.4测试数据库 124

测试存储过程 124

测试数据访问层 125

确保开发人员独立 125

13.5使用数据库测试(再次!) 126

13.6接下来要讨论的问题 126

第14章 有效测试自动化的路线图 127

14.1关于本章 127

14.2测试自动化的困难 127

14.3高度可维护的自动化测试的路线图 128

执行快乐路径代码 129

验证快乐路径的直接输出 129

验证备选路径 129

验证间接输出行为 130

最优化测试执行和维护 130

14.4接下来要讨论的问题 131

第Ⅱ部分 测试味道 135

第15章 代码味道 135

15.1模糊测试(也称为长测试、复杂测试、冗长测试) 135

症状 135

影响 135

原因 135

解决方案模式 145

15.2条件测试逻辑(也称为缩排的测试码) 146

症状 146

影响 147

原因 147

15.3难以测试的代码 152

症状 153

影响 153

解决方案模式 153

原因 153

15.4测试码复制 155

症状 155

影响 156

原因 156

高级阅读 157

15.5产品中的测试逻辑 158

症状 158

影响 158

原因 158

高级阅读 161

第16章 行为味道 163

16.1断言滚轮 163

症状 163

影响 163

原因 163

高级阅读 165

16.2不稳定测试 165

症状 165

影响 166

检修建议 166

原因 166

16.3脆弱测试 173

症状 174

影响 174

检修建议 174

原因 175

高级阅读 179

16.4频繁调试(也称为手动调试) 179

症状 179

原因 179

影响 180

解决方案模式 180

16.5手动干预 180

症状 180

影响 180

原因 181

高级阅读 182

16.6缓慢测试 182

症状 182

影响 182

检修建议 183

原因 183

第17章 项目味道 187

17.1缺陷测试 187

症状 187

影响 187

原因 187

检修建议 188

解决方案模式 188

17.2开发人员没有写测试 189

症状 189

影响 189

原因 189

检修建议 190

17.3高测试维护成本 190

症状 190

影响 191

原因 191

检修建议 192

17.4产品缺陷 192

症状 192

影响 192

原因 192

第Ⅲ部分 模式 201

第18章 测试策略模式 201

18.1记录测试(也称为记录与回放测试、机器人用户测试、捕获/回放测试) 201

运行原理 202

使用时机 202

实现方式说明 203

示例:内置测试记录 203

示例:商业记录与回放测试工具 204

重构说明 206

示例:重构的商业记录测试 206

高级阅读 207

18.2脚本测试(也称为手写测试、手动编码测试、程序测试、自动化单元测试) 207

运行原理 208

使用时机 208

实现方式说明 208

示例:脚本测试 208

关于名称 209

高级阅读 209

18.3数据驱动测试 209

运行原理 210

使用时机 210

实现方式说明 211

启发示例 213

重构说明 214

示例:使用XML数据文件的xUnit数据驱动测试 214

示例:使用CSV输入文件的xUnit数据驱动测试 215

示例:使用Fit架构的数据驱动测试 216

18.4测试自动化架构 217

运行原理 218

这样做的原因 218

实现方式说明 218

示例:测试自动化架构 219

高级阅读 219

18.5最小夹具(也称为最小上下文) 220

这样做的原因 220

实现方式说明 220

18.6标准夹具(也称为标准上下文) 221

运行原理 222

使用它的时机 222

实现方式说明 223

启发示例 224

重构说明 224

示例:标准夹具 225

18.7新鲜夹具(也称为新鲜上下文、私有夹具) 226

运行原理 226

使用时机 226

实现方式说明 227

保留夹具的原因 227

新鲜夹具建立 228

启发示例 229

重构说明 229

示例:新鲜夹具 229

18.8共享夹具(也称为共享上下文、遗留夹具、重用的夹具、陈旧夹具) 230

运行原理 231

使用时机 231

实现方式说明 234

重构说明 235

示例:共享夹具 235

示例:不可变的共享夹具 237

18.9后门操作(也称为层交叉测试) 238

运行原理 238

使用时机 238

实现方式说明 240

启发示例 241

重构说明 242

示例:使用测试间谍的后门结果验证 242

示例:后门夹具建立 242

高级阅读 244

18.10层测试(也称为单层测试、逐层测试或分层测试) 245

运行原理 246

使用时机 246

实现方式说明 247

启发示例 248

重构说明 249

示例:表示层测试 249

示例:皮下测试 250

示例:业务层测试 251

第19章 xUnit基本模式 253

19.1测试方法 253

运行原理 253

这样做的原因 254

实现方式说明 254

示例:简单成功测试 256

示例:使用try/catch的预期异常测试 257

示例:使用方法属性的预期异常测试 258

示例:使用代码块/闭包的预期异常测试 258

示例:构造函数测试 259

19.2四阶段测试 260

运行原理 261

这样做的原因 261

实现方式说明 262

示例:四阶段测试(内联) 262

示例:四阶段测试(隐式建立/拆卸) 262

19.3断言方法 263

运行原理 264

这样做的原因 264

实现方式说明 264

启发示例 266

重构说明 267

示例:相等性断言 268

示例:模糊相等性断言 268

示例:确定结果断言 268

示例:预期异常断言 268

示例:单一结果断言 269

19.4断言消息 269

运行原理 269

使用时机 269

实现方式说明 270

启发示例 270

重构说明 271

示例:异常描述消息 271

19.5测试用例类 271

运行原理 272

这样做的原因 272

实现方式说明 273

示例:测试用例类 273

高级阅读 274

19.6测试运行器 274

运行原理 275

这样做的原因 275

实现方式说明 275

19.7测试用例对象 278

运行原理 278

这样做的原因 278

实现方式说明 279

示例:测试用例对象 280

19.8测试套件对象 281

运行原理 281

这样做的原因 281

实现方式说明 282

示例:测试套件对象 282

示例:使用测试枚举构建的套件的套件 283

示例:测试套件过程 284

19.9测试发现 286

运行原理 286

使用时机 286

实现方式说明 287

启发示例 287

重构说明 288

示例:测试方法发现(使用方法命名和编译器宏) 288

示例:测试方法发现(使用方法命名) 288

示例:测试方法发现(使用方法属性) 289

示例:测试用例类发现(使用类属性) 290

示例:测试用例类发现(使用公共位置和测试用例超类) 290

19.10测试枚举(也称为:测试套件工厂) 290

运行原理 291

使用它的时机 291

实现方式说明 291

示例:CppUnit中的测试方法枚举 292

示例:测试方法调用(硬编码的) 293

示例:测试套件枚举 293

19.11测试选择 294

运行原理 294

使用时机 294

实现方式说明 295

示例:使用类属性的测试用例类选择 295

示例:使用方法属性的测试方法选择 295

第20章 夹具建立模式 297

20.1内联建立 297

运行原理 298

使用时机 298

实现方式说明 298

示例:内联建立 298

重构说明 299

20.2委托建立 299

运行原理 300

使用时机 300

实现方式说明 300

启发示例 300

重构说明 301

示例:委托建立 301

20.3创建方法 302

运行原理 303

使用时机 303

实现方式说明 305

启发示例 305

重构说明 306

示例:匿名创建方法 306

示例:参数化创建方法 307

示例:附件方法 307

示例:重复用于夹具建立的测试 308

20.4隐式建立(也称为:挂钩建立、调用架构建立、共享建立方法) 309

运行原理 310

使用时机 310

实现方式说明 310

启发示例 311

重构说明 312

示例:隐式建立 312

20.5预制夹具(也称为:预制上下文、测试台) 313

运行原理 313

使用时机 313

实现方式说明 314

启发示例 315

重构说明 316

示例:预制夹具测试 316

示例:夹具建立测试用例 316

示例:使用数据填充脚本的预制夹具建立 317

20.6延迟建立 317

运行原理 318

使用时机 318

实现方式说明 319

启发示例 319

重构说明 321

示例:延迟建立 321

20.7套件夹具建立 322

运行原理 323

使用时机 323

实现方式说明 323

启发示例 324

重构说明 325

示例:套件夹具建立 325

关于名称 327

高级阅读 327

20.8建立装饰器 327

运行原理 328

使用时机 328

实现方式说明 328

启发示例 330

重构说明 330

示例:硬编码的建立装饰器 330

示例:参数化建立装饰器 331

示例:抽象装饰器类 332

20.9链接测试 332

运行原理 333

使用时机 333

实现方式说明 334

启发示例 335

重构说明 336

示例:链接测试 336

第21章 结果验证模式 339

21.1状态验证(也称为:基于状态的测试) 339

运行原理 340

使用时机 340

实现方式说明 340

启发示例 341

重构说明 342

示例:过程状态验证 342

示例:预期对象 342

21.2行为验证(也称为:交互测试) 343

运行原理 343

使用时机 344

实现方式说明 344

启发示例 345

重构说明 346

示例:过程行为验证 346

示例:预期行为规范 347

21.3自定义断言(也称为:预约断言) 347

工作原理 348

使用时机 348

实现方式说明 350

启发示例 351

重构说明 352

示例:自定义断言 352

示例:域断言 353

示例:验证方法 354

示例:自定义断言测试 355

21.4 Delta断言 356

运行原理 356

使用时机 357

实现方式说明 357

启发示例 358

重构说明 358

示例:Delta断言 358

21.5哨兵断言 359

运行原理 360

使用时机 360

实现方式说明 360

启发示例 361

重构说明 361

示例:简单哨兵断言 361

示例:共享夹具哨兵断言 362

21.6未完成的测试断言 362

运行原理 363

使用时机 363

实现方式说明 363

启发示例 364

重构说明 364

示例:未完成的测试断言 364

示例:使用模板的未完成的测试方法生成 365

第22章 夹具拆卸模式 367

22.1无用单元收集拆卸 367

运行原理 367

使用时机 368

实现方式说明 368

启发示例 368

重构说明 369

示例:无用单元收集拆卸 369

22.2自动拆卸(也称为:测试对象注册库) 369

运行原理 370

使用时机 370

实现方式说明 370

启发示例 371

重构说明 372

示例:自动拆卸 372

示例:自动执行拆卸 374

22.3内联拆卸 374

运行原理 375

使用时机 375

实现方式说明 376

启发示例 376

示例:天真内联拆卸 377

重构说明 377

示例:内联拆卸 377

示例:拆卸哨兵子句 378

示例:多种资源内联 378

拆卸(Java) 378

示例:委托拆卸 379

22.4隐式拆卸(也称为:关联拆卸、调用架构拆卸、拆卸方法) 380

运行原理 381

使用时机 381

实现方式说明 381

启发示例 381

重构说明 382

示例:隐式拆卸 382

第23章 测试替身模式 385

23.1测试替身(也称为冒名顶替者) 385

运行原理 386

使用时机 386

实现方式说明 388

示例:测试替身 389

23.2测试桩(也称为:桩) 390

运行原理 390

使用时机 390

实现方式说明 391

启发示例 392

重构说明 393

示例:响应器(作为手动编码的测试桩) 393

示例:响应器(动态生成) 394

示例:破坏者(作为匿名内部类) 395

示例:实体链裁剪 395

高级阅读 397

23.3测试间谍(也称为:间谍、记录测试桩) 397

运行原理 398

使用时机 398

实现方式说明 399

启发示例 399

重构说明 400

示例:测试间谍 400

23.4仿制对象 402

运行原理 402

使用时机 403

实现方式说明 403

启发示例 404

重构说明 405

示例:仿制对象(手动编码的) 405

示例:仿制对象(动态生成的) 406

高级阅读 407

23.5伪造对象(也称为:哑元) 407

运行原理 408

使用时机 408

实现方式说明 409

启发示例 410

重构说明 411

示例:伪造数据库 411

高级阅读 412

23.6可配置的测试替身(也称为:可配置的仿制对象、可配置的测试间谍、可配置的测试桩) 412

运行原理 413

使用时机 413

实现方式说明 413

启发示例 415

重构说明 417

示例:使用设置者的配置接口 417

示例:使用表达式生成器的配置接口 418

示例:配置模式 419

23.7硬编码的测试替身(也称为:硬编码的仿制对象、硬编码的测试桩、硬编码的测试间谍) 420

运行原理 421

使用时机 421

实现方式说明 421

启发示例 423

重构说明 423

示例:测试替身类 424

示例:自分流/回送 424

示例:子类化内部测试替身 425

示例:从伪类子类化的内部测试替身 426

高级阅读 428

23.8测试专用子类(也称为:测试专用扩充) 429

运行原理 429

使用时机 430

实现方式说明 431

启发示例 431

重构说明 433

示例:修改行为的子类(测试桩) 433

示例:修改行为的子类(代替的单态) 434

示例:提供行为的子类 435

示例:定义测试专用相等性(修改行为的子类) 436

示例:提供状态的子类 437

第24章 测试组织模式 439

24.1命名测试套件 439

运行原理 440

使用时机 440

实现方式说明 440

重构说明 441

示例:全部测试套件 441

示例:专用目的套件 442

示例:单个测试套件 442

示例:冒烟测试套件 443

24.2测试实用程序方法 444

运行原理 444

使用时机 445

实现方式说明 447

启发示例 447

重构说明 448

示例:测试实用程序方法 449

24.3参数化测试 450

运行原理 451

使用时机 451

实现方式说明 452

启发示例 453

重构说明 454

示例:参数化测试 454

示例:独立表格测试 455

示例:递增的表格测试 456

示例:使用架构支持的表格测试(MbUnit) 456

示例:循环驱动测试(枚举值) 457

示例:循环驱动测试(计算值) 457

24.4每个类一个测试用例类 458

运行原理 459

使用时机 459

实现方式说明 459

24.5每种特征一个测试用例类 464

运行原理 465

使用时机 465

实现方式说明 466

启发示例 466

重构说明 467

示例:每种特征一个测试用例类 468

24.6每个夹具一个测试用例类 469

运行原理 470

使用时机 470

实现方式说明 471

启发示例 471

重构说明 473

示例:每个夹具一个测试用例类 473

24.7测试用例超类(也称为抽象测试用例、抽象测试夹具、测试用例基类) 475

运行原理 476

使用时机 476

实现方式说明 477

启发示例 477

重构说明 477

示例:测试用例超类 478

示例:测试辅助混入 478

24.8测试辅助 480

运行原理 480

使用时机 480

实现方式说明 481

启发示例 482

重构说明 482

示例:使用类方法的测试辅助 483

示例:使用实例方法的测试辅助 483

第25章 数据库模式 485

25.1数据库沙盒 485

运行原理 486

使用时机 486

实现方式说明 486

启发示例 487

重构说明 487

示例:数据库分区方案 488

25.2存储过程测试 488

运行原理 489

使用时机 489

实现方式说明 489

启发示例 491

重构说明 492

示例:数据库内存储过程测试 492

示例:远程存储过程测试 493

25.3表格截断拆卸 493

运行原理 494

使用时机 494

实现方式说明 495

启发示例 496

重构说明 496

示例:表格截断(委托)拆卸测试 496

示例:延迟拆卸测试 497

示例:使用SQL的表格截断拆卸 498

示例:使用ORM的表格截断拆卸 498

25.4事务回滚拆卸 499

运行原理 500

使用时机 500

实现方式说明 501

启发示例 502

重构说明 502

示例:对象事务回滚拆卸 503

示例:数据库事务回滚拆卸 504

第26章 易测性设计模式 507

26.1依赖注入 507

运行原理 507

使用时机 508

实现方式说明 508

启发示例 510

重构说明 510

示例:参数注入 511

示例:构造函数注入 511

示例:设置者注入 512

26.2依赖查找(也称为:服务定位器、对象工厂、组件代理、组件注册库) 513

运行原理 514

使用时机 514

实现方式说明 515

启发示例 516

重构说明 517

示例:可配置的注册库 517

示例:代替的单态 518

关于名称 520

26.3低级对象 520

运行原理 521

使用时机 521

实现方式说明 522

启发示例(低级可执行) 524

重构说明 525

示例:穷人的低级对象 526

示例:真正低级可执行 526

示例:低级对话 528

示例:低级事务控制器 531

26.4测试挂钩 531

运行原理 531

使用时机 532

实现方式说明 532

启发示例 532

重构说明 533

示例:被测系统的测试挂钩 533

示例:依赖组件中的测试挂钩 533

第27章 值模式 535

27.1字面值(也称为:硬编码值、常量值) 535

运行原理 535

使用时机 535

实现方式说明 536

示例:字面值 536

重构说明 537

示例:符号常量 537

示例:自述值 537

示例:不同值 538

27.2派生值(也称为:计算值) 538

运行原理 538

使用时机 539

启发示例 539

重构说明 540

示例:派生预期 540

示例:一种坏属性 540

27.3生成值 542

运行原理 542

使用时机 542

实现方式说明 543

启发示例 543

重构说明 544

示例:不同生成值 544

示例:相关生成值 545

27.4哑元对象(也称为:哑元、哑元参数、哑元值、占位符、桩) 545

运行原理 546

使用时机 546

实现方式说明 546

启发示例 547

重构说明 548

示例:哑元值和哑元对象 548

第Ⅳ部分 附录 553

附录A 测试重构 553

附录B xUnit术语 559

附录C xUnit家族成员 565

附录D 工具 571

附录E 目标和原则 577

附录F 味道、别名和原因 579

附录G 模式、别名和变体 583

术语表 595

参考文献 619

返回顶部