Flask 单元测试实例
2017-05-21
Flask 单元测试
Flask 内完美兼容了unittest
, 以下是简单的一个测试方式
接口定义
我们用Flask 简单定义了两个接口
import json
from flask import Flask
app = Flask(__name__)
@app.route('/test/api', methods=['POST'])
def test_api_handler():
data = {
'code': 0,
'msg': 'OK',
'data': {
'name': 'tony',
'age': 22
}
}
return json.dumps(data)
@app.route('/test')
def test_handler():
return "hello world"
if __name__ == '__main__':
app.run(port=9999)
一个是 /test/api
, 一个是/test
, 前者返回一个json 字符串, 后者返回一个普通字符串
单元测试用例
以下是写的 Flask 的测试模块
import run
import unittest
class TestDemo(unittest.TestCase):
def setUp(self):
self.app = run.app.test_client()
def test_test(self):
ret = self.app.get('/test')
ret = ret.data.decode('utf-8')
assert "hello world" == ret
assert 'hello' in ret
def test_api_demo(self):
ret = self.app.post('/test/api')
ret = ret.data.decode('utf-8')
assert 'name' in ret
if __name__ == '__main__':
unittest.main()
以上的代码注意以下几点
测试类继承 unittest.TestCase
我们的测试类需要继承unittest.TestCase
实现 test_xx 方法
在我们的测试类中, 实现 test_xx 方法, 允许多个, 运行测试脚本时, unittest
会收集test_xx
的所有方法, 依次执行
获取响应
以上我们听过 app
来get
或者 POST
得到数据后, 得到的是二进制数据, 需要decode
一下才是我们用的普通字符串, 如代码所示ret.data.decode('utf-8')
unittest.main()
脚本启动后, 需要运行改方法, 运行各个test_xx
的实例
setUp 和 tearDown
在测试类下, 每次执行一个实例, 都会运行setUp
和 tearDown
,
以上测试实例, 实现了setUp
, tearDown
一般做资源释放, 比如释放打开的文件或者数据库连接等等
测试
现在我们来测试一下
首先, 运行 flask 项目,
执行我们的接口定义文件, 这里我们是run.py
python run.py
然后执行单元测试用的文件, 这里是test.py
python test.py
如果正常通过, 输入会如下所示
..
----------------------------------------------------------------------
Ran 2 tests in 0.013s
OK
如果有异常,
F.
======================================================================
FAIL: test_api_demo (__main__.TestDemo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test.py", line 22, in test_api_demo
assert 'age' not in ret
AssertionError
----------------------------------------------------------------------
Ran 2 tests in 0.012s
FAILED (failures=1)
会提示出错误, 并标记错误位置