第1部分 基石 1
第1章 基础概念 3
1.1 什么是程序员测试 4
1.1.1 对象测试的目的 5
1.1.2 “对象测试”的节奏 5
1.1.3 单元测试的框架 6
1.1.4 进入JUnit 8
1.1.5 理解测试驱动开发 8
1.2 开始使用JUnit 9
1.2.1 下载和安装JUnit 9
1.2.2 编写一个简单的测试 11
1.2.3 理解TestCase类 12
1.2.4 失败信息 14
1.2.5 JUnit怎样表示一个失败的断言 14
1.2.6 失败和错误的区别 15
1.3 一些好的实践 15
1.3.1 测试和测试类的命名约定 16
1.3.2 测试的是行为,而不是方法 17
1.4 总结 18
第2章 码元测试 21
2.1 测试你的equals方法 24
2.2 测试一个没有返回值的方法 31
2.3 测试构造函数 34
2.4 测试获取器 37
2.5 测试设置器 40
2.6 测试接口 43
2.7 测试JavaBean 47
2.8 测试是否抛出正确的异常 49
2.9 让容器自己进行比较 53
2.10 测试一个巨型对象的相等性 55
2.11 测试一个拥有其他对象的对象 57
第3章 组织和编译JUnit测试 63
3.1 将测试类与产品代码放在同一个包中 65
3.2 为测试代码创建独立的源代码树 68
3.3 区分测试包和产品包 70
3.4 抽取一个测试模块 73
3.5 提取一个测试装置层次结构 77
3.6 引入一个基本测试用例 79
3.7 将对特殊用例的测试放到一个单独的测试装置里 81
3.8 从命令行编译测试代码 83
3.9 使用Ant编译测试代码 84
3.10 使用Eclipse编译测试代码 87
第4章 管理Test Suites 91
4.1 让JUnit创建Test Suite 92
4.2 归纳专用的Test Case 96
4.3 收集一个package中所有的测试 99
4.4 收集系统中的所有测试 101
4.5 为测试扫描文件系统 103
4.6 分离不同的Test Suite 106
4.7 控制某些测试的顺序 109
4.8 创建数据驱动的Test Suite 112
4.9 使用XML定义Test Suite 117
第5章 使用测试数据进行测试 121
5.1 使用Java的系统属性 123
5.2 使用环境变量 127
5.3 使用内联数据文件 129
5.4 使用属性文件 131
5.5 使用ResourceBundle API 135
5.6 使用基于文件的测试数据仓库 137
5.7 使用XML描述测试数据 139
5.8 使用Ant的〈sql〉任务来操作数据库 140
5.9 使用JUnitPP 141
5.10 为整个Test Suite建立设置实体 143
5.11 为多个测试执行单次环境设置 146
5.12 使用DbUnit 150
第6章 运行JUnit测试 153
6.1 运行时看见测试的名字 157
6.2 在用基于文本的测试运行器时,怎样观察每个被执行的测试的名字 157
6.3 执行单个的测试 159
6.4 在单独的JVM中执行每个测试 160
6.5 在每个测试前重新装载类 161
6.6 略过一个测试 164
第7章 汇报JUnit结果 167
7.1 使用带日志功能的基础测试类 168
7.2 使用Log4Unit 172
7.3 用Ant获取纯文本的结果 176
7.4 使用Ant的〈junitreport〉任务将结果输出为HTML格式 179
7.5 使用XSLT自定义〈junit〉XML报告 182
7.6 拓展Ant的Junit结果格式 185
7.7 实现TestListener拓展TestRunner 191
7.8 报告断言的总数 199
第8章 为JUnit排除疑难 207
8.1 JUnit无法找到你的测试 209
8.2 JUnit不执行你自定义的Test Suite 211
8.3 JUnit没有设置你的测试实体 212
8.4 覆盖runTest()方法后测试建立失败 214
8.5 第一个断言失败后测试停止了 216
8.6 图形化的Test Runner没有正确地装载你的类 222
8.7 当测试类使用JAXP的时候JUnit失败了 223
8.8 当指向一个EJB引用时JUnit失败 225
第2部分 测试J2EE 231
第9章 测试与XML 233
9.1 验证文档中元素的顺序 239
9.2 忽略XML文档中元素间的顺序 242
9.3 在XML文档中忽略特定种类的差异 246
9.4 从XMLUnit中获得更详细的错误消息 251
9.5 测试静态Web页面的内容 253
9.6 单独测试XSL样式表 259
9.7 在测试中验证XML文档 263
第10章 测试与JDBC 267
10.1 测试从ResultSet创建domain object 275
10.2 验证你的SQL语句 278
10.3 测试你的数据库 283
10.4 确定测试释放了JDBC资源 290
10.5 核实你的产品代码释放了JDBC资源 297
10.6 在你的测试功能中管理外部数据 299
10.7 管理测试数据库中的测试数据 302
10.8 测试部署schema对象时的权限 305
10.9 脱离数据库来测试legacy JDBC代码 308
10.10 联合数据库测试遗留的JDBC代码 311
10.11 联合DbUnit使用schema-qualified的表 313
10.12 测试存储过程 316
第11章 测试EJB 319
11.1 脱离容器测试一个session bean的方法 325
11.2 测试一个遗留的session bean 333
11.3 在实际的容器中测试session bean 339
11.4 测试CMP entity bean 341
11.5 在容器外测试CMP meta data 344
11.6 测试BMP entity bean 350
11.7 在容器中测试message-driven bean 355
11.8 在容器外测试一个message-driven bean 360
11.9 测试遗留的message-driven bean 363
11.10 脱离消息服务器测试一个JMS消息使用者 366
11.11 测试JMS消息的处理 369
11.12 测试一个JMS消息生成器 372
11.13 测试你的JNDI目录中的内容 377
第12章 测试web组件 381
12.1 脱离容器测试会话数据的更新 383
12.2 测试HTTP session数据对象的更新 389
12.3 测试解析JSP 393
12.4 测试对Velocity模板的解析 400
12.5 测试一个JSP tag handler 402
12.6 测试你的JSP标签库的部署 407
12.7 测试servlet的初始化 410
12.8 测试ServletContext 413
12.9 测试对request的处理 415
12.10 脱离服务器来验证网页内容 422
12.11 验证表单属性 425
12.12 校验传递到页面模板的数据 426
12.13 测试web资源过滤器 430
第13章 测试J2EE应用 437
13.1 测试页面流 439
13.2 在Struts应用中测试导航规则 446
13.3 测试你的网站以寻找失效的链接 449
13.4 测试web资源的安全性 452
13.5 测试EJB资源的安全性 455
13.6 测试容器管理的事务处理 460
第3部分 其他JUnit技术 463
第14章 测试设计模式 465
14.1 测试一个Observer(Event Listener) 466
14.2 测试可观测的事件源 471
14.3 测试一个Singleton 476
14.3 测试一个Singleton的客户端 479
14.5 测试一个对象工厂 481
14.6 测试一个Template方法的实现 484
第15章 GSBase 489
15.1 用EventCather检查事件源 491
15.2 测试序列化 493
15.3 测试克隆对象 495
15.4 用“appears equal”来比较JavaBean 497
第16章 JUnit-addons 501
16.1 测试你的类的compareTo()方法 503
16.2 从档案文件里自动收集测试 505
16.3 用PropertyManager来组织测试数据 506
16.4 管理共享的测试资源 508
16.5 保证你的共享测试组件会把自己卸掉 512
16.6 在执行每个测试时报告其名称 514
第17章 补遗 517
17.1 在测试间清理文件系统 518
17.2 不依赖文件系统的情况下测试基于文件的应用 521
17.3 检验你的测试用例类的语法 526
17.4 提取定制的断言 529
17.5 测试一个无返回值的继承方法 531
17.6 如果你必须测试一个private方法 536
附录A 完整方案 539
A.1 用XML定义一个测试 540
A.2 覆盖runTest()的参数化测试用例 543
A.3 忽略XML文档中的元素次序 545
A.4 隔离测试一个XSL样式表 547
A.5 使你的测试中的XML文档生效 551
A.6 基于方面的通用Spy 553
A.7 测试一个BMP实体bean 556
附录B 测试的文章 571
B.1 简单得不能拆分 572
B.2 奇特性与传递性 574
B.3 隔离高开销的测试 577
B.4 仿制对象概览 584
附录C 阅读清单 589
参考文献 593
索引 599