第1部分 JUnit精粹 1
1 JUnit起步 3
1.1 证实它能运作 4
1.2 从头开始 6
1.3 理解单元测试框架 10
1.4 安装JUnit 11
1.5 用JUnit测试 13
1.6 小结 16
2 探索JUnit 17
2.1 探索JUnit核心 18
2.2 用testrunner来运行测试 20
2.2.1 选择testrunner 20
2.3 用TestSuite来组合测试 21
2.2.2 定义你自己的testrunner 21
2.3.1 运行自动suite 22
2.3.2 编写你自己的testsuite 23
2.4 用TestResult来收集参数 25
2.5 用TestListener来观察结果 27
2.6 用TestCase来工作 28
2.6.1 用fixture来管理资源 29
2.6.2 创建单元测试方法 30
2.7 创建TestCalculator全过程 32
2.7.1 创建TestSuite 33
2.7.2 创建TestResult 35
2.7.3 执行测试方法 36
2.7.4 复习完整JUnit生命周期 37
2.8 小结 38
3 JUnit实例 39
3.1 引入controller组件 40
3.1.1 设计接口 41
3.1.2 实现基类 43
3.2 让我们来测试吧 45
3.2.1 测试DefaultController 46
3.2.2 增加处理器 46
3.2.3 处理请求 50
3.2.4 改进testProcessRequest 54
3.3 测试异常处理 55
3.3.1 模拟异常条件 56
3.3.2 测试异常 60
3.4 建立测试项目 62
3.5 小结 64
4 探索软件测试 65
4.1 单元测试的必要性 66
4.1.1 带来更大的测试范围 67
4.1.2 带来团队协作的可能 67
4.1.3 防止衰退,减少调试 67
4.1.4 使得重构可行 68
4.1.5 改进实现设计 69
4.1.6 当作开发者文档来用 69
4.1.7 非常有趣 70
4.2 不同种类的测试 71
4.2.1 软件测试的4种类型 71
4.2.2 单元测试的3种类型 75
4.3 判断测试质量 77
4.3.1 衡量测试覆盖面 78
4.3.2 产生测试覆盖情况报告 79
4.3.3 测试交互 81
4.4 测试驱动开发 81
4.4.1 调整周期 81
4.4.2 TDD两步走 83
4.5 在开发周期中的测试 84
4.6 小结 87
5 JUnit自动化 88
5.1 生命中的一天 89
5.2 从Ant中执行测试 90
5.2.1 不可缺少的Ant 91
5.2.2 Ant目标、项目、属性以及任务 92
5.2.3 javac任务 94
5.2.4 JUnit任务 96
5.2.5 让Ant来执行任务 97
5.2.6 用JUnitReport打印好看的报告 98
5.2.7 自动找出要运行的测试 100
5.3 从Maven运行测试 102
5.3.1 Maven,目标寻找者 102
5.3.2 为项目配置Maven 104
5.3.3 使用Maven来执行JUnit测试 109
5.3.4 用Maven处理要依赖的jar 109
5.4 从Eclipse中运行测试 112
5.4.1 创建一个Eclipse项目 112
5.4.2 在Eclipse中运行JUnit测试 114
5.5 小结 116
第2部分 测试策略 117
6 用stub进行粗粒度测试 119
6.1 stub简介 120
6.2 一个HTTP连接的例子 121
6.2.1 选择一个替换方案 124
6.2.2 用Jetty作为嵌入式服务器 125
6.3 替换Web服务器资源 126
6.3.1 建立第一个stub测试 126
6.3.2 测试失败情况 132
6.3.3 回顾第一个stub测试 133
6.4 替换连接 134
6.4.1 创建自定义URL协议处理器 134
6.4.2 创建JDK的HttpURLConnectionstub 136
6.4.3 运行测试 137
6.5 总结 138
7 用mockobjects进行孤立测试 139
7.1 mockobjects简介 140
7.2 体验mockobjects:一个简单例子 141
7.3 把mockobjects用作重构手法 146
7.3.1 方便的重构 147
7.3.2 允许更灵活的代码 148
7.4 实践HTTP连接示例程序 150
7.4.1 定义mockobject 150
7.4.2 测试示例方法 151
7.4.3 尝试1:简单的方法重构技法 152
7.4.4 尝试2:使用类工厂进行重构 155
7.5 把mockobjects用作特洛伊木马 159
7.6 决定何时使用mockobjects 163
7.7 小结 164
8 使用Cactus进行容器内测试 165
8.1 对组件进行单元测试的问题 166
8.2 用mockobjects测试组件 167
8.2.1 EasyMock来测试servlet例子 168
8.2.2 用mockobjects测试组件的优势与不足 170
8.3 什么是集成单元测试 172
8.4 介绍Cactus 173
8.5 用Cactus测试组件 173
8.5.1 运行Cactus测试 174
8.5.2 用Cactus/Jetty集成来执行测试 174
8.5.3 容器内测试的缺点 178
8.6 Cactus如何工作 179
8.6.1 在客户端和服务器端的步骤 180
8.6.2 一步步执行测试 180
8.7 小结 182
第3部分 测试组件 185
9 对servlet和filter进行单元测试 187
9.1 介绍管理应用程序 188
9.2 用Cactus编写servlet测试 189
9.2.1 设计第一个测试 190
9.2.2 使用Maven来运行Cactus测试 192
9.2.3 完成Cactusservlet测试 198
9.3 用mockobjects测试servlet 204
9.3.1 使用DynaMocks和DynaBeans写一个测试 205
9.3.2 完成DynaMock测试 206
9.4 用Cactus写filter测试 208
9.4.1 用SELECT查询测试filter 209
9.4.2 对其它的查询类型测试filter 210
9.4.3 用Maven运行Cactusfilter测试 212
9.5 何时使用Cactus,何时使用mockobjects 213
9.6 小结 214
10 对JSP和taglib进行单元测试 215
10.1 回顾管理应用软件 216
10.2 什么是JSP单元测试 217
10.3 单独使用Cactus对JSP进行单元测试 217
10.3.1 利用SQL结果数据执行JSP 218
10.3.2 编写Cactus测试 219
10.3.3 使用Maven执行CactusJSP的测试程序 222
10.4 使用Cactus对taglib进行单元测试 224
10.4.1 定义自定义标记 225
10.4.2 测试自定义标记 227
10.4.3 对带body的标记进行单元测试 228
10.5 用mockobjects对taglib进行单元测试 233
10.4.4 对协作标记进行单元测试 233
10.5.1 MockMaker及其Eclipse插件的安装 234
10.5.2 用MockMaker从类中产生mockobjects 234
10.6 何时使用mockobjects,何时使用Cactus 237
10.7 小结 237
11 对数据库应用程序进行单元测试 239
11.1 对数据库进行单元测试的介绍 240
11.2 隔离开数据库测试业务逻辑 242
11.2.1 实现数据库访问层的接口 243
11.2.2 建立一个模拟数据库接口层 244
11.2.3 模拟数据库接口层 246
11.3 隔离开数据库测试持久性代码 247
11.3.1 测试execute方法 248
11.3.2 用预期验证状态 256
11.4.1 满足数据库集成测试的要求 260
11.4 数据库集成单元测试的编写 260
11.4.2 预设数据库数据 261
11.5 用Ant运行Cactus测试 265
11.5.1 项目结构的回顾 265
11.5.2 Cactus/Ant集成模块介绍 266
11.5.3 一步步建立Antbuild文件 267
11.5.4 执行Cactus测试 274
11.6 改进构建性能 275
11.6.1 分解出只读数据 275
11.6.2 按功能将测试分组 277
11.7 数据库整体单元测试策略 278
11.7.1 选择一种方法 278
11.6.3 使用驻留内存数据库 278
11.7.2 用持续集成 279
11.8 小结 280
12 对EJB进行单元测试 281
12.1 定义一个简单的EJB应用程序 282
12.2 使用facade策略 283
12.3 使用mockobjects对JNDI代码进行单元测试 284
12.4 对sessionbean进行单元测试 285
12.4.1 使用工厂方法策略 289
12.4.2 使用工厂类策略 293
12.4.3 使用mockJNDI实现策略 297
12.5 使用mockobjects测试message-drivenbean 307
12.6 使用mockobjects测试entitybean 310
12.7 选择正确的mockobjects策略 312
12.8 使用集成单元测试 313
12.9 使用JUnit和远程调用 314
12.9.1 直接使用JUnit的要求 315
12.9.2 把Petstore应用程序打包进ear文件 315
12.9.3 自动部署和执行测试 319
12.9.4 为PetstoreEJB编写远程的JUnit测试 325
12.9.5 修改JNDI名字 326
12.9.6 运行测试 327
12.10 使用Cactus 328
12.10.1 用Cactus编写EJB单元测试 328
12.10.2 项目目录结构 329
12.10.3 打包Cactus测试 329
12.10.4 执行Cactus测试 333
12.11 小结 334
A 源代码说明 335
A.1 获取源代码 336
A.2 源代码概览 336
A.3 外部库 338
A.4 Jar版本 339
A.5 目录结构惯例 340
B Eclipse快速上手 341
B.1 安装Eclipse 342
B.2 从源代码中建立Eclipse项目 342
B.3 从Eclipse中运行JUnit测试 343
B.4 从Eclipse中执行Ant脚本 344
B.5 从Eclipse中运行Cactus测试 345
参考文献 346
索引 351