環境: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()
tornado.gen.coroutineでテストメソッドをデコレートし、 "yield from"を使用しようとしましたが、インタプリタがクラッシュしました。 – nagylzs
'pytest'を使うことができます – Juggernaut