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 的所有方法, 依次执行

获取响应

以上我们听过 appget或者 POST 得到数据后, 得到的是二进制数据, 需要decode 一下才是我们用的普通字符串, 如代码所示ret.data.decode('utf-8')

unittest.main()

脚本启动后, 需要运行改方法, 运行各个test_xx的实例

setUp 和 tearDown

在测试类下, 每次执行一个实例, 都会运行setUptearDown,

以上测试实例, 实现了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)

会提示出错误, 并标记错误位置