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应用相关推荐

  1. 为什么做UTDD(单元测试驱动开发)

    为什么做UTDD 前言导入 天下熙熙皆为利来,天下攘攘皆为利往.         在开始做一件事情之前,我们首先需要弄清 "它能给我们带来什么?(好处.坏处)"         以 ...

  2. Linux驱动开发(从零开始编写一个驱动程序)

    1.系统整体工作原理 (1)应用层->API->设备驱动->硬件 (2)API:open.read.write.close等 (3)驱动源码中提供真正的open.read.write ...

  3. linux的驱动开发——简单驱动程序编写

    1.字符设备驱动介绍 \qquad字符设备驱动是linux驱动中,最基本的一类设备驱动,字符设备就是按照一个字节一个字节的方式进行读写操作的设备.读写数据分先后顺序,我们常见的单片机外设,比如led灯 ...

  4. 测试驱动开发_DevOps之浅谈测试驱动开发

    "测试驱动开发(Test-Driven Development, TDD),以测试作为开发过程的中心,它要求在编写任何产品代码之前,先编写用于定义产品代码行为的测试,而编写的产品代码又要以使 ...

  5. 解读 TDD 测试驱动开发

    转自:http://www.jianshu.com/p/62f16cd4fef3 本文结构: 什么是 TDD 为什么要 TDD 怎么 TDD FAQ 学习路径 延伸阅读 什么是 TDD TDD 有广义 ...

  6. 行为驱动开发BDD和Cucunber简介

    测试驱动开发(TDD) 1.测试驱动开发,即Test-Driven Development(TDD),测试驱动开发是敏捷开发中的一项核心实践和技术,也是一种设计方法论.TDD的原理是在开发功能代码之前 ...

  7. 如何正确入门Windows系统下驱动开发领域?

    [作者] 猪头三 作者网站: http://www.x86asm.com 原文链接: http://blog.csdn.net/Code_GodFather/...0/5975901.aspx [贡献 ...

  8. DDD“上吊绳驱动开发”,开发要想不被“吊死”,该如何自救?

    话题缘起 01 今天在DevOps案例深度研究讨论群里,群友们围绕一种开发模式展开了讨论:DDD(Deadline Driven Development),期限驱动开发,大家似乎更愿意将其翻译成&qu ...

  9. windows驱动开发学习

    序言]  很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资 料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从 事驱动开发时间不长也不短, ...

最新文章

  1. LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法
  2. RASA NLU Chi安装
  3. 多媒体技术 PI 第一期:OSS 圆桌预告
  4. 博弈-sg函数的原理和优化(hdu-1536)
  5. C#DateTime.ToString格式化时间字符串
  6. c语言水平制表符怎么才能占16列,水平制表符是?其作用?
  7. 团队管理(3)---团队管理方法
  8. 创建父需求子需求构建需求树_还不知道B+树 ?看完,别再问我什么是B+树 了
  9. opencv stereo match sample
  10. 【转】VC++计算当前时间点间隔N天的时间(不使用CTimeSpan类)
  11. responseentity 详解_大六壬毕法赋精注详解(1)【六壬】
  12. asp.net中实现登陆的时候用SSL
  13. radius认证服务器部署linux,CentOS安装配置radius服务器
  14. 图像处理中的数学原理详解
  15. 双拼输入法软件测试,为什么推荐你使用双拼输入法?
  16. 电瓶车换电柜的静电浪涌设计考虑
  17. TARA-威胁建模方案1
  18. Linux开机密码重置
  19. metro风格的特点
  20. 小老鼠冒险记:《Moss 2》幕后花絮

热门文章

  1. mysql 协议测试_mysqlslap压力测试mysql
  2. python构造一个二叉树_二叉树-链表存储,用二叉树构造表达式(Python实现)
  3. 深度学习工程师能力评估标准
  4. java怎么给文档加水印_Java 如何给Word文档添加多行文字水印
  5. Android数据存储汇总
  6. if和else同时执行_为什么大量的if else这么不受待见?怎么“干掉”它?
  7. json to graphql schema: json2graphql
  8. IdentityServer Topics(6)- Windows身份验证
  9. [deviceone开发]-QQ分享、微信分享和新浪微博分享
  10. Javascript数据类型共有六种