tqdm プログレス バーが実際に呼び出されたことを確認する単体テストを作成するにはどうすればよいですか? file
また、 kwarg を指定していない場合にプログレス バーの出力を取得するにはどうすればよいですsys.stderr
か (この場合、デフォルトで に設定する必要があります)。
を使用して出力をキャッチしようとしcontextlib.redirect_stderr
ましたが、うまくいきませんでした (詳細については以下を参照してください)。
これが私がテストしたいものです。に従ってプログレスバーを使用する方法がありますself.use_progress_bar
。オブジェクトはマルチプロセッシングのために漬けられるので、プログレスバーを所有することはできません。
def awesome_method(self):
if self.use_progress_bar:
progress_bar = tqdm.tqdm(total=self.match_generator.size,
desc="Playing matches")
if self.filename is not None:
file = open(self.filename, 'w')
writer = csv.writer(file, lineterminator='\n')
for chunk in chunks:
results = self._play_matches(chunk)
self._write_interactions(results, writer=writer)
if self.use_progress_bar:
progress_bar.update(1)
プログレスバーがあることを確認する単体テストを書きたいと思います。私は次のようなものを試しました:
import unittest
import MyAwesomeClass
from contextlib import redirect_stderr
import io
class TestMyCode(unittest.TestCase):
def test_progress_bar(self):
err = io.StringIO()
with redirect_stderr(err):
awesomeness = MyAwesomeClass(use_progress_bar=True)
awesomeness.awesome_method()
self.assertIn("Playing matches", err.getvalue())
しかしerr
空です。問題は、ファイルを使用して tqdm をインスタンス化しない場合、デフォルトで sys.stderr になりますが、コンテキスト マネージャー内のものではないことにあるようです。これを実行しようとしたとき:
def action():
err = io.StringIO()
with redirect_stderr(err):
pbar = tqdm.tqdm(range(5))
print('pbar: ', pbar.fp)
print('err: ',err)
print('stderr:', sys.stderr)
pbar.update()
pbar.update()
return err
if __name__ == '__main__':
err = action()
print('\nstart\n', err.getvalue(), '\nstop\n')
print(sys.stderr)
これは出力でした(キャプチャできなかったpbar出力を差し引いたもの):
pbar: <colorama.ansitowin32.StreamWrapper object at 0x0000000002A18D68>
err: <_io.StringIO object at 0x0000000002A8B318>
stderr: <_io.StringIO object at 0x0000000002A8B318>
start
stop
<colorama.ansitowin32.StreamWrapper object at 0x0000000002A18D68>
そのため、コンテキスト マネージャー (プログレス バーがインスタンス化されている場所) ではsys.stderr
を指しerr
ますが、tqdm のデフォルトのは、コンテキスト マネージャーにあるにもかかわらずself.fp = sys.stderr
、まだ実数を取得しています。sys.stderr
どうして?!?!?!?また、tqdm オブジェクトに設定せずに進行状況バーをテストするにはどうすればよいですか?file=