2017-05-17 94 views
1

我正在使用peewee ORM和sanic(sanic-crud)作爲應用程序服務器來構建CRUD REST API。事情工作正常。我也寫了幾個單元測試的例子。python unitests for sanic app

但是,我正在面臨運行unittests的問題。問題在於unittests啓動sanic應用服務器並在那裏停滯不前。它沒有運行unittest的例子。但是當我手動按下Ctrl + C時,sanic服務器終止並且unittests執行開始。所以,這意味着應該有一種方法來啓動sanic服務器,並在最後繼續進行unittests運行並終止服務器。

有人能請我正確的方式寫sanic應用程序的單元測試案例嗎?

我也跟着官方文檔,但沒有運氣。 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) 
+0

'app.run'應該在'if __name__ =='__main __':'塊內調用。 – dirn

+0

@dirn如何將應用程序導入到測試文件中呢? –

+0

導入不會更改。 – dirn

回答

3

終於通過移動app.run語句主塊運行單元測試

# 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()