使用单元测试驱动开发的方式编写flask应用
flask是个轻量级的python框架,特别适合写一个没有UI的web接口应用,并且提供了很友好的测试框架,参考链接http://flask.pocoo.org/docs/testing/,官方提供的测试范例实际上算是集成测试了,如果不想让测试依赖外部环境(比如数据库)怎么办呢?Mock!,推荐使用mockito-python,Mockito的Java版本就非常好用,python也同样给力,下载地址 http://code.google.com/p/mockito-python/ 。废话少说,来次TDD的体验吧。
先写个测试:
class LoginTest(unittest.TestCase): def setUp(self): self.db = mock() self.app = myapp.create_app(self.db).test_client() def tearDown(self): unstub()
增加一个Post请求,用来进行登录。
def test_login(self): rv = self.app.post('/login', data=dict(username='archie', password='mypassword')) self.assertEqual(200, rv.status_code) self.assertEqual('Login Successful!', rv.data)
当然,这个测试运行肯定会失败。
[wenwen@Archie flaskdemo]$ nosetestsE======================================================================ERROR: Failure: ImportError (No module named flaskdemo)----------------------------------------------------------------------Traceback (most recent call last): ...... File "/Users/wenwen/Documents/workspace/flaskdemo/flaskdemo_test.py", line 7, in <module> import flaskdemoImportError: No module named flaskdemo ----------------------------------------------------------------------Ran 1 test in 0.074s FAILED (errors=1)
先让测试通过吧,写个flaskdemo.py。
from flask.app import Flask def create_app(db):# application app = Flask(__name__) app.config.from_object(__name__) @app.route("/login", methods=["POST"])def login():return "Login Successful!" return app
毫无悬念,测试通过了。但是我们还没写验证的逻辑呢,我们使用auth.py这个module里的verify这个方法来验证,这里不想牵扯到db访问的细节,也不想在运行测试的时候启动数据库,让Mock来吧,修改测试。
def test_login(self): when(flaskdemo.auth).verify(self.db, "archie", "mypassword").thenReturn(True) rv = self.app.post('/login', data=dict(username='archie', password='mypassword')) verify(flaskdemo.auth).verify(self.db, "archie", "mypassword") self.assertEqual(200, rv.status_code) self.assertEqual('Login Successful!', rv.data)
测试失败了,写个auth.py,有个空方法就可以了,以后再实现,然后把它import到flaskdemo中,并调用。
@app.route("/login", methods=["POST"])def login():return "Login Successful!" if auth.verify(db, request.form.get("username"), request.form.get("password")) else "Login Failed!"
ok!测试通过了。
[wenwen@Archie flaskdemo]$ nosetests.----------------------------------------------------------------------Ran 1 test in 0.103s OK
不需要启动数据库,甚至不需要写验证逻辑。同理,当依赖的复杂逻辑在另外的module中时,就可以通过mock来解耦,方便进行单元测试。
转载于:https://www.cnblogs.com/archie/archive/2012/03/17/2402326.html
使用单元测试驱动开发的方式编写flask应用相关推荐
- 为什么做UTDD(单元测试驱动开发)
为什么做UTDD 前言导入 天下熙熙皆为利来,天下攘攘皆为利往. 在开始做一件事情之前,我们首先需要弄清 "它能给我们带来什么?(好处.坏处)" 以 ...
- Linux驱动开发(从零开始编写一个驱动程序)
1.系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API:open.read.write.close等 (3)驱动源码中提供真正的open.read.write ...
- linux的驱动开发——简单驱动程序编写
1.字符设备驱动介绍 \qquad字符设备驱动是linux驱动中,最基本的一类设备驱动,字符设备就是按照一个字节一个字节的方式进行读写操作的设备.读写数据分先后顺序,我们常见的单片机外设,比如led灯 ...
- 测试驱动开发_DevOps之浅谈测试驱动开发
"测试驱动开发(Test-Driven Development, TDD),以测试作为开发过程的中心,它要求在编写任何产品代码之前,先编写用于定义产品代码行为的测试,而编写的产品代码又要以使 ...
- 解读 TDD 测试驱动开发
转自:http://www.jianshu.com/p/62f16cd4fef3 本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义 ...
- 行为驱动开发BDD和Cucunber简介
测试驱动开发(TDD) 1.测试驱动开发,即Test-Driven Development(TDD),测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前 ...
- 如何正确入门Windows系统下驱动开发领域?
[作者] 猪头三 作者网站: http://www.x86asm.com 原文链接: http://blog.csdn.net/Code_GodFather/...0/5975901.aspx [贡献 ...
- DDD“上吊绳驱动开发”,开发要想不被“吊死”,该如何自救?
话题缘起 01 今天在DevOps案例深度研究讨论群里,群友们围绕一种开发模式展开了讨论:DDD(Deadline Driven Development),期限驱动开发,大家似乎更愿意将其翻译成&qu ...
- windows驱动开发学习
序言] 很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资 料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从 事驱动开发时间不长也不短, ...
最新文章
- LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法
- RASA NLU Chi安装
- 多媒体技术 PI 第一期:OSS 圆桌预告
- 博弈-sg函数的原理和优化(hdu-1536)
- C#DateTime.ToString格式化时间字符串
- c语言水平制表符怎么才能占16列,水平制表符是?其作用?
- 团队管理(3)---团队管理方法
- 创建父需求子需求构建需求树_还不知道B+树 ?看完,别再问我什么是B+树 了
- opencv stereo match sample
- 【转】VC++计算当前时间点间隔N天的时间(不使用CTimeSpan类)
- responseentity 详解_大六壬毕法赋精注详解(1)【六壬】
- asp.net中实现登陆的时候用SSL
- radius认证服务器部署linux,CentOS安装配置radius服务器
- 图像处理中的数学原理详解
- 双拼输入法软件测试,为什么推荐你使用双拼输入法?
- 电瓶车换电柜的静电浪涌设计考虑
- TARA-威胁建模方案1
- Linux开机密码重置
- metro风格的特点
- 小老鼠冒险记:《Moss 2》幕后花絮
热门文章
- mysql 协议测试_mysqlslap压力测试mysql
- python构造一个二叉树_二叉树-链表存储,用二叉树构造表达式(Python实现)
- 深度学习工程师能力评估标准
- java怎么给文档加水印_Java 如何给Word文档添加多行文字水印
- Android数据存储汇总
- if和else同时执行_为什么大量的if else这么不受待见?怎么“干掉”它?
- json to graphql schema: json2graphql
- IdentityServer Topics(6)- Windows身份验证
- [deviceone开发]-QQ分享、微信分享和新浪微博分享
- Javascript数据类型共有六种