《Python Web开发 - 测试驱动方法》阅后感
这本书的原名是叫《Test-Driven Development with Python》,小标题是 Obey the Testing Goat: Using Django, Selenium, and JavaScript。虽然有点难以理解为何这本书的中文名变成了《Python Web开发 - 测试驱动方法》,总感觉怪怪的,毕竟Kent Beck的那本书名是《测试驱动开发》。
如我在微博上所说,这本书的Python Web开发所用的框架是Django。问了几个出版社都没有出版Django书的计划,要知道有这么多公司使用了Django:
尽管最近几年里Flask似乎比Django受欢迎,但是Django是一个设计得非常巧妙的框架。而且,越来越多的公司开始使用Django替换他们原有的系统,如Firefox所在的Mozilla。吐槽完毕,让我们进入正题。
书的作者在一家使用敏捷开发的软件公司里。
如果你想(复制一下小结):
- 学习自动测试(针对Developer)
- 测试驱动开发
- 持续交付
那么,这本书是非常值得看的。
测试
这本书的主要话题自然是测试了。
TDD(测试驱动开发)
传统的软件公司的测试和开发是分离的,这就意味着你并不需要写你的功能测试。由于,没有在那样的公司工作过,我也不知道他们是否写单元测试。反正我所在的公司,单元测试和功能测试都是要写的。但是,我相信他们需要有个三次握手的过程:
这就有点像开发团队和产品团队在互相推诿责任,“你们的需求实现不了”,“你们开发的东西有问题”。对于产品来说,最好的过程莫过于产品团队和开发团队一起开发实现功能。同比,如果你的测试和产品代码是分开写的,如果你不打算改变现状、走出舒适区或者尝试新的东西,那么你不需要TDD,你也不需要这本书。
So,这本书的大部分内容都是关于如何展开TDD的。
自动测试
现在,有一个新的项目来了,客户想到一个TO-DO List。TDD的第一要素是测试,所以先用Selenium来了一个单元测试,用于测试首页是存在的,并且标题中含有Django。
from selenium imoprt webdriver
browser = webdriver.Firefox()
browser.get('http://localhost:8000')
assert 'Django' in browser.title
你可能已经猜到结果了,这个测试必须是挂的。如果你没有用到Selenium这样的自动测试工具,你应该试试,它会在你运行的时候,自动打开浏览器。
因为Web服务并没有启动,所以你需要用django-admin.py去创建一个项目,然后就是经典的Hello,World。
如果你写过Java或者Python等等的测试,你可能已经猜到了。你写的测试都会自动的执行下去,所以他会把这些任务一个个跑一遍。并且,是由机器来执行:
- Selenium会打开一个浏览器窗口,打开某个页面,输入表单信息,然后点击确认,最后验证信息是不是正确的。
- Selenium会打开一个浏览器窗口,打开某个页面查看页面的标题是不是正确的。
- Selenium会打开一个浏览器窗口,并按照你的需要点击页面的某个button,然后检查页面是不是会出现类似的东西。
而你并没有实现这些功能,所以你需要去实现他们。
然后这本书就在重复上面的过程,过程中你学会了怎么使用Django。但是,你并不会意识到这其中的美妙之处。
红-绿-重构
实现上,我们在重复的过程是:红-绿-重构。
通常来说,红的原因是因为我们依据客户需求编写测试用例。接着,通过让测试变绿(成功),我们就知道我们实现了这个功能。如果你的功能代码写得很好,那么你不就需要去重构代码了。所以,其实重构代码的前提是你已经有了测试,而TDD就是在保证你有测试来cover功能代码。
所以,如果你所在的项目之所以没有人敢重构,就是因为测试覆盖率不够。
测试小结
接着,作者对实践过程中遇到的问题进行了一些总结。如测试速度、拆分测试、什么时候使用集成测试(书中翻译为整合测试),这些小结相当重要。像在我们的项目中,运行所有的测试大概要半个小时,这期间不断跳到的Firefox浏览器(~10个)会夺走你对电脑的使用权。
好了,这本书2/3的话题已经完了。
持续交付
这是这本书另外1/3的话题划分到了持续交付这样的话题,当然这只是我对他们的总结。
持续交付意味着几个话题,如持续集成、持续发布、自动部署,所以书中提到了几个不错的软件:
- Fabric,一个用于自动部署的工具 —— Python语言。
- HTTP服务器Nginx。
- WSGI服务器Gunicorn
- Jenkins,持续集成(CI)。虽然我们项目上用的是Bamboo,但是他们都是持续集成构建服务器软件。这意味着,在你PUSH代码后,在CI上会安装依赖、运行测试、发布版本等等。
(ps: 我的博客就是 Django + Nginx + Gunicorn + Mezzanine (CMS) + Fabric (Mezzanine自带),但是没有Jenkins)
忘说了,上面的所有内容都是敏捷的开发流程。
小结
So,So,如果你想:
- 学习自动测试
- 测试驱动开发
- 持续交付
那么,这本书是非常值得看的。
如果你不感兴趣,那么就送给我吧。
- Android6.0之修改或者查看系统属性值
- linux下Android7.0多用户编译问题
- 带你解锁蓝牙skill(0)
- WiFiAp探究实录--功能实现与源码分析
- Android7.1.1系统设置默认值大全
- Androidstudio编译c/c++jni方法
- 带你解锁蓝牙skill(三)
- 带你解锁蓝牙skill(二)
- 带你解锁蓝牙skill(一)
- Android四大组件完全解析(二)---Service
- BLE低功耗蓝牙开发相关概念问题记录
- Android四大组件完全解析(一)---Activity
- Activity加载view6.0源码分析---setContentView
- 数据库设计之数据库,数据表和字段等的命名总结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 如何根据class_code筛选转录本?
- JNI线程相关
- JNI函数加载
- CSS中的传统布局、多列布局、弹性伸缩布局及Emmet工具
- 数据分析可视化(四)|Pyecharts制作地图的几种方法评析
- tensorflow运行提示未编译使用SSE4.1,SSE4.2等问题的解决方法
- [手把手系列之二]实现多层神经网络
- 使用SystemVerilog简化FPGA中的接口
- 想用深度学习谱写自己的音乐吗?这篇指南来帮你!(附代码)
- 你不是说你会aop吗?
- 开源:推荐一个不错的离线IP地址定位库
- 武磊告别西甲!Python带你解读「全村的希望」武磊职业数据
- 谁在崛起,谁在没落?新一线城市竞争力盘点,用Python绘制动态图带你看懂!
- 两数相加
- 这样设置 IDEA,让你爽到飞起!