環境:Python 3,龍捲風4.4。由於方法是異步的,因此不能使用正常的unittests。有一個ttp://www.tornadoweb.org/en/stable/testing.html,它解釋瞭如何對異步代碼進行單元測試。但是,這隻適用於龍捲風協程。我想測試的類是使用async def語句,並且不能以這種方式進行測試。例如,下面是一個使用ASyncHTTPClient.fetch和其回調參數測試情況:單元測試龍捲風+異步定義?
class MyTestCase2(AsyncTestCase):
def test_http_fetch(self):
client = AsyncHTTPClient(self.io_loop)
client.fetch("http://www.tornadoweb.org/", self.stop)
response = self.wait()
# Test contents of response
self.assertIn("FriendFeed", response.body)
但我的方法聲明如下:
類連接: 異步高清GET_DATA(URL,*參數) : #....
而且沒有回調。如何從測試用例中「等待」這種方法?
UPDATE:基於傑西的答案,我創造了這個MWE:
import unittest
from tornado.httpclient import AsyncHTTPClient
from tornado.testing import AsyncTestCase, gen_test, main
class MyTestCase2(AsyncTestCase):
@gen_test
async def test_01(self):
await self.do_more()
async def do_more(self):
self.assertEqual(1+1, 2)
main()
結果是這樣的:
>py -3 -m test.py
E
======================================================================
ERROR: all (unittest.loader._FailedTest)
----------------------------------------------------------------------
AttributeError: module '__main__' has no attribute 'all'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
[E 170205 10:05:43 testing:731] FAIL
沒有回溯。但是,如果我用unittest.main()替換tornado.testing.main(),它會突然開始工作。
但是爲什麼?我猜測對於asnyc單元測試,我需要使用tornado.testing.main(http://www.tornadoweb.org/en/stable/testing.html#tornado.testing.main)
我很困惑。
UPDATE 2:這是tornado.testing中的一個bug。解決方法:
all = MyTestCase2
main()
試圖用tornado.gen.coroutine來裝飾測試方法,並使用「yield from」但崩潰解釋器。 – nagylzs
你可以使用'pytest' – Juggernaut