python unitests for sanic app

时间:2017-05-17 09:18:09

标签: python python-unittest python-asyncio aiohttp sanic

我正在使用peewee ORM和sanic(sanic-crud)作为app服务器构建CRUD REST API。事情很好。我也写了几个单元测试案例。

但是,我正面临运行单元测试的问题。问题是,单元测试会启动sanic app server并在那里停滞不前。它根本没有运行unittest案例。但是当我手动按Ctrl + C时,sanic服务器终止并开始执行unittests。因此,这意味着应该有一种方法来启动sanic服务器并继续进行unittests运行并在最后终止服务器。

有人能以正确的方式为sanic app撰写单元测试案例吗?

我也遵循官方文件,但没有运气。 http://sanic.readthedocs.io/en/latest/sanic/testing.html

我试过了

from restapi import app # the execution stalled here i guess
import unittest
import asyncio
import aiohttp

class AutoRestTests(unittest.TestCase):
    ''' Unit testcases for REST APIs '''

    def setUp(self):
        self.loop = asyncio.new_event_loop()
        asyncio.set_event_loop(None)

    def test_get_metrics_all(self):
        @asyncio.coroutine
        def get_all():
            res = app.test_client.get('/metrics')
            assert res.status == 201
        self.loop.run_until_complete(get_all())
来自restapi.py的

app = Sanic(__name__)
generate_crud(app, [Metrics, ...])
app.run(host='0.0.0.0', port=1337, workers=4, debug=True)

1 个答案:

答案 0 :(得分:4)

最后通过将app.run语句移动到主块

来设法运行unittests
# tiny app server starts here
app = Sanic(__name__)
generate_crud(app, [Metrics, ...])
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=1337, debug=True)
        # workers=4, log_config=LOGGING)

from restapi import app
import json
import unittest

class AutoRestTests(unittest.TestCase):
    ''' Unit testcases for REST APIs '''

    def test_get_metrics_all(self):
        request, response = app.test_client.get('/metrics')
        self.assertEqual(response.status, 200)
        data = json.loads(response.text)
        self.assertEqual(data['metric_name'], 'vCPU')

if __name__ == '__main__':
    unittest.main()