Python Web开发:测试驱动方法

Python Web开发:测试驱动方法
分享
扫描下方二维码分享到微信
打开微信,点击右上角”+“,
使用”扫一扫“即可将网页分享到朋友圈。
作者: [英] (Harry J.W.Percival) ,
2015-10
版次: 1
ISBN: 9787115403278
定价: 99.00
装帧: 平装
开本: 16开
纸张: 胶版纸
页数: 416页
正文语种: 简体中文
原版书名: Test-Driven Development with Python
104人买过
  •   《Python Web开发 测试驱动方法》从基础的知识开始,讲解Web开发的整个流程,展示如何使用Python做测试驱动开发。本书由三个部分组成。介绍了测试驱动开发和Django的基础知识。第二部分讨论了Web开发要素,探讨了Web开发过程中不可避免的问题,及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方插件、Ajax、测试固件、持续集成等。本书适合Web开发人员阅读。
      Harry J.W. Percival,目前就职于PythonAnywhere LLP公司,他在各种演讲、研讨会和开发者大会上积极推广TDD。他在利物浦大学获得计算机科学硕士学位,在剑桥大学获得哲学硕士学位。
    前言  xv
    准备工作和应具备的知识  xxi
    致谢  xxvii
    第一部分 TDD 和Django 基础
    第1章 使用功能测试协助安装Django  3
    1.1 遵从测试山羊的教诲,没有测试什么也别做  3
    1.2 让Django运行起来  6
    1.3 创建Git仓库  7
    第2章 使用unittest模块扩展功能测试  11
    2.1 使用功能测试驱动开发一个最简可用的应用  11
    2.2 Python标准库中的unittest模块  14
    2.3 隐式等待  16
    2.4 提交  16
    第3章 使用单元测试测试简单的首页  18
    3.1 第一个Django应用,第一个单元测试  19
    3.2 单元测试及其与功能测试的区别  19
    3.3 Django中的单元测试  20
    3.4 Django中的MVC、URL 和视图函数  21
    3.5 终于可以编写一些应用代码了  22
    3.6 urls.py  24
    3.7 为视图编写单元测试  27
    第4章 编写这些测试有什么用  31
    4.1 编程就像从井里打水  31
    4.2 使用Selenium测试用户交互  33
    4.3 遵守“不测试常量”规则,使用模板解决这个问题  35
    4.4 关于重构  39
    4.5 接着修改首页  40
    4.6 总结:TDD流程  42
    第5章 保存用户输入  45
    5.1 编写表单,发送POST请求  45
    5.2 在服务器中处理POST请求  48
    5.3 把Python变量传入模板中渲染  49
    5.4 事不过三,三则重构  53
    5.5 Django ORM和第一个模型  54
    5.5.1 第一个数据库迁移  56
    5.5.2 测试向前走得挺远  57
    5.5.3 添加新字段就要创建新迁移  57
    5.6 把POST请求中的数据存入数据库  58
    5.7 处理完POST请求后重定向  61
    5.8 在模板中渲染待办事项  63
    5.9 使用迁移创建生产数据库  65
    第6章 完成最简可用的网站  70
    6.1 确保功能测试之间相互隔离  70
    6.2 必要时做少量的设计  74
    6.2.1 YAGNI  74
    6.2.2 REST  75
    6.3 使用TDD 实现新设计  76
    6.4 逐步迭代,实现新设计  78
    6.5 使用Django测试客户端一起测试视图、模板和URL  80
    6.5.1 一个新测试类  80
    6.5.2 一个新URL  81
    6.5.3 一个新视图函数  81
    6.5.4 一个新模板,用于查看清单  82
    6.6 用于添加待办事项的URL和视图  85
    6.6.1 用来测试新建清单的测试类  85
    6.6.2 用于新建清单的URL和视图  86
    6.6.3 删除当前多余的代码和测试  88
    6.6.4 让表单指向刚添加的新URL  88
    6.7 调整模型  89
    6.7.1 通过外键实现的关联  91
    6.7.2 根据新模型定义调整其他代码  92
    6.8 每个列表都应该有自己的URL  94
    6.8.1 捕获URL中的参数  95
    6.8.2 按照新设计调整new_list视图  96
    6.9 还需要一个视图,把待办事项加入现有清单  97
    6.9.1 小心霸道的正则表达式  98
    6.9.2 最后一个新URL  98
    6.9.3 最后一个新视图  99
    6.9.4 如何在表单中使用那个URL  100
    6.10 使用URL 引入做最后一次重构  102
    第二部分 Web开发要素
    第7章 美化网站:布局、样式及其测试方法  106
    7.1 如何在功能测试中测试布局和样式  106
    7.2 使用CSS框架美化网站  109
    7.3 Django模板继承  111
    7.4 集成Bootstrap  112
    7.5 Django中的静态文件  114
    7.6 使用Bootstrap中的组件改进网站外观  116
    7.6.1 超大文本块  116
    7.6.2 大型输入框  116
    7.6.3 样式化表格  117
    7.7 使用自己编写的CSS  117
    7.8 补遗:collectstatic命令和其他静态目录  118
    7.9 没谈到的话题  121
    第8章 使用过渡网站测试部署  122
    8.1 TDD以及部署的危险区域  123
    8.2 一如既往,先写测试  124
    8.3 注册域名  126
    8.4 手动配置托管网站的服务器  126
    8.4.1 选择在哪里托管网站  127
    8.4.2 搭建服务器  127
    8.4.3 用户账户、SSH和权限  128
    8.4.4 安装Nginx  128
    8.4.5 解析过渡环境和线上环境所用的域名  129
    8.4.6 使用功能测试确认域名可用而且Nginx正在运行  130
    8.5 手动部署代码  130
    8.5.1 调整数据库的位置  131
    8.5.2 创建虚拟环境  133
    8.5.3 简单配置Nginx  135
    8.5.4 使用迁移创建数据库  137
    8.6 为部署到生产环境做好准备  138
    8.6.1 换用Gunicorn  138
    8.6.2 让Nginx伺服静态文件  139
    8.6.3 换用Unix套接字  140
    8.6.4 把DEBUG设为False,设置ALLOWED_HOSTS  141
    8.6.5 使用Upstart确保引导时启动Gunicorn  141
    8.6.6 保存改动:把Gunicorn 添加到requirements.txt  142
    8.7 自动化  143
    第9章 使用Fabric自动部署  147
    9.1 分析一个Fabric部署脚本  148
    9.2 试用部署脚本  151
    9.2.1 部署到线上服务器  153
    9.2.2 使用sed配置Nginx 和Gunicorn  155
    9.3 使用Git标签标注发布状态  155
    9.4 延伸阅读  156
    第10章 输入验证和测试的组织方式  158
    10.1 针对验证的功能测试:避免提交空待办事项  158
    10.1.1 跳过测试  159
    10.1.2 把功能测试分拆到多个文件中  160
    10.1.3 运行单个测试文件  162
    10.1.4 填充功能测试  163
    10.2 使用模型层验证  164
    10.2.1 重构单元测试,分拆成多个文件  164
    10.2.2 模型验证的单元测试和self.assertRaises上下文管理器  165
    10.2.3 Django怪异的表现:保存时不验证数据  166
    10.3 在视图中显示模型验证错误  167
    10.4 Django模式:在渲染表单的视图中处理POST 请求  171
    10.4.1 重构:把new_item实现的功能移到view_list 中  172
    10.4.2 在view_list 视图中执行模型验证  174
    10.5 重构:去除硬编码的URL  176
    10.5.1 模板标签{% url %}  176
    10.5.2 重定向时使用get_absolute_url  177
    第11章 简单的表单  181
    11.1 把验证逻辑移到表单中  181
    11.1.1 使用单元测试探索表单API  182
    11.1.2 换用Django中的ModelForm类  183
    11.1.3 测试和定制表单验证  184
    11.2 在视图中使用这个表单  186
    11.2.1 在处理GET请求的视图中使用这个表单  187
    11.2.2 大量查找和替换  189
    11.3 在处理POST请求的视图中使用这个表单  191
    11.3.1 修改new_list视图的单元测试  191
    11.3.2 在视图中使用这个表单  192
    11.3.3 使用这个表单在模板中显示错误消息  193
    11.4 在其他视图中使用这个表单  194
    11.5 使用表单自带的save方法  196
    第12章 高级表单  199
    12.1 针对重复待办事项的功能测试  199
    12.1.1 在模型层禁止重复  200
    12.1.2 题外话:查询集合排序和字符串表示形式  202
    12.1.3 重写旧模型测试  204
    12.1.4 保存时确实会显示完整性错误  205
    12.2 在视图层试验待办事项重复验证  206
    12.3 处理唯一性验证的复杂表单  207
    12.4 在清单视图中使用ExistingListItemForm  209
    第13章 试探JavaScript  213
    13.1 从功能测试开始  213
    13.2 安装一个基本的JavaScript 测试运行程序  214
    13.3 使用jQuery 和
    固件元素  217
    13.4 为想要实现的功能编写JavaScript单元测试  219
    13.5 JavaScript测试在TDD循环中的位置  221
    13.6 经验做法:onload样板代码和命名空间  222
    13.7 一些缺憾  223
    第14章 部署新代码  224
    14.1 部署到过渡服务器  224
    14.2 部署到线上服务器  225
    14.3 如果看到数据库错误该怎么办  225
    14.4 总结:为这次新发布打上Git 标签  225
    第三部分 高级话题
    第15章 用户认证、集成第三方插件以及JavaScript模拟技术的使用  228
    15.1 Mozilla Persona(BrowserID)  229
    15.2 探索性编程(又名“探究”)  229
    15.2.1 为此次探究新建一个分支  230
    15.2.2 前端和JavaScript代码  230
    15.2.3 Browser-ID协议  231
    15.2.4 服务器端:自定义认证机制  232
    15.3 去掉探究代码  237
    15.3.1 常用Selenium技术:显式等待  240
    15.3.2 删除探究代码  241
    15.4 涉及外部组件的JavaScript单元测试:首次使用模拟技术  242
    15.4.1 整理:全站共用的静态文件夹  242
    15.4.2 什么是模拟技术,为什么要模拟,模拟什么  244
    15.4.3 命名空间  244
    15.4.4 在initialize函数的单元测试中使用一个简单的驭件  245
    15.4.5 高级模拟技术  250
    15.4.6 检查参数的调用  253
    15.4.7 QUnit 中的setup和teardown函数,以及Ajax请求测试  255
    15.4.8 深层嵌套回调函数和测试异步代码  259
    第16章 服务器端认证,在Python中使用模拟技术  262
    16.1 探究登录视图  262
    16.2 在Python代码中使用模拟技术  263
    16.2.1 通过模拟authenticate函数测试视图  263
    16.2.2 确认视图确实登录了用户  266
    16.3 模拟网络请求,去除自定义认证后台中的探究代码  270
    16.3.1 一个if 语句需要一个测试  270
    16.3.2 在类上使用patch修饰器  272
    16.3.3 进行布尔值比较时要留意驭件  275
    16.3.4 需要时创建用户  276
    16.3.5 get_user方法  277
    16.4 一个最简单的自定义用户模型  279
    16.4.1 稍微有点儿失望  280
    16.4.2 把测试当作文档  281
    16.4.3 用户已经通过认证  282
    16.5 关键时刻:功能测试能通过吗  283
    16.6 完善功能测试,测试退出功能  284
    第17章 测试固件、日志和服务器端调试  287
    17.1 事先创建好会话,跳过登录过程  287
    17.2 实践是检验真理的唯一标准:在过渡服务器中捕获最后的问题  290
    17.2.1 设置日志  291
    17.2.2 修正Persona引起的这个问题  293
    17.3 在过渡服务器中管理测试数据库  295
    17.3.1 创建会话的Django管理命令  295
    17.3.2 让功能测试在服务器上运行管理命令  296
    17.3.3 使用subprocess模块完成额外的工作  298
    17.4 集成日志相关的代码  301
    17.5 小结  304
    第18章 完成“My Lists”页面:由外而内的TDD  305
    18.1 对立技术:“由内而外”  305
    18.2 为什么选择使用“由外而内”  306
    18.3 “My Lists”页面的功能测试  306
    18.4 外层:表现层和模板  307
    18.5 下移一层到视图函数(控制器)  308
    18.6 使用由外而内技术,再让一个测试通过  309
    18.6.1 快速重组模板的继承层级  309
    18.6.2 使用模板设计API  310
    18.6.3 移到下一层:视图向模板中传入什么  311
    18.7 视图层的下一个需求:新建清单时应该记录属主  312
    18.8 下移到模型层  313
    第19章 测试隔离和“倾听测试的心声”  318
    19.1 重温抉择时刻:视图层依赖于尚未编写的模型代码  318
    19.2 首先尝试使用驭件实现隔离  319
    19.3 倾听测试的心声:丑陋的测试表明需要重构  322
    19.4 以完全隔离的方式重写视图测试  323
    19.4.1 为了新测试的健全性,保留之前的整合测试组件  323
    19.4.2 完全隔离的新测试组件  324
    19.4.3 站在协作者的角度思考问题  324
    19.5 下移到表单层  328
    19.6 下移到模型层  332
    19.7 关键时刻,以及使用模拟技术的风险  335
    19.8 把层与层之间的交互当作“合约”  336
    19.8.1 找出隐形合约  337
    19.8.2 修正由于疏忽导致的问题  338
    19.9 还缺一个测试  340
    19.10 清理:保留哪些整合测试  340
    19.10.1 删除表单层多余的代码  340
    19.10.2 删除以前实现的视图  341
    19.10.3 删除视图层多余的代码  342
    19.11 总结:什么时候编写隔离测试,什么时候编写整合测试  343
    19.11.1 以复杂度为准则  344
    19.11.2 两种测试都要写吗  344
    19.11.3 继续前行  345
    第20章 持续集成  346
    20.1 安装Jenkins  346
    20.1.1 Jenkins的安全配置  348
    20.1.2 添加需要的插件  348
    20.2 设置项目  350
    20.3 第一次构建  351
    20.4 设置虚拟显示器,让功能测试能在无界面的环境中运行  353
    20.5 截图  355
    20.6 一个常见的Selenium问题:条件竞争  358
    20.7 使用PhantomJS运行QUnit JavaScript测试  361
    20.7.1 安装node  361
    20.7.2 在Jenkins中添加构建步骤  362
    20.8 CI 服务器能完成的其他操作  364
    第21章 简单的社会化功能、页面模式,以及练习  365
    21.1 有多个用户以及使用addCleanup 的功能测试  365
    21.2 实现Selenium交互等待模式  367
    21.3 页面模式  368
    21.4 扩展功能测试测试第二个用户和“My Lists”页面  371
    21.5 留给读者的练习  373
    第22章 测试运行速度的快慢和炽热的岩浆  375
    22.1 正题:单元测试除了运行速度超快之外还有其他优势  376
    22.1.1 测试运行得越快,开发速度越快  376
    22.1.2 神赐的心流状态  377
    22.1.3 速度慢的测试经常不想运行,导致代码变坏  377
    22.1.4 现在还行,不过随着时间推移,整合测试会变得越来越慢  377
    22.1.5 别只听我一个人说  377
    22.1.6 单元测试能驱使我们实现好的设计  377
    22.2 纯粹的单元测试有什么问题  378
    22.2.1 隔离的测试难读也难写  378
    22.2.2 隔离测试不会自动测试集成情况  378
    22.2.3 单元测试几乎不能捕获意料之外的问题  378
    22.2.4 使用驭件的测试可能和实现方式联系紧密  378
    22.2.5 这些问题都可以解决  379
    22.3 合题:我们到底想从测试中得到什么  379
    22.3.1 正确性  379
    22.3.2 简洁可维护的代码  379
    22.3.3 高效的工作流程  379
    22.3.4 根据所需的优势评估测试  379
    22.4 架构方案  380
    22.4.1 端口和适配器(或六边形、简洁)架构  380
    22.4.2 函数式核心,命令式外壳  381
    22.5 小结  381
    遵从测试山羊的教诲  383
    附录A PythonAnywhere  385
    附录B 基于类的Django 视图  388
    附录C 使用Ansible配置服务器  398
    附录D 测试数据库迁移  402
    附录E 接下来做什么  407
    附录F 速查表  411
    附录G 参考书目  415
    作者简介  416
    封面介绍  416
  • 内容简介:
      《Python Web开发 测试驱动方法》从基础的知识开始,讲解Web开发的整个流程,展示如何使用Python做测试驱动开发。本书由三个部分组成。介绍了测试驱动开发和Django的基础知识。第二部分讨论了Web开发要素,探讨了Web开发过程中不可避免的问题,及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方插件、Ajax、测试固件、持续集成等。本书适合Web开发人员阅读。
  • 作者简介:
      Harry J.W. Percival,目前就职于PythonAnywhere LLP公司,他在各种演讲、研讨会和开发者大会上积极推广TDD。他在利物浦大学获得计算机科学硕士学位,在剑桥大学获得哲学硕士学位。
  • 目录:
    前言  xv
    准备工作和应具备的知识  xxi
    致谢  xxvii
    第一部分 TDD 和Django 基础
    第1章 使用功能测试协助安装Django  3
    1.1 遵从测试山羊的教诲,没有测试什么也别做  3
    1.2 让Django运行起来  6
    1.3 创建Git仓库  7
    第2章 使用unittest模块扩展功能测试  11
    2.1 使用功能测试驱动开发一个最简可用的应用  11
    2.2 Python标准库中的unittest模块  14
    2.3 隐式等待  16
    2.4 提交  16
    第3章 使用单元测试测试简单的首页  18
    3.1 第一个Django应用,第一个单元测试  19
    3.2 单元测试及其与功能测试的区别  19
    3.3 Django中的单元测试  20
    3.4 Django中的MVC、URL 和视图函数  21
    3.5 终于可以编写一些应用代码了  22
    3.6 urls.py  24
    3.7 为视图编写单元测试  27
    第4章 编写这些测试有什么用  31
    4.1 编程就像从井里打水  31
    4.2 使用Selenium测试用户交互  33
    4.3 遵守“不测试常量”规则,使用模板解决这个问题  35
    4.4 关于重构  39
    4.5 接着修改首页  40
    4.6 总结:TDD流程  42
    第5章 保存用户输入  45
    5.1 编写表单,发送POST请求  45
    5.2 在服务器中处理POST请求  48
    5.3 把Python变量传入模板中渲染  49
    5.4 事不过三,三则重构  53
    5.5 Django ORM和第一个模型  54
    5.5.1 第一个数据库迁移  56
    5.5.2 测试向前走得挺远  57
    5.5.3 添加新字段就要创建新迁移  57
    5.6 把POST请求中的数据存入数据库  58
    5.7 处理完POST请求后重定向  61
    5.8 在模板中渲染待办事项  63
    5.9 使用迁移创建生产数据库  65
    第6章 完成最简可用的网站  70
    6.1 确保功能测试之间相互隔离  70
    6.2 必要时做少量的设计  74
    6.2.1 YAGNI  74
    6.2.2 REST  75
    6.3 使用TDD 实现新设计  76
    6.4 逐步迭代,实现新设计  78
    6.5 使用Django测试客户端一起测试视图、模板和URL  80
    6.5.1 一个新测试类  80
    6.5.2 一个新URL  81
    6.5.3 一个新视图函数  81
    6.5.4 一个新模板,用于查看清单  82
    6.6 用于添加待办事项的URL和视图  85
    6.6.1 用来测试新建清单的测试类  85
    6.6.2 用于新建清单的URL和视图  86
    6.6.3 删除当前多余的代码和测试  88
    6.6.4 让表单指向刚添加的新URL  88
    6.7 调整模型  89
    6.7.1 通过外键实现的关联  91
    6.7.2 根据新模型定义调整其他代码  92
    6.8 每个列表都应该有自己的URL  94
    6.8.1 捕获URL中的参数  95
    6.8.2 按照新设计调整new_list视图  96
    6.9 还需要一个视图,把待办事项加入现有清单  97
    6.9.1 小心霸道的正则表达式  98
    6.9.2 最后一个新URL  98
    6.9.3 最后一个新视图  99
    6.9.4 如何在表单中使用那个URL  100
    6.10 使用URL 引入做最后一次重构  102
    第二部分 Web开发要素
    第7章 美化网站:布局、样式及其测试方法  106
    7.1 如何在功能测试中测试布局和样式  106
    7.2 使用CSS框架美化网站  109
    7.3 Django模板继承  111
    7.4 集成Bootstrap  112
    7.5 Django中的静态文件  114
    7.6 使用Bootstrap中的组件改进网站外观  116
    7.6.1 超大文本块  116
    7.6.2 大型输入框  116
    7.6.3 样式化表格  117
    7.7 使用自己编写的CSS  117
    7.8 补遗:collectstatic命令和其他静态目录  118
    7.9 没谈到的话题  121
    第8章 使用过渡网站测试部署  122
    8.1 TDD以及部署的危险区域  123
    8.2 一如既往,先写测试  124
    8.3 注册域名  126
    8.4 手动配置托管网站的服务器  126
    8.4.1 选择在哪里托管网站  127
    8.4.2 搭建服务器  127
    8.4.3 用户账户、SSH和权限  128
    8.4.4 安装Nginx  128
    8.4.5 解析过渡环境和线上环境所用的域名  129
    8.4.6 使用功能测试确认域名可用而且Nginx正在运行  130
    8.5 手动部署代码  130
    8.5.1 调整数据库的位置  131
    8.5.2 创建虚拟环境  133
    8.5.3 简单配置Nginx  135
    8.5.4 使用迁移创建数据库  137
    8.6 为部署到生产环境做好准备  138
    8.6.1 换用Gunicorn  138
    8.6.2 让Nginx伺服静态文件  139
    8.6.3 换用Unix套接字  140
    8.6.4 把DEBUG设为False,设置ALLOWED_HOSTS  141
    8.6.5 使用Upstart确保引导时启动Gunicorn  141
    8.6.6 保存改动:把Gunicorn 添加到requirements.txt  142
    8.7 自动化  143
    第9章 使用Fabric自动部署  147
    9.1 分析一个Fabric部署脚本  148
    9.2 试用部署脚本  151
    9.2.1 部署到线上服务器  153
    9.2.2 使用sed配置Nginx 和Gunicorn  155
    9.3 使用Git标签标注发布状态  155
    9.4 延伸阅读  156
    第10章 输入验证和测试的组织方式  158
    10.1 针对验证的功能测试:避免提交空待办事项  158
    10.1.1 跳过测试  159
    10.1.2 把功能测试分拆到多个文件中  160
    10.1.3 运行单个测试文件  162
    10.1.4 填充功能测试  163
    10.2 使用模型层验证  164
    10.2.1 重构单元测试,分拆成多个文件  164
    10.2.2 模型验证的单元测试和self.assertRaises上下文管理器  165
    10.2.3 Django怪异的表现:保存时不验证数据  166
    10.3 在视图中显示模型验证错误  167
    10.4 Django模式:在渲染表单的视图中处理POST 请求  171
    10.4.1 重构:把new_item实现的功能移到view_list 中  172
    10.4.2 在view_list 视图中执行模型验证  174
    10.5 重构:去除硬编码的URL  176
    10.5.1 模板标签{% url %}  176
    10.5.2 重定向时使用get_absolute_url  177
    第11章 简单的表单  181
    11.1 把验证逻辑移到表单中  181
    11.1.1 使用单元测试探索表单API  182
    11.1.2 换用Django中的ModelForm类  183
    11.1.3 测试和定制表单验证  184
    11.2 在视图中使用这个表单  186
    11.2.1 在处理GET请求的视图中使用这个表单  187
    11.2.2 大量查找和替换  189
    11.3 在处理POST请求的视图中使用这个表单  191
    11.3.1 修改new_list视图的单元测试  191
    11.3.2 在视图中使用这个表单  192
    11.3.3 使用这个表单在模板中显示错误消息  193
    11.4 在其他视图中使用这个表单  194
    11.5 使用表单自带的save方法  196
    第12章 高级表单  199
    12.1 针对重复待办事项的功能测试  199
    12.1.1 在模型层禁止重复  200
    12.1.2 题外话:查询集合排序和字符串表示形式  202
    12.1.3 重写旧模型测试  204
    12.1.4 保存时确实会显示完整性错误  205
    12.2 在视图层试验待办事项重复验证  206
    12.3 处理唯一性验证的复杂表单  207
    12.4 在清单视图中使用ExistingListItemForm  209
    第13章 试探JavaScript  213
    13.1 从功能测试开始  213
    13.2 安装一个基本的JavaScript 测试运行程序  214
    13.3 使用jQuery 和
    固件元素  217
    13.4 为想要实现的功能编写JavaScript单元测试  219
    13.5 JavaScript测试在TDD循环中的位置  221
    13.6 经验做法:onload样板代码和命名空间  222
    13.7 一些缺憾  223
    第14章 部署新代码  224
    14.1 部署到过渡服务器  224
    14.2 部署到线上服务器  225
    14.3 如果看到数据库错误该怎么办  225
    14.4 总结:为这次新发布打上Git 标签  225
    第三部分 高级话题
    第15章 用户认证、集成第三方插件以及JavaScript模拟技术的使用  228
    15.1 Mozilla Persona(BrowserID)  229
    15.2 探索性编程(又名“探究”)  229
    15.2.1 为此次探究新建一个分支  230
    15.2.2 前端和JavaScript代码  230
    15.2.3 Browser-ID协议  231
    15.2.4 服务器端:自定义认证机制  232
    15.3 去掉探究代码  237
    15.3.1 常用Selenium技术:显式等待  240
    15.3.2 删除探究代码  241
    15.4 涉及外部组件的JavaScript单元测试:首次使用模拟技术  242
    15.4.1 整理:全站共用的静态文件夹  242
    15.4.2 什么是模拟技术,为什么要模拟,模拟什么  244
    15.4.3 命名空间  244
    15.4.4 在initialize函数的单元测试中使用一个简单的驭件  245
    15.4.5 高级模拟技术  250
    15.4.6 检查参数的调用  253
    15.4.7 QUnit 中的setup和teardown函数,以及Ajax请求测试  255
    15.4.8 深层嵌套回调函数和测试异步代码  259
    第16章 服务器端认证,在Python中使用模拟技术  262
    16.1 探究登录视图  262
    16.2 在Python代码中使用模拟技术  263
    16.2.1 通过模拟authenticate函数测试视图  263
    16.2.2 确认视图确实登录了用户  266
    16.3 模拟网络请求,去除自定义认证后台中的探究代码  270
    16.3.1 一个if 语句需要一个测试  270
    16.3.2 在类上使用patch修饰器  272
    16.3.3 进行布尔值比较时要留意驭件  275
    16.3.4 需要时创建用户  276
    16.3.5 get_user方法  277
    16.4 一个最简单的自定义用户模型  279
    16.4.1 稍微有点儿失望  280
    16.4.2 把测试当作文档  281
    16.4.3 用户已经通过认证  282
    16.5 关键时刻:功能测试能通过吗  283
    16.6 完善功能测试,测试退出功能  284
    第17章 测试固件、日志和服务器端调试  287
    17.1 事先创建好会话,跳过登录过程  287
    17.2 实践是检验真理的唯一标准:在过渡服务器中捕获最后的问题  290
    17.2.1 设置日志  291
    17.2.2 修正Persona引起的这个问题  293
    17.3 在过渡服务器中管理测试数据库  295
    17.3.1 创建会话的Django管理命令  295
    17.3.2 让功能测试在服务器上运行管理命令  296
    17.3.3 使用subprocess模块完成额外的工作  298
    17.4 集成日志相关的代码  301
    17.5 小结  304
    第18章 完成“My Lists”页面:由外而内的TDD  305
    18.1 对立技术:“由内而外”  305
    18.2 为什么选择使用“由外而内”  306
    18.3 “My Lists”页面的功能测试  306
    18.4 外层:表现层和模板  307
    18.5 下移一层到视图函数(控制器)  308
    18.6 使用由外而内技术,再让一个测试通过  309
    18.6.1 快速重组模板的继承层级  309
    18.6.2 使用模板设计API  310
    18.6.3 移到下一层:视图向模板中传入什么  311
    18.7 视图层的下一个需求:新建清单时应该记录属主  312
    18.8 下移到模型层  313
    第19章 测试隔离和“倾听测试的心声”  318
    19.1 重温抉择时刻:视图层依赖于尚未编写的模型代码  318
    19.2 首先尝试使用驭件实现隔离  319
    19.3 倾听测试的心声:丑陋的测试表明需要重构  322
    19.4 以完全隔离的方式重写视图测试  323
    19.4.1 为了新测试的健全性,保留之前的整合测试组件  323
    19.4.2 完全隔离的新测试组件  324
    19.4.3 站在协作者的角度思考问题  324
    19.5 下移到表单层  328
    19.6 下移到模型层  332
    19.7 关键时刻,以及使用模拟技术的风险  335
    19.8 把层与层之间的交互当作“合约”  336
    19.8.1 找出隐形合约  337
    19.8.2 修正由于疏忽导致的问题  338
    19.9 还缺一个测试  340
    19.10 清理:保留哪些整合测试  340
    19.10.1 删除表单层多余的代码  340
    19.10.2 删除以前实现的视图  341
    19.10.3 删除视图层多余的代码  342
    19.11 总结:什么时候编写隔离测试,什么时候编写整合测试  343
    19.11.1 以复杂度为准则  344
    19.11.2 两种测试都要写吗  344
    19.11.3 继续前行  345
    第20章 持续集成  346
    20.1 安装Jenkins  346
    20.1.1 Jenkins的安全配置  348
    20.1.2 添加需要的插件  348
    20.2 设置项目  350
    20.3 第一次构建  351
    20.4 设置虚拟显示器,让功能测试能在无界面的环境中运行  353
    20.5 截图  355
    20.6 一个常见的Selenium问题:条件竞争  358
    20.7 使用PhantomJS运行QUnit JavaScript测试  361
    20.7.1 安装node  361
    20.7.2 在Jenkins中添加构建步骤  362
    20.8 CI 服务器能完成的其他操作  364
    第21章 简单的社会化功能、页面模式,以及练习  365
    21.1 有多个用户以及使用addCleanup 的功能测试  365
    21.2 实现Selenium交互等待模式  367
    21.3 页面模式  368
    21.4 扩展功能测试测试第二个用户和“My Lists”页面  371
    21.5 留给读者的练习  373
    第22章 测试运行速度的快慢和炽热的岩浆  375
    22.1 正题:单元测试除了运行速度超快之外还有其他优势  376
    22.1.1 测试运行得越快,开发速度越快  376
    22.1.2 神赐的心流状态  377
    22.1.3 速度慢的测试经常不想运行,导致代码变坏  377
    22.1.4 现在还行,不过随着时间推移,整合测试会变得越来越慢  377
    22.1.5 别只听我一个人说  377
    22.1.6 单元测试能驱使我们实现好的设计  377
    22.2 纯粹的单元测试有什么问题  378
    22.2.1 隔离的测试难读也难写  378
    22.2.2 隔离测试不会自动测试集成情况  378
    22.2.3 单元测试几乎不能捕获意料之外的问题  378
    22.2.4 使用驭件的测试可能和实现方式联系紧密  378
    22.2.5 这些问题都可以解决  379
    22.3 合题:我们到底想从测试中得到什么  379
    22.3.1 正确性  379
    22.3.2 简洁可维护的代码  379
    22.3.3 高效的工作流程  379
    22.3.4 根据所需的优势评估测试  379
    22.4 架构方案  380
    22.4.1 端口和适配器(或六边形、简洁)架构  380
    22.4.2 函数式核心,命令式外壳  381
    22.5 小结  381
    遵从测试山羊的教诲  383
    附录A PythonAnywhere  385
    附录B 基于类的Django 视图  388
    附录C 使用Ansible配置服务器  398
    附录D 测试数据库迁移  402
    附录E 接下来做什么  407
    附录F 速查表  411
    附录G 参考书目  415
    作者简介  416
    封面介绍  416
