Python初心者です。回答得られず困ってます。
Pythonにて、単体テストを記載しておりまして、以下のようなmainクラスの単体テストを書いております。
Pythonのバージョンは3.8となります。
テストの期待する結果としては、タイムアウトが発生した時に正しくタイムアウトエラーが
発生することを目的としてます。
メソッド自体の働きとしてmainメソッドでhoge.fuga()
を実施します。
その際にタイムアウトがfugaで発生したらexcept asyncio.TimeoutError:
に飛ばすようにしております。
ただ、タイムアウトが発生したあともタスクは実行するという形にしております。
こちらのソースが実際に動くことは検証済です。
- 実処理を行うソースコード
Python
1import logging 2import traceback 3import asyncio 4import os 5from hoge import fuga 6from get_file import get_file 7from datetime import datetime 8from dotenv import load_dotenv 9 10async def main(): 11 logging.basicConfig(level=logging.INFO) 12 logger = logging.getLogger(__name__) 13 load_dotenv(override=True) 14 logger.info(f"start {datetime.now()}") 15 task = asyncio.create_task(fuga(get_file())) 16 try: 17 await asyncio.wait_for(asyncio.shield(task), timeout=60) 18 19 except asyncio.TimeoutError: 20 logger.warning( 21 f"WARNING\nTIMEOUT") 22 except Exception as e: 23 logger.critical(f"ERROR\n{traceback.format_exc()}") 24 # タイムアウト後も実行されているので、終了を待機する 25 await task 26 logger.info(f"end {datetime.now()}") 27 28if __name__ == '__main__': 29 loop = asyncio.get_event_loop() 30 loop.run_until_complete(main())
現状のテストコードは以下のように記載してますが、全然うまく書けてない状態です。
元コードのmain()で呼ばれるhoge.fuga()での処理をmockとしてスリープを実施する_mock_fuga()
を用意しております。
- テストコード
Python
1from test.support import captured_stdout 2from testfixtures import LogCapture 3import logging 4import os 5import sys 6import time 7 8 9testdir = os.path.dirname(__file__) 10srcdir = '../src' 11sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir))) 12 13import unittest 14from src.main import main 15from unittest import mock 16 17class TestMain(unittest.TestCase): 18 def _mock_fuga(self): 19 """fugaの処理のモック""" 20 time.sleep(15) 21 pass 22 23 @mock.patch("src.hoge.fuga", new=_mock_fuga) 24 def test_delayed_time(self): 25 with LogCapture() as l: 26 main() 27 # ログ出力の文字列として`WARNING`と`TIMEOUT`という文字列があるかのチェック 28 l.check_present( 29 ("root", "WARNING", "WARNING") 30 ) 31 l.check_present( 32 ("root", "WARNING", "TIMEOUT") 33 ) 34
以上、ちょっと言葉足らずのところがあるかもしれませんが、心優しいご回答お待ちしております。
宜しくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。