2

環境: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() 
+0

試圖用tornado.gen.coroutine來裝飾測試方法,並使用「yield from」但崩潰解釋器。 – nagylzs

+0

你可以使用'pytest' – Juggernaut

回答

2

而不是使用self.wait/self.stop的回調,你可以等待「抓取」通過在「等待」表達式中使用它來完成:

import unittest 

from tornado.httpclient import AsyncHTTPClient 
from tornado.testing import AsyncTestCase, gen_test 


class MyTestCase2(AsyncTestCase): 
    @gen_test 
    async def test_http_fetch(self): 
     client = AsyncHTTPClient(self.io_loop) 
     response = await client.fetch("http://www.tornadoweb.org/") 
     # Test contents of response 
     self.assertIn("FriendFeed", response.body.decode()) 

unittest.main() 

其他我不得不在你的代碼中做出的改變是在body上調用「decode」,以便將正文(字節)與字符串「FriendFeed」進行比較。

+0

你應該調用tornado.testing.main()而不是unittest.main()。非常有趣的是,你的代碼工作,但我最小的工作示例不起作用。我要更新問題 – nagylzs

+0

我的例子也適用,如果我用unittest.main()替換tornado.testing.main() - 但我不知道爲什麼? – nagylzs