2

環境:Python 3、竜巻4.4。メソッドが非同期であるため、通常のunittestは使用できません。非同期コードの単体テストを行う方法については、ttp://www.tornadoweb.org/en/stable/testing.htmlを参照してください。しかし、それは竜巻コルーチンだけで動作します。私がテストしたいクラスは、非同期のdef文を使用しており、このようにテストすることはできません。竜巻+非同期defのためのunittestを行う方法は?

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) 

しかし、私の方法は、このように宣言されています:たとえば、ここにASyncHTTPClient.fetchとそのコールバックパラメータを使用したテストケースがある

クラスの接続: 非同期デフ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 

何のトレースバックはありません。しかし、tornado.testing.main()をunittest.main()に置き換えると、突然動作します。

なぜですか?私はasnyc単体テストでは、tornado.testing.main(http://www.tornadoweb.org/en/stable/testing.html#tornado.testing.main)を使用する必要があると推測しました。

私は混乱しています。

更新日2:これはトルネードテストのバグです。回避策:

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

その他:代わりにself.wait/self.stopコールバックを使用しての

all = MyTestCase2 
main() 
+0

tornado.gen.coroutineでテストメソッドをデコレートし、 "yield from"を使用しようとしましたが、インタプリタがクラッシュしました。 – nagylzs

+0

'pytest'を使うことができます – Juggernaut

答えて

2

、あなたは「待つ」という表現で、それを使用して完了するために、「フェッチ」を待つことができますあなたのコードで変更しなければならないのは、文字列である "FriendFeed"と本文(バイト)を比較するために本文の "decode"を呼び出すことです。

+0

unittest.main()の代わりにtornado.testing.main()を呼び出すことになっています。非常に興味深いことに、あなたのコードは動作しますが、私の最小限の動作例は機能しません。私は質問を更新するつもりです – nagylzs

+0

私の例は、tornado.testing.main()をunittest.main()に置き換えても動作しますが、なぜわかりませんか? – nagylzs

関連する問題