查看详情
相关图书 / 更多
Python Web开发:测试驱动方法
Python和PySpark数据分析
(加)乔纳森·里乌
Python Web开发:测试驱动方法
Python机器学习入门与实践 从深度学习到生成对抗网络GAN 深入浅出GAN生成对抗网络 实战gan TensorFlow与Keras 人工智能技术书籍
(日)大关真之
Python Web开发:测试驱动方法
Python语言程序设计
王刚
Python Web开发:测试驱动方法
Python代码编程 学科项目式编程(六年级)
冯建刚
Python Web开发:测试驱动方法
Python机器学习 : 核心技术与开发实战 周志华西瓜书机器学习实战伴侣书
[美]普拉提克·乔希 著;李现伟 译者;颉腾文化 出品;阿尔伯托·阿尔塔桑切斯(美);曾小健
Python Web开发:测试驱动方法
Python语言程序设计(微课版)
宁爱军 何志永
Python Web开发:测试驱动方法
Python数据分析从入门到精通(第2版)
明日科技
Python Web开发:测试驱动方法
Python数据分析与挖掘
齐福利
Python Web开发:测试驱动方法
Python基础与应用(互联网+教育新形态一体化系列教材)
李喆时、谢家立、赵丽 编
Python Web开发:测试驱动方法
Python数据分析与可视化项目实战
王振丽
Python Web开发:测试驱动方法
Python爬虫从菜鸟到高手
李宁
Python Web开发:测试驱动方法
Python程序设计基础教程
\"孙海龙 王济军\
您可能感兴趣 / 更多
Python Web开发:测试驱动方法
最后一个人(《时代》杂志评其为“十大后世界末日小说”之一)
[英]玛丽·雪莱 著;新华先锋 出品
Python Web开发:测试驱动方法
不能赢的辩护【当当定制“检方证物线索卡*5】金匕首奖得主史蒂夫·卡瓦纳推理神作
[英]史蒂夫·卡瓦纳 著;酷威文化 出品
Python Web开发:测试驱动方法
谢林与现代欧洲哲学
[英]安德鲁·鲍伊
Python Web开发:测试驱动方法
科普勒斯顿阿哲学史11
[英]弗雷德里克·科普勒斯顿 后浪
Python Web开发:测试驱动方法
构建底层逻辑(用底层逻辑武装大脑,实现思维能力的跃升)
[英]艾萨克·瓦茨 译者;卢东民
Python Web开发:测试驱动方法
哈利·波特 一段魔法史
[英]大英图书馆 编;向寻 冬翌 译
Python Web开发:测试驱动方法
管教的常识:直面孩子成长的88个问题
[英]苏珊·伊莎克丝 译者;李江艳
Python Web开发:测试驱动方法
卢梭与德国观念论:自由、依赖和必然
[英]大卫·詹姆斯(David James) 著;吴珊珊 译
Python Web开发:测试驱动方法
点读版恐龙妙想国 动物妙想国系列全4册 3-6岁儿童趣味科普绘本爆笑动物认知启蒙图画书三角龙梁龙剑龙霸王龙恐龙科普故事幼儿园想象力绘本睡前故事书
[英]露丝·西蒙斯/著 (英)阿列克谢·彼特斯科夫/绘 邢培健 译
Python Web开发:测试驱动方法
凤凰文库设计理论研究系列-杜威与设计:实用主义的设计视角研究
[英]布莱恩·S.迪克森 著;王成思 译;汪星宇
Python Web开发:测试驱动方法
钢琴技巧实践
[英]默里·麦克拉克伦(Murray McLachlan) 著;孙晓雪 译
Python Web开发:测试驱动方法
野蔷薇村的故事(全8册):40周年官方特别纪念版
[英]吉尔·巴克莲 著;[中]马爱农 译