Python Web 开发:测试驱动方法 PDF 文档

发布于 2024-05-02 00:29:58 字数 8554 浏览 18 评论 0

本书从最基础的知识开始,讲解 Web 开发的整个流程,展示如何使用 Python 做测试驱动开发。本书由三个部分组成。第一部分介绍了测试驱动开发和 Django 的基础知识。第二部分讨论了 Web 开发要素,探讨了 Web 开发过程中不可避免的问题,及如何通过测试解决这些问题。第三部分探讨了一些高级话题,如模拟技术、集成第三方插件、Ajax、测试固件、持续集成等。

本书适合 Web 开发人员阅读。

本书结构

我将这本书分成了三个部分。

第一部分(第 1~6 章):基础知识

开门见山,介绍如何使用 TDD 开发一个简单的 Web 应用。我们会先(用 Selenium)写一个功能测试,然后介绍 Django 的基础知识,包括模型、视图和模板。在每个阶段,我们都会编写严格的单元测试。除此之外,我还会向你引荐测试山羊。

第二部分(第 7~14 章):Web 开发要素

介绍 Web 开发过程中一些棘手但不可避免的问题,并展示如何通过测试解决这些问题,包括静态文件、部署到生产环境、表单数据验证、数据库迁移和令人畏惧的 JavaScript。

第三部分(第 15~20 章):高级话题

介绍模拟技术、集成第三方认证系统、Ajax、测试固件、由外而内的 TDD 流程,以及持续集成(Continuous Integration,CI)。

目录
前言
准备工作和应具备的知识
致谢
第一部分 TDD 和 Django 基础
第 1 章 使用功能测试协助安装 Django
1.1 遵从测试山羊的教诲,没有测试什么也别做
1.2 让 Django 运行起来
1.3 创建 Git 仓库
第 2 章 使用 unittest 模块扩展功能测试
2.1 使用功能测试驱动开发一个最简可用的应用
2.2 Python 标准库中的 unittest 模块
2.3 隐式等待
2.4 提交
第 3 章 使用单元测试测试简单的首页
3.1 第一个 Django 应用,第一个单元测试
3.2 单元测试及其与功能测试的区别
3.3 Django 中的单元测试
3.4 Django 中的 MVC、URL 和视图函数
3.5 终于可以编写一些应用代码了
3.6 urls.py
3.7 为视图编写单元测试
第 4 章 编写这些测试有什么用
4.1 编程就像从井里打水
4.2 使用 Selenium 测试用户交互
4.3 遵守“不测试常量”规则,使用模板解决这个问题
4.4 关于重构
4.5 接着修改首页
4.6 总结:TDD 流程
第 5 章 保存用户输入
5.1 编写表单,发送 POST 请求
5.2 在服务器中处理 POST 请求
5.3 把 Python 变量传入模板中渲染
5.4 事不过三,三则重构
5.5 Django ORM 和第一个模型
5.5.1 第一个数据库迁移
5.5.2 测试向前走得挺远
5.5.3 添加新字段就要创建新迁移
5.6 把 POST 请求中的数据存入数据库
5.7 处理完 POST 请求后重定向
5.8 在模板中渲染待办事项
5.9 使用迁移创建生产数据库
第 6 章 完成最简可用的网站
6.1 确保功能测试之间相互隔离
6.2 必要时做少量的设计
6.2.1 YAGNI!
6.2.2 REST
6.3 使用 TDD 实现新设计
6.4 逐步迭代,实现新设计
6.5 使用 Django 测试客户端一起测试视图,模板和 URL
6.5.1 一个新测试类
6.5.2 一个新 URL
6.5.3 一个新视图函数
6.5.4 一个新模板,用于查看清单
6.6 用于添加待办事项的 URL 和视图
6.6.1 用来测试新建清单的测试类
6.6.2 用于新建清单的 URL 和视图
6.6.3 删除当前多余的代码和测试
6.6.4 让表单指向刚添加的新 URL
6.7 调整模型
6.7.1 通过外键实现的关联
6.7.2 根据新模型定义,调整其他代码
6.8 每个列表都应该有自己的 URL
6.8.1 捕获 URL 中的参数
6.8.2 按照新设计调整 new_list 视图
6.9 还需要一个视图,把待办事项加入现有清单
6.9.1 小心霸道的正则表达式
6.9.2 最后一个新 URL
6.9.3 最后一个新视图
6.9.4 但是如何在表单中使用那个 URL
6.10 使用 URL 引入做最后一次重构
第二部分 Web 开发要素
第 7 章 美化网站:布局、样式及其测试方法
7.1 如何在功能测试中测试布局和样式
7.2 使用 CSS 框架美化网站
7.3 Django 模板继承
7.4 集成 Bootstrap
7.5 Django 中的静态文件
7.6 使用 Bootstrap 中的组件改进网站外观
7.6.1 超大文本块
7.6.2 大型输入框
7.6.3 样式化表格
7.7 使用自己编写的 CSS
7.8 补遗:collectstatic 命令和其他静态目录
7.9 没谈到的话题
第 8 章 使用过渡网站测试部署
8.1 TDD 以及部署的危险区域
8.2 一如既往,先写测试
8.3 注册域名
8.4 手动配置托管网站的服务器
8.4.1 选择在哪里托管网站
8.4.2 搭建服务器
8.4.3 用户账户,SSH 和权限
8.4.4 安装 Nginx
8.4.5 解析过渡环境和线上环境所用的域名
8.4.6 使用功能测试确认域名可用而且 Nginx 正在运行
8.5 手动部署代码
8.5.1 调整数据库的位置
8.5.2 创建虚拟环境
8.5.3 简单配置 Nginx
8.5.4 使用迁移创建数据库
8.6 为部署到生产环境做好准备
8.6.1 换用 Gunicorn
8.6.2 让 Nginx 伺服静态文件
8.6.3 换用 Unix 套接字
8.6.4 把 DEBUG 设为 False,设置 ALLOWED_HOSTS
8.6.5 使用 Upstart 确保引导时启动 Gunicorn
8.6.6 保存改动:把 Gunicorn 添加到 requirements.txt
8.7 自动化
第 9 章 使用 Fabric 自动部署
9.1 分析一个 Fabric 部署脚本
9.2 试用部署脚本
9.2.1 部署到线上服务器
9.2.2 使用 sed 配置 Nginx 和 Gunicorn
9.3 使用 Git 标签标注发布状态
9.4 延伸阅读
第 10 章 输入验证和测试的组织方式
10.1 针对验证的功能测试:避免提交空待办事项
10.1.1 跳过测试
10.1.2 把功能测试分拆到多个文件中
10.1.3 运行单个测试文件
10.1.4 填充功能测试
10.2 使用模型层验证
10.2.1 重构单元测试,分拆成多个文件
10.2.2 模型验证的单元测试和 self.assertRaises 上下文管理器
10.2.3 Django 怪异的表现:保存时不验证数据
10.3 在视图中显示模型验证错误
10.4 Django 模式:在渲染表单的视图中处理 POST 请求
10.4.1 重构:把 new_item 实现的功能移到 view_list 中
10.4.2 在 view_list 视图中执行模型验证
10.5 重构:去除硬编码的 URL
10.5.1 模板标签{% url %}
10.5.2 重定向时使用 get_absolute_url
第 11 章 简单的表单
11.1 把验证逻辑移到表单中
11.1.1 使用单元测试探索表单 API
11.1.2 换用 Django 中的 ModelForm 类
11.1.3 测试和定制表单验证
11.2 在视图中使用这个表单
11.2.1 在处理 GET 请求的视图中使用这个表单
11.2.2 大量查找和替换
11.3 在处理 POST 请求的视图中使用这个表单
11.3.1 修改 new_list 视图的单元测试
11.3.2 在视图中使用这个表单
11.3.3 使用这个表单在模板中显示错误消息
11.4 在其他视图中使用这个表单
11.5 使用表单自带的 Save 方法
第 12 章 高级表单
12.1 针对重复待办事项的功能测试
12.1.1 在模型层禁止重复
12.1.2 题外话:查询集合排序和字符串表示形式
12.1.3 重写旧模型测试
12.1.4 保存时确实会显示完整性错误
12.2 在视图层试验待办事项重复验证
12.3 处理唯一性验证的复杂表单
12.4 在清单视图中使用 ExistingListItemForm
第 13 章 试探 JavaScript
13.1 从功能测试开始
13.2 安装一个基本的 JavaScript 测试运行程序
13.3 使用 jQuery 和<div>固件元素
13.4 为想要实现的功能编写 JavaScript 单元测试
13.5 JavaScript 测试在 TDD 循环中的位置
13.6 经验做法:onload 样板代码和命名空间
13.7 一些缺憾
第 14 章 部署新代码
14.1 部署到过渡服务器
14.2 部署到线上服务器
14.3 如果看到数据库错误该怎么办
14.4 总结:为这次新发布打上 Git 标签
第三部分 高级话题
第 15 章 用户认证、集成第三方插件以及 JavaScript 模拟技术的使用
15.1 Mozilla Persona(BrowserID)
15.2 探索性编程(又名“探究”)
15.2.1 为此次探究新建一个分支
15.2.2 前端和 JavaScript 代码
15.2.3 Browser-ID 协议
15.2.4 服务器端:自定义认证机制
15.3 去掉探究代码
15.3.1 常用 Selenium 技术:显式等待
15.3.2 删除探究代码
15.4 涉及外部组件的 JavaScript 单元测试:首次使用模拟技术!
15.4.1 整理:全站共用的静态文件夹
15.4.2 什么是模拟技术,为什么要模拟,模拟什么?
15.4.3 命名空间
15.4.4 在 initialize 函数的单元测试中使用一个简单的驭件
15.4.5 高级模拟技术
15.4.6 检查参数的调用
15.4.7 QUnit 中的 setup 和 teardown 函数,以及 Ajax 请求测试
15.4.8 深层嵌套回调函数和测试异步代码
第 16 章 服务器端认证,在 Python 中使用模拟技术
16.1 探究登录视图
16.2 在 Python 代码中使用模拟技术
16.2.1 通过模拟 authenticate 函数测试视图
16.2.2 确认视图确实登录了用户
16.3 模拟网络请求,去除自定义认证后台中的探究代码
16.3.1 一个 if 语句需要一个测试
16.3.2 在类上使用 patch 修饰器
16.3.3 进行布尔值比较时要留意驭件
16.3.4 需要时创建用户
16.3.5 get_user 方法
16.4 一个最简单的自定义用户模型
16.4.1 稍微有点儿失望
16.4.2 把测试当做文档
16.4.3 用户已经通过认证
16.5 关键时刻:功能测试能通过吗?
16.6 完善功能测试,测试退出功能
第 17 章 测试固件、日志和服务器端调试
17.1 事先创建好会话,跳过登录过程
17.2 实践是检验真理的唯一标准:在过渡服务器中捕获最后的问题
17.2.1 设置日志
17.2.2 修正 Persona 引起的这个问题
17.3 在过渡服务器中管理测试数据库
17.3.1 创建会话的 Django 管理命令
17.3.2 让功能测试在服务器上运行管理命令
17.3.3 使用 subprocess 模块完成额外的工作
17.4 集成日志相关的代码
17.5 小结
第 18 章 完成“My Lists”页面:由外而内的 TDD
18.1 对立技术:“由内而外”
18.2 为什么选择使用“由外而内”
18.3 “My Lists”页面的功能测试
18.4 外层:表现层和模板
18.5 下移一层到视图函数(控制器)
18.6 使用由外而内技术,再让一个测试通过
18.6.1 快速重组模板的继承层级
18.6.2 使用模板设计 API
18.6.3 移到下一层:视图向模板中传入什么
18.7 视图层的下一个需求:新建清单时应该记录属主
18.8 下移到模型层
第 19 章 测试隔离和“倾听测试的心声”
19.1 重温抉择时刻:视图层依赖于尚未编写的模型代码
19.2 首先尝试使用驭件实现隔离
19.3 倾听测试的心声:丑陋的测试表明需要重构
19.4 以完全隔离的方式重写视图测试
19.4.1 为了新测试的健全性,保留之前的整合测试组件
19.4.2 完全隔离的新测试组件
19.4.3 站在协作者的角度思考问题
19.5 下移到表单层
19.6 最后,下移到模型层
19.7 关键时刻,以及使用模拟技术的风险
19.8 把层与层之间的交互当做“合约”
19.8.1 找出隐形合约
19.8.2 修正由于疏忽导致的问题
19.9 还缺一个测试
19.10 清理:保留哪些整合测试
19.10.1 删除表单层多余的代码
19.10.2 删除以前实现的视图
19.10.3 删除视图层多余的代码
19.11 总结:什么时候编写隔离测试,什么时候编写整合测试
19.11.1 以复杂度为准则
19.11.2 两种测试都要写吗?
19.11.3 继续前行
第 20 章 持续集成
20.1 安装 Jenkins
20.1.1 Jenkins 的安全配置
20.1.2 添加需要的插件
20.2 设置项目
20.3 第一次构建
20.4 设置虚拟显示器,让功能测试能在无界面的环境中运行
20.5 截图
20.6 一个常见的 Selenium 问题:条件竞争
20.7 使用 PhantomJS 运行 QUnit JavaScript 测试
20.7.1 安装 node
20.7.2 在 Jenkins 中添加构建步骤
20.8 CI 服务器能完成的其他操作
第 21 章 简单的社会化功能、页面模式,以及练习
21.1 有多个用户,以及使用 addCleanup 的功能测试
21.2 实现 Selenium 交互等待模式
21.3 页面模式
21.4 扩展功能测试,测试第二个用户和“My Lists”页面
21.5 留给读者的练习
第 22 章 测试运行速度的快慢和炽热的岩浆
22.1 正题:单元测试除了运行速度超快之外还有其他优势
22.1.1 测试运行得越快,开发速度越快
22.1.2 神赐的心流状态
22.1.3 速度慢的测试经常不想运行,导致代码变坏
22.1.4 现在还行,不过随着时间推移,整合测试会变得越来越慢
22.1.5 别只听我一个人说
22.1.6 而且单元测试能驱使我们实现好的设计
22.2 纯粹的单元测试有什么问题
22.2.1 隔离的测试难读也难写
22.2.2 隔离测试不会自动测试集成情况
22.2.3 单元测试几乎不能捕获意料之外的问题
22.2.4 使用驭件的测试可能和实现方式联系紧密
22.2.5 但是这些问题都可以解决
22.3 合题:我们到底想从测试中得到什么?
22.3.1 正确性
22.3.2 简洁可维护的代码
22.3.3 高效的工作流程
22.3.4 根据所需的优势评估测试
22.4 架构方案
22.4.1 端口和适配器(或六边形、简洁)架构
22.4.2 函数式核心,命令式外壳
22.5 总结
遵从测试山羊的教诲
附录 A PythonAnywhere
附录 B 基于类的 Django 视图
附录 C 使用 Ansible 配置服务器
附录 D 测试数据库迁移
附录 E 接下来做什么
附录 F 速查表
附录 G 参考书目

下载地址:https://www.wenjiangs.com/wp-content/uploads/2024/01/9BnLclsxIa3pDqKE.zip

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

浸婚纱

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

一梦浮鱼

文章 0 评论 0

mb_Z9jVigFL

文章 0 评论 0

伴随着你

文章 0 评论 0

耳钉梦

文章 0 评论 0

18618447101

文章 0 评论 0

蜗牛

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文