Python测试驱动开发使用Django、Selenium和JavaScript进行Web编程.第2版 ([英]哈利·J.W. 帕西瓦尔,安道译) (z-library.sk, 1lib.sk, z-lib.sk)
Author: [英]哈利·J.W. 帕西瓦尔, 安道译
Python
本书从最基础的知识开始,讲解Web 开发的整个流程,展示如何使用Python 做测试驱动开发。本书由三个部分组成。第一部分介绍了测试驱动开发和Django 的基础知识,并在每个阶段进行严格的单元测试。第二部分讨论了Web 开发要素,探讨了Web 开发过程中不可避免的问题,以及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方认证系统、Ajax、测试固件以及持续集成等。 第2 版全部使用Python 3,并针对新版Django 全面升级,介绍了由外而内的测试驱动开发流程。本书适合Web 开发人员阅读。
📄 File Format:
PDF
💾 File Size:
11.2 MB
10
Views
0
Downloads
0.00
Total Donations
📄 Text Preview (First 20 pages)
ℹ️
Registered users can read the full content for free
Register as a Gaohf Library member to read the complete e-book online for free and enjoy a better reading experience.
📄 Page
1
(This page has no text content)
📄 Page
2
(This page has no text content)
📄 Page
3
图灵社区的电子书没有采用专有客 户端,您可以在任意设备上,用自 己喜欢的浏览器和PDF阅读器进行 阅读。 但您购买的电子书仅供您个人使用, 未经授权,不得进行传播。 我们愿意相信读者具有这样的良知 和觉悟,与我们共同保护知识产权。 如果购买者有侵权行为,我们可能 对该用户实施包括但不限于关闭该 帐号等维权措施,并可能追究法律 责任。
📄 Page
4
图 灵 程 序 设 计 丛 书 人 民 邮 电 出 版 社 北 京 Test-Driven Development with Python, Second Edition [英]哈利·J.W. 帕西瓦尔 著 安道 译 Python测试驱动开发: Beijing • Boston • Farnham • Sebastopol • Tokyo O’Reilly Media, Inc.授权人民邮电出版社出版 使用Django、Selenium和JavaScript 进行Web编程(第2版)
📄 Page
5
内 容 提 要 本书从最基础的知识开始,讲解 Web 开发的整个流程,展示如何使用 Python 做测试驱动开 发。本书由三个部分组成。第一部分介绍了测试驱动开发和 Django 的基础知识,并在每个阶段进 行严格的单元测试。第二部分讨论了 Web 开发要素,探讨了 Web 开发过程中不可避免的问题,以 及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方认证系统、 Ajax、测试固件以及持续集成等。 第 2 版全部使用 Python 3,并针对新版 Django 全面升级,介绍了由外而内的测试驱动开发流程。 本书适合 Web 开发人员阅读。 定价:119.00元 读者服务热线:(010)51095186转600 印装质量热线:(010)81055316 反盗版热线:(010)81055315 广告经营许可证:京东工商广登字 20170147 号 著 [英] 哈利 • J.W. 帕西瓦尔 译 安 道 责任编辑 朱 巍 执行编辑 夏静文 责任印制 周昇亮 人民邮电出版社出版发行 北京市丰台区成寿寺路11号 邮编 100164 电子邮件 315@ptpress.com.cn 网址 http://www.ptpress.com.cn 北京 印刷 开本:800×1000 1/16 印张:30.25 字数:721千字 2018年 7 月第 1 版 印数:1 — 3 000册 2018年 7 月北京第 1 次印刷 著作权合同登记号 图字:01-2018-3460号 ◆ ◆ ◆
📄 Page
6
iii 版权声明 © 2017 by Harry Percival. Simplified Chinese Edition, jointly published by O’Reilly Media, Inc. and Posts & Telecom Press, 2018. Authorized translation of the English edition, 2014 O’Reilly Media, Inc., the owner of all rights to publish and sell the same. All rights reserved including the rights of reproduction in whole or in part in any form. 英文原版由 O’Reilly Media, Inc. 出版,2017。 简体中文版由人民邮电出版社出版, 2018。英文原版的翻译得到 O’Reilly Media, Inc. 的 授权。此简体中文版的出版和销售得到出版权和销售权的所有者——O’Reilly Media, Inc. 的许可。 版权所有,未得书面许可,本书的任何部分和全部不得以任何形式重制。 图灵社区会员 JeremyTowne(1747552250@qq.com) 专享 尊重版权
📄 Page
7
O’Reilly Media 通过图书、杂志、在线服务、调查研究和会议等方式传播创新知识。 自 1978 年开始,O’Reilly 一直都是前沿发展的见证者和推动者。超级极客们正在开创 着未来,而我们关注真正重要的技术趋势——通过放大那些“细微的信号”来刺激社 会对新科技的应用。作为技术社区中活跃的参与者,O’Reilly 的发展充满了对创新的 倡导、创造和发扬光大。 O’Reilly 为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组 织了影响深远的开放源代码峰会,以至于开源软件运动以此命名;创立了 Make 杂志, 从而成为 DIY 革命的主要先锋;公司一如既往地通过多种形式缔结信息与人的纽带。 O’Reilly 的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖,共同描绘出开创 新产业的革命性思想。作为技术人士获取信息的选择,O’Reilly 现在还将先锋专家的 知识传递给普通的计算机用户。无论是通过书籍出版、在线服务或者面授课程,每一 项 O’Reilly 的产品都反映了公司不可动摇的理念——信息是激发创新的力量。 业界评论 “O’Reilly Radar 博客有口皆碑。” ——Wired “O’Reilly 凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。” ——Business 2.0 “O’Reilly Conference 是聚集关键思想领袖的绝对典范。” ——CRN “一本 O’Reilly 的书就代表一个有用、有前途、需要学习的主题。” ——Irish Times “Tim 是位特立独行的商人,他不光放眼于最长远、最广阔的视野,并且切实地按照 Yogi Berra 的建议去做了:‘如果你在路上遇到岔路口,走小路(岔路)。’回顾过去, Tim 似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。” ——Linux Journal O’Reilly Media, Inc.介绍
📄 Page
8
v 目录 前言 .........................................................................................................................................................xv 准备工作和应具备的知识 ................................................................................................................xxi 配套视频 ...........................................................................................................................................xxviii 致谢 ......................................................................................................................................................xxix 第一部分 TDD 和 Django 基础 第 1 章 使用功能测试协助安装 Django ......................................................................................2 1.1 遵从测试山羊的教诲,没有测试什么也别做 .........................................................................2 1.2 让Django运行起来 .....................................................................................................................4 1.3 创建Git仓库 ................................................................................................................................6 第 2 章 使用 unittest 模块扩展功能测试 ................................................................................10 2.1 使用功能测试驱动开发一个最简可用的应用 .......................................................................10 2.2 Python标准库中的unittest模块 ............................................................................................12 2.3 提交 ...........................................................................................................................................14 第 3 章 使用单元测试测试简单的首页 ......................................................................................16 3.1 第一个Django应用,第一个单元测试 ...................................................................................16 3.2 单元测试及其与功能测试的区别 ...........................................................................................17 3.3 Django中的单元测试 ...............................................................................................................18 3.4 Django中的MVC、URL和视图函数 ......................................................................................19 3.5 终于可以编写一些应用代码了 ...............................................................................................20 3.6 urls.py ........................................................................................................................................22 3.7 为视图编写单元测试 ...............................................................................................................23 图灵社区会员 JeremyTowne(1747552250@qq.com) 专享 尊重版权
📄 Page
9
vi | 目录 第 4 章 测试(及重构)的目的 ...................................................................................................28 4.1 编程就像从井里打水 ...............................................................................................................28 4.2 使用Selenium测试用户交互 ....................................................................................................30 4.3 遵守“不测试常量”规则,使用模板解决这个问题 ...........................................................32 4.3.1 使用模板重构 ..............................................................................................................33 4.3.2 Django测试客户端 .......................................................................................................35 4.4 关于重构 ...................................................................................................................................37 4.5 接着修改首页 ...........................................................................................................................38 4.6 总结:TDD流程 .......................................................................................................................39 第 5 章 保存用户输入:测试数据库 ..........................................................................................42 5.1 编写表单,发送POST请求 .....................................................................................................42 5.2 在服务器中处理POST请求 .....................................................................................................45 5.3 把Python变量传入模板中渲染................................................................................................46 5.4 事不过三,三则重构 ...............................................................................................................50 5.5 Django ORM和第一个模型 .....................................................................................................51 5.5.1 第一个数据库迁移 ......................................................................................................53 5.5.2 测试向前走得挺远 ......................................................................................................53 5.5.3 添加新字段就要创建新迁移 ......................................................................................54 5.6 把POST请求中的数据存入数据库 .........................................................................................55 5.7 处理完POST请求后重定向 .....................................................................................................57 5.8 在模板中渲染待办事项 ...........................................................................................................59 5.9 使用迁移创建生产数据库 .......................................................................................................61 5.10 回顾 .........................................................................................................................................64 第 6 章 改进功能测试:确保隔离,去掉含糊的休眠 ...........................................................66 6.1 确保功能测试之间相互隔离 ...................................................................................................66 6.2 升级Selenium和Geckodriver ....................................................................................................70 6.3 隐式等待、显式等待和含糊的time.sleep ............................................................................70 第 7 章 步步为营 ..............................................................................................................................75 7.1 必要时做少量的设计 ...............................................................................................................75 7.1.1 不要预先做大量设计 ..................................................................................................75 7.1.2 YAGNI ..........................................................................................................................76 7.1.3 REST(式) .................................................................................................................76 7.2 使用TDD实现新设计 ...............................................................................................................77 7.3 确保出现回归测试 ...................................................................................................................78 7.4 逐步迭代,实现新设计 ...........................................................................................................80 7.5 自成一体的第一步:新的URL ...............................................................................................81 7.5.1 一个新URL ..................................................................................................................82 图灵社区会员 JeremyTowne(1747552250@qq.com) 专享 尊重版权
📄 Page
10
目录 | vii 7.5.2 一个新视图函数 ..........................................................................................................82 7.6 变绿了吗?该重构了 ...............................................................................................................84 7.7 再迈一小步:一个新模板,用于查看清单 ...........................................................................84 7.8 第三小步:用于添加待办事项的URL ...................................................................................86 7.8.1 用来测试新建清单的测试类 ......................................................................................87 7.8.2 用于新建清单的URL和视图 ......................................................................................88 7.8.3 删除当前多余的代码和测试 ......................................................................................89 7.8.4 出现回归!让表单指向刚添加的新URL ..................................................................89 7.9 下定决心,调整模型 ...............................................................................................................90 7.9.1 外键关系 ......................................................................................................................92 7.9.2 根据新模型定义调整其他代码 ..................................................................................93 7.10 每个列表都应该有自己的URL .............................................................................................95 7.10.1 捕获URL中的参数...................................................................................................96 7.10.2 按照新设计调整new_list视图 ...............................................................................97 7.11 功能测试又检测到回归 .........................................................................................................98 7.12 还需要一个视图,把待办事项加入现有清单 .......................................................................... 99 7.12.1 小心霸道的正则表达式...........................................................................................99 7.12.2 最后一个新URL.....................................................................................................100 7.12.3 最后一个新视图.....................................................................................................101 7.12.4 直接测试响应上下文对象.....................................................................................102 7.13 使用URL引入做最后一次重构 ...........................................................................................103 第二部分 Web 开发要素 第 8 章 美化网站:布局、样式及其测试方法 ......................................................................108 8.1 如何在功能测试中测试布局和样式 .....................................................................................108 8.2 使用CSS框架美化网站 ..........................................................................................................111 8.3 Django模板继承 .....................................................................................................................112 8.4 集成Bootstrap .........................................................................................................................114 8.5 Django中的静态文件 .............................................................................................................115 8.6 使用Bootstrap中的组件改进网站外观 .................................................................................117 8.6.1 超大文本块 ................................................................................................................118 8.6.2 大型输入框 ................................................................................................................118 8.6.3 样式化表格 ................................................................................................................118 8.7 使用自己编写的CSS ..............................................................................................................118 8.8 补遗:collectstatic命令和其他静态目录 ........................................................................120 8.9 没谈到的话题 .........................................................................................................................122
📄 Page
11
viii | 目录 第 9 章 使用过渡网站测试部署 .................................................................................................123 9.1 TDD以及部署的危险区域 .....................................................................................................124 9.2 一如既往,先写测试 .............................................................................................................125 9.3 注册域名 .................................................................................................................................127 9.4 手动配置托管网站的服务器 .................................................................................................127 9.4.1 选择在哪里托管网站 ................................................................................................127 9.4.2 搭建服务器 ................................................................................................................128 9.4.3 用户账户、SSH和权限 .............................................................................................128 9.4.4 安装Nginx ..................................................................................................................128 9.4.5 安装Python 3.6 ...........................................................................................................129 9.4.6 解析过渡环境和线上环境所用的域名 ....................................................................130 9.4.7 使用功能测试确认域名可用而且Nginx正在运行 .................................................................130 9.5 手动部署代码 .........................................................................................................................130 9.5.1 调整数据库的位置 ....................................................................................................131 9.5.2 手动创建虚拟环境,使用requirements.txt ..............................................................133 9.5.3 简单配置Nginx ..........................................................................................................134 9.5.4 使用迁移创建数据库 ................................................................................................136 9.6 手动部署大功告成 .................................................................................................................137 第 10 章 为部署到生产环境做好准备 ......................................................................................139 10.1 换用Gunicorn ........................................................................................................................139 10.2 让Nginx伺服静态文件 .........................................................................................................140 10.3 换用Unix套接字 ...................................................................................................................141 10.4 把DEBUG设为False,设置ALLOWED_HOSTS............................................................................142 10.5 使用Systemd确保引导时启动Gunicorn ..............................................................................143 10.6 考虑自动化 ...........................................................................................................................144 10.7 保存进度 ...............................................................................................................................147 第 11 章 使用 Fabric 自动部署 ..................................................................................................148 11.1 分析一个Fabric部署脚本 .....................................................................................................149 11.1.1 分析一个Fabric部署脚本 ......................................................................................149 11.1.2 使用Git拉取源码 ....................................................................................................150 11.1.3 更新settings.py .......................................................................................................151 11.1.4 更新虚拟环境 .........................................................................................................151 11.1.5 需要时迁移数据库 .................................................................................................152 11.2 试用部署脚本 .......................................................................................................................152 11.2.1 部署到线上服务器 .................................................................................................154 11.2.2 使用sed配置Nginx和Gunicorn ..............................................................................155 11.3 使用Git标签标注发布状态 ..................................................................................................157 11.4 延伸阅读 ...............................................................................................................................157
📄 Page
12
目录 | ix 第 12 章 输入验证和测试的组织方式 ......................................................................................159 12.1 针对验证的功能测试:避免提交空待办事项 ........................................................................ 159 12.1.1 跳过测试.................................................................................................................160 12.1.2 把功能测试分拆到多个文件中.............................................................................161 12.1.3 运行单个测试文件.................................................................................................163 12.2 功能测试新工具:通用显式等待辅助方法 .......................................................................164 12.3 补完功能测试 .......................................................................................................................167 12.4 重构单元测试,分拆成多个文件 .......................................................................................168 第 13 章 数据库层验证 ................................................................................................................171 13.1 模型层验证 ...........................................................................................................................172 13.1.1 self.assertRaises上下文管理器 ........................................................................172 13.1.2 Django怪异的表现:保存时不验证数据 .............................................................173 13.2 在视图中显示模型验证错误 ...............................................................................................173 13.3 Django模式:在渲染表单的视图中处理POST请求 .........................................................177 13.3.1 重构:把new_item实现的功能移到view_list中 ................................................178 13.3.2 在view_list视图中执行模型验证 .......................................................................180 13.4 重构:去除硬编码的URL ...................................................................................................182 13.4.1 模板标签{% url %} ...............................................................................................182 13.4.2 重定向时使用get_absolute_url ..........................................................................183 第 14 章 简单的表单 .....................................................................................................................186 14.1 把验证逻辑移到表单中 .......................................................................................................186 14.1.1 使用单元测试探索表单API ..................................................................................187 14.1.2 换用Django中的ModelForm类 ...............................................................................188 14.1.3 测试和定制表单验证.............................................................................................189 14.2 在视图中使用这个表单 .......................................................................................................191 14.2.1 在处理GET请求的视图中使用这个表单 .............................................................191 14.2.2 大量查找和替换.....................................................................................................192 14.3 在处理POST请求的视图中使用这个表单 .........................................................................194 14.3.1 修改new_list视图的单元测试 .............................................................................195 14.3.2 在视图中使用这个表单.........................................................................................196 14.3.3 使用这个表单在模板中显示错误消息.................................................................196 14.4 在其他视图中使用这个表单 ...............................................................................................197 14.4.1 定义辅助方法,简化测试.....................................................................................197 14.4.2 意想不到的好处:HTML5自带的客户端验证 ...................................................199 14.5 值得鼓励 ...............................................................................................................................201 14.6 这难道不是浪费时间吗 .......................................................................................................201 14.7 使用表单自带的save方法 ...................................................................................................202 图灵社区会员 JeremyTowne(1747552250@qq.com) 专享 尊重版权
📄 Page
13
x | 目录 第 15 章 高级表单 .........................................................................................................................205 15.1 针对重复待办事项的功能测试 ...........................................................................................205 15.1.1 在模型层禁止重复.................................................................................................206 15.1.2 题外话:查询集合排序和字符串表示形式.........................................................208 15.1.3 重写旧模型测试.....................................................................................................210 15.1.4 保存时确实会显示完整性错误.............................................................................211 15.2 在视图层试验待办事项重复验证 .......................................................................................212 15.3 处理唯一性验证的复杂表单 ...............................................................................................213 15.4 在清单视图中使用ExistingListItemForm ........................................................................215 15.5 小结:目前所学的Django测试知识 ...................................................................................217 第 16 章 试探 JavaScript ............................................................................................................219 16.1 从功能测试开始 ...................................................................................................................219 16.2 安装一个基本的JavaScript测试运行程序 ..........................................................................221 16.3 使用jQuery和<div>固件元素 ..............................................................................................223 16.4 为想要实现的功能编写JavaScript单元测试 ....................................................................225 16.5 固件、执行顺序和全局状态:JavaScript测试的重大挑战 ..............................................227 16.5.1 使用console.log打印调试信息 ...........................................................................227 16.5.2 使用初始化函数精确控制执行时间.....................................................................229 16.6 经验做法:onload样板代码和命名空间 ...........................................................................230 16.7 JavaScript测试在TDD循环中的位置 ..................................................................................232 16.8 一些缺憾 ...............................................................................................................................232 第 17 章 部署新代码 .....................................................................................................................234 17.1 部署到过渡服务器 ...............................................................................................................234 17.2 部署到线上服务器 ...............................................................................................................235 17.3 如果看到数据库错误该怎么办 ...........................................................................................235 17.4 总结:为这次新发布打上Git标签 ......................................................................................235 第三部分 高级话题 第 18 章 用户身份验证、探究及去掉探究代码 ....................................................................238 18.1 无密码验证 ...........................................................................................................................238 18.2 探索性编程(又名“探究”) ...........................................................................................239 18.2.1 为此次探究新建一个分支.....................................................................................239 18.2.2 前端登录UI ............................................................................................................240 18.2.3 从Django中发出邮件 .............................................................................................240 18.2.4 使用环境变量,避免源码中出现机密信息.........................................................242 18.2.5 在数据库中存储令牌.............................................................................................243 18.2.6 自定义身份验证模型.............................................................................................243 18.2.7 结束自定义Django身份验证功能 .........................................................................244
📄 Page
14
目录 | xi 18.3 去掉探究代码 .......................................................................................................................248 18.4 一个极简的自定义用户模型 ...............................................................................................251 18.5 令牌模型:把电子邮件地址与唯一的ID关联起来 ...........................................................254 第 19 章 使用驭件测试外部依赖或减少重复 ........................................................................257 19.1 开始之前布好基本管道 .......................................................................................................257 19.2 自己动手模拟(打猴子补丁) ...........................................................................................258 19.3 Python的模拟库....................................................................................................................261 19.3.1 使用unittest.patch ..............................................................................................261 19.3.2 让测试向前迈一小步.............................................................................................263 19.3.3 测试Django消息框架 .............................................................................................263 19.3.4 在HTML中添加消息 .............................................................................................265 19.3.5 构建登录URL.........................................................................................................266 19.3.6 确认给用户发送了带有令牌的链接.....................................................................267 19.4 去除自定义的身份验证后端中的探究代码 .......................................................................269 19.4.1 一个if语句需要一个测试 .....................................................................................269 19.4.2 get_user方法 .........................................................................................................272 19.4.3 在登录视图中使用自定义的验证后端.................................................................273 19.5 使用驭件的另一个原因:减少重复 ...................................................................................274 19.5.1 使用驭件的返回值.................................................................................................277 19.5.2 在类一级上打补丁.................................................................................................278 19.6 关键时刻:功能测试能通过吗 ...........................................................................................279 19.7 理论上正常,那么实际呢 ...................................................................................................281 19.8 完善功能测试,测试退出功能 ...........................................................................................283 第 20 章 测试固件和一个显式等待装饰器 .............................................................................285 20.1 事先创建好会话,跳过登录过程 .......................................................................................285 20.2 显式等待辅助方法最终版:wait装饰器 ...........................................................................290 第 21 章 服务器端调试技术 .......................................................................................................293 21.1 实践是检验真理的唯一标准:在过渡服务器中捕获最后的问题 ....................................293 21.2 在服务器上通过环境变量设定机密信息 ...........................................................................295 21.3 调整功能测试,以便通过POP3测试真实的电子邮件......................................................296 21.4 在过渡服务器中管理测试数据库 .......................................................................................299 21.4.1 创建会话的Django管理命令 .................................................................................300 21.4.2 让功能测试在服务器上运行管理命令.................................................................301 21.4.3 直接在Python代码中使用Fabric ...........................................................................302 21.4.4 回顾:在本地服务器和过渡服务器中创建会话的方式.....................................303 21.5 集成日志相关的代码 ...........................................................................................................304 21.6 小结 .......................................................................................................................................305 图灵社区会员 JeremyTowne(1747552250@qq.com) 专享 尊重版权
📄 Page
15
xii | 目录 第 22 章 完成“My Lists”页面:由外而内的 TDD ...........................................................306 22.1 对立技术:“由内而外” ...................................................................................................306 22.2 为什么选择使用“由外而内” ...........................................................................................307 22.3 “My Lists”页面的功能测试.............................................................................................307 22.4 外层:表现层和模板 ...........................................................................................................309 22.5 下移一层到视图函数(控制器) .......................................................................................309 22.6 使用由外而内技术,再让一个测试通过 ...........................................................................310 22.6.1 快速重组模板的继承层级.....................................................................................311 22.6.2 使用模板设计API ..................................................................................................311 22.6.3 移到下一层:视图向模板中传入什么.................................................................313 22.7 视图层的下一个需求:新建清单时应该记录属主 ...............................................................313 22.8 下移到模型层 .......................................................................................................................315 第 23 章 测试隔离和“倾听测试的心声” ...............................................................................319 23.1 重温抉择时刻:视图层依赖于尚未编写的模型代码 .......................................................319 23.2 首先尝试使用驭件实现隔离 ...............................................................................................320 23.3 倾听测试的心声:丑陋的测试表明需要重构 ........................................................................ 323 23.4 以完全隔离的方式重写视图测试 .......................................................................................323 23.4.1 为了新测试的健全性,保留之前的整合测试组件.............................................324 23.4.2 完全隔离的新测试组件.........................................................................................324 23.4.3 站在协作者的角度思考问题.................................................................................324 23.5 下移到表单层 .......................................................................................................................329 23.6 下移到模型层 .......................................................................................................................332 23.7 关键时刻,以及使用模拟技术的风险 ...............................................................................335 23.8 把层与层之间的交互当作“合约” ...................................................................................336 23.8.1 找出隐形合约.........................................................................................................337 23.8.2 修正由于疏忽导致的问题.....................................................................................338 23.9 还缺一个测试 .......................................................................................................................339 23.10 清理:保留哪些整合测试 .................................................................................................340 23.10.1 删除表单层多余的代码 .....................................................................................340 23.10.2 删除以前实现的视图 .........................................................................................341 23.10.3 删除视图层多余的代码 .....................................................................................342 23.11 总结:什么时候编写隔离测试,什么时候编写整合测试 ...........................................343 23.11.1 以复杂度为准则 .................................................................................................344 23.11.2 两种测试都要写吗 .............................................................................................344 23.11.3 继续前行 .............................................................................................................344 第 24 章 持续集成 .........................................................................................................................346 24.1 安装Jenkins ...........................................................................................................................346 24.2 配置Jenkins ...........................................................................................................................347 图灵社区会员 JeremyTowne(1747552250@qq.com) 专享 尊重版权
📄 Page
16
目录 | xiii 24.2.1 首次解锁.................................................................................................................348 24.2.2 现在建议安装的插件.............................................................................................348 24.2.3 配置管理员用户.....................................................................................................348 24.2.4 添加插件.................................................................................................................350 24.2.5 告诉Jenkins到哪里寻找Python 3和Xvfb ..............................................................350 24.2.6 设置HTTPS ............................................................................................................351 24.3 设置项目 ...............................................................................................................................351 24.4 第一次构建 ...........................................................................................................................352 24.5 设置虚拟显示器,让功能测试能在无界面的环境中运行 ................................................354 24.6 截图 .......................................................................................................................................356 24.7 如有疑问,增加超时试试 ...................................................................................................359 24.8 使用PhantomJS运行QUnit JavaScript测试 .......................................................................359 24.8.1 安装node .................................................................................................................359 24.8.2 在Jenkins中添加构建步骤.....................................................................................361 24.9 CI服务器能完成的其他操作 ...............................................................................................362 第 25 章 简单的社会化功能、页面模式以及练习 ...............................................................363 25.1 有多个用户以及使用addCleanup的功能测试 ....................................................................363 25.2 页面模式 ...............................................................................................................................365 25.3 扩展功能测试测试第二个用户和“My Lists”页面 ...........................................................367 25.4 留给读者的练习 ...................................................................................................................368 第 26 章 测试运行速度的快慢和炽热的岩浆 ........................................................................371 26.1 正题:单元测试除了运行速度超快之外还有其他优势 ....................................................372 26.1.1 测试运行得越快,开发速度越快.........................................................................372 26.1.2 神赐的心流状态.....................................................................................................372 26.1.3 经常不想运行速度慢的测试,导致代码变坏.....................................................373 26.1.4 现在还行,不过随着时间推移,整合测试会变得越来越慢.............................373 26.1.5 别只听我一个人说.................................................................................................373 26.1.6 单元测试能驱使我们实现好的设计.....................................................................373 26.2 纯粹的单元测试有什么问题 ...............................................................................................373 26.2.1 隔离的测试难读也难写.........................................................................................373 26.2.2 隔离测试不会自动测试集成情况.........................................................................374 26.2.3 单元测试几乎不能捕获意料之外的问题.............................................................374 26.2.4 使用驭件的测试可能和实现方式联系紧密.........................................................374 26.2.5 这些问题都可以解决.............................................................................................374 26.3 合题:我们到底想从测试中得到什么 ...............................................................................374 26.3.1 正确性.....................................................................................................................374 26.3.2 简洁可维护的代码.................................................................................................375 26.3.3 高效的工作流程.....................................................................................................375 26.3.4 根据所需的优势评估测试.....................................................................................375
📄 Page
17
xiv | 目录 26.4 架构方案 ...............................................................................................................................375 26.4.1 端口和适配器(或六边形、简洁)架构.............................................................376 26.4.2 函数式核心,命令式外壳.....................................................................................377 26.5 小结 .......................................................................................................................................377 遵从测试山羊的教诲........................................................................................................................379 附录 A PythonAnywhere ............................................................................................................381 附录 B 基于类的 Django 视图 ...................................................................................................385 附录 C 使用 Ansible 配置服务器 ..............................................................................................394 附录 D 测试数据库迁移 ...............................................................................................................398 附录 E 行为驱动开发 ...................................................................................................................403 附录 F 构建一个 REST API:JSON、Ajax 和 JavaScript 模拟技术 ...........................416 附录 G Django-Rest-Framework .............................................................................................433 附录 H 速查表 .................................................................................................................................443 附录 I 接下来做什么 ...................................................................................................................447 附录 J 示例源码 ............................................................................................................................451 参考书目 ..............................................................................................................................................453 作者简介 ..............................................................................................................................................454 封面介绍 ..............................................................................................................................................454 图灵社区会员 JeremyTowne(1747552250@qq.com) 专享 尊重版权
📄 Page
18
xv 前言 我试图通过这本书与世人分享我从黑客变成软件工程师的过程。本书主要介绍测试,但很 快你就会发现,除此之外还有很多其他内容。 感谢你阅读本书。 如果你购买了本书,我十分感激。如果你看的是免费在线版,我仍然要感谢你,因为你确 定这本书值得花时间来阅读。谁知道呢,说不定等你读完之后,会决定为自己或朋友买一 本纸质书。 如果你有任何评论、疑问或建议,希望你能写信告诉我。你可以通过电子邮件直接和我 联系,地址是 obeythetestinggoat@gmail.com;或者在 Twitter 上联系我,我的用户名是 @hjwp。你还可以访问本书的网站和博客(http://www.obeythetestinggoat.com/),以及邮 件列表(https://groups.google.com/forum/#!forum/obey-the-testing-goat-book)。 希望阅读本书能让你身心愉悦,就像我在写作本书时感到享受一样。 为什么要写一本关于测试驱动开发的书 我知道你会问:“你是谁,为什么要写这本书,我为什么要读这本书?” 我至今仍然处在编程事业的初期。人们说,不管从事什么工作,都要历经从新手到熟手的 过程,最终有可能成为大师。我要说的是,我最多算是个熟练的程序员。但我很幸运,在 事业的早期阶段就结识了一群测试驱动开发(Test-Driven Development,TDD)的狂热爱 好者,这对我的编程事业产生了极大影响,让我迫不及待地想和所有人分享这段经历。可 以说,我很积极地做出了最近这次转变,而且这段学习经历现在还历历在目,我希望能让 初学者感同身受。 我在开始学习 Python 时(看的是 Mark Pilgrim 写的 Dive Into Python),偶然知道了 TDD 的 概念。我当时就认为:“是的,我绝对知道这个概念的意义所在。”或许你第一次听说 TDD 时也有类似的反应吧。它听起来像是一个非常合理的方案,一个需要养成的非常好的习 惯——就像经常刷牙。
📄 Page
19
xvi | 前言 随后我做了第一个大型项目。你可能猜到了,有项目就会有客户,有最后期限,有很多事 情要做。于是,所有关于 TDD 的好想法都被抛诸脑后。 的确,这对项目没什么影响,对我也没影响。 但只是在初期如此。 一开始,我知道并不真的需要使用 TDD,因为我做的是个小网站,手动检查就能轻易测试 出是否能用。在这儿点击链接,在那儿选中下拉菜单选项,就应该有预期的效果,很简单。 编写整套测试程序听起来似乎要花费很长时间,而且经过整整三周成熟的代码编写经历, 我自负地认为自己已经成为一名出色的程序员了,我能顺利完成这个项目,这没什么难度。 随后,项目变得复杂得可怕,这很快暴露了我的经验不足。 项目不断变大。系统的不同部分之间要开始相互依赖。我尽量遵守良好的开发原则,例如 “不要自我重复”(Don’t Repeat Yourself,DRY),却被带进了一片危险地带。我很快就用 到了多重继承,类的继承有八个层级深,还用到了 eval 语句。 我不敢修改代码,不再像以前一样知道什么依赖什么,也不知道修改某处的代码可能会导 致什么后果。噢,天呐,我觉得那部分继承自这里,不,不是继承,是重新定义了,可是 却依赖那个类变量。嗯,好吧,如果我再次重定义以前重定义的部分,应该就可以了。我 会检查的,可是检查变得更难了。网站中的内容越来越多,手动点击变得不切实际了。最 好别动这些能运行的代码,不要重构,就这么凑合吧。 很快,代码就变得像一团麻,丑陋不堪。开发新功能变得很痛苦。 在此之后不久,我幸运地在 Resolver Systems 公司(现在叫 PythonAnywhere)找到了一份 工作。这个公司遵循极限编程(Extreme Programming,XP)开发理念。他们向我介绍了 严密的 TDD。 虽然之前的经验的确让我认识到自动化测试的好处,但我在每个阶段都心存疑虑。“我的 意思是,测试通常来说可能是个不错的主意,但果真如此吗?全部都要测试吗?有些测试 看起来完全是在浪费时间……什么?除了单元测试之外还要做功能测试?得了吧,这是多 此一举!还要走一遍测试驱动开发中的‘测试 / 小幅度代码改动 / 测试 ’ 循环?太荒谬了! 我们不需要这种婴儿学步般的过程!既然我们知道正确的答案是什么,为什么不直接跳到 最后一步呢?” 相信我!我审视过每一条规则,给每一条捷径提出过建议,为 TDD 的每一个看似毫无意 义的做法寻找过理由,最终,我发现了采用 TDD 的明智之处。我记不清在心里说过多少 次“谢谢你,测试”,因为功能测试能揭示我们可能永远都无法预测的回归,单元测试能 让我避免犯很愚蠢的逻辑错误。从心理学上讲,TDD 大大降低了开发过程中的压力,而且 写出的代码让人赏心悦目。 那么,让我告诉你关于 TDD 的一切吧! 写作本书的目的 我写这本书的主要目的是要传授一种用于 Web 开发的方法,它可以让 Web 应用变得更好,
📄 Page
20
前言 | xvii 也能让开发者更愉快。一本书如果只包含一些上网搜索就能找到的知识,那它就没多大的 意思了,所以本书不是 Python 句法指南,也不是 Web 开发教程。我希望教会你的,是如 何使用 TDD 理念,更加稳妥地实现我们共同的神圣目标——简洁可用的代码。 即便如此,我仍会从零开始使用 Django、Selenium、jQuery 和 Mock 等工具开发一个 Web 应用,不断提到一个真实可用的示例。阅读本书之前,你无须了解这些工具。读完本书 后,你会充分了解这些工具,并掌握 TDD 理念。 在极限编程实践中,我们总是结对编程。写这本书时,我设想自己和以前的自己结成对 子,向以前的我解释如何使用这些工具,回答为什么要用这种特别的方式编写代码。所 以,如果我表现得有点儿屈尊俯就,那是因为我不是那么聪明,我要对自己很有耐心。如 果觉得我说话冒犯了你,那是因为我有点儿烦人,经常不认同别人的说法,所以有时要花 很多时间论证,说服自己接受他人的观点。 本书结构 我将这本书分成了三个部分。 • 第一部分(第 1~7 章):基础知识 开门见山,介绍如何使用 TDD 开发一个简单的 Web 应用。我们会先(用 Selenium)写 一个功能测试,然后介绍 Django 的基础知识,包括模型、视图和模板。在每个阶段, 我们都会编写严格的单元测试。除此之外,我还会向你引荐测试山羊。 • 第二部分(第 8~17 章):Web 开发要素 介绍 Web 开发过程中一些棘手但不可避免的问题,并展示如何通过测试解决这些问题, 包括静态文件、部署到生产环境、表单数据验证、数据库迁移和令人畏惧的 JavaScript。 • 第三部分(第 18~26 章):高级话题 介绍模拟技术、集成第三方系统、测试固件、由外而内的 TDD 流程以及持续集成 (Continuous Integration,CI)。 排版约定 本书使用了下列排版约定。 • 黑体 表示新术语或强调的内容。 • 等宽字体(Constant width) 表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句 和关键字等。 • 加粗等宽字体(Constant width bold) 表示应该由用户输入的命令或其他文本。 偶尔使用 [...] 符号表示省略了一些内容,截断较长的输出,或者跳到相关的内容。
The above is a preview of the first 20 pages. Register to read the complete e-book.
Recommended for You
Loading recommended books...
Failed to load, please try again later