[解決済み] tornado + async defのunittestはどのように行うのですか?
質問
環境は?Python 3、トルネード4.4。メソッドが非同期なので、通常のunittestsは使えません。ttp://www.tornadoweb.org/en/stable/testing.html、非同期コードのユニットテストの方法を説明しているものがあります。しかし、それはトルネードコルーチンONLYで動作します。私がテストしたいクラスは、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)
しかし、私のメソッドはこのように宣言されています。
クラスConnection: async def get_data(url, *args): # ....
そして、コールバックはありません。テストケースからこのメソッドを呼び出すにはどうすればいいでしょうか?
UPDATEしてください。 Jessieの回答に基づいて、この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 )
混乱しています。
UPDATE 2: tornado.testingのバグです。回避策です。
all = MyTestCase2
main()
解決方法は?
self.wait / self.stopコールバックを使用する代わりに、"await"式の中で使用すれば、"fetch"が完了するのを待つことができます。
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()
このコードで私がしなければならなかった他の変更は、バイトであるボディと文字列である "FriendFeed" を比較するために、ボディ上で "decode" を呼び出すということです。
関連
-
[解決済み】Javaプロジェクト。ApplicationContextのロードに失敗しました
-
[解決済み] async」と「await」の使い方とタイミング
-
[解決済み] Reduxの非同期フローになぜミドルウェアが必要なのか?
-
[解決済み] TDDのためのJavaScriptユニットテストツール
-
[解決済み] 非同期Task<T>メソッドを同期的に実行するにはどうしたらいいですか?
-
[解決済み] async/await関数を並列に呼び出す
-
[解決済み] async/await - タスクとvoidをいつ返すか?
-
[解決済み] Python unittest - assertRaisesの反対?
-
[解決済み】典型的なテストディレクトリ構造でunittestを実行する
-
[解決済み】コンソールアプリのMainメソッドにasync修飾子を指定できない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MOCKITOとは何か、Junitとはどう違うか
-
[解決済み] ユニットテストの妥当なコードカバレッジは何%ですか(とその理由)?[クローズド]です。
-
[解決済み] ユニットテストは努力に値するか?[クローズド]
-
[解決済み] ユニットテストとインテグレーションテストの違いは何ですか?[重複あり]
-
[解決済み] NUnit vs. MbUnit vs. MSTest vs. xUnit.net [終了しました。]
-
[解決済み】ユニットテストと機能テストの違いは何ですか?
-
[解決済み】Unit Testsの一般的な命名規則にはどのようなものがありますか?[クローズド]。
-
[解決済み] クロームの拡張機能をテストするには?
-
[解決済み] GUIをユニットテストするにはどうしたらいいですか?
-
[解決済み] Enzyme - How to access and set <input> value?