特定の関数が必要に応じてログに警告を書き込んでいることを確認するpytestを使用して、テストを記述しようとしています。例えば:
Module.py:
_import logging
LOGGER = logging.getLogger(__name__)
def run_function():
if something_bad_happens:
LOGGER.warning('Something bad happened!')
_
Test_module.py:
_import logging
from module import run_function
LOGGER = logging.getLogger(__name__)
def test_func():
LOGGER.info('Testing now.')
run_function()
~ somehow get the stdout/log of run_function() ~
assert 'Something bad happened!' in output
_
テストにcapsys
またはcaplog
を引数として渡し、capsus.readouterr()
を使用することで、pytestでログまたはstdout/stderrを取得できると思いました。または_caplog.records
_出力にアクセスします。
しかし、これらの方法を試してみると、「今テストしています」としか表示されず、「何か問題が発生しました!」と表示されません。 run_function()
の呼び出し内で発生しているログ出力にtest_func()
からアクセスできないようです。
sys.stdout.getvalue()
などのより直接的な方法を試しても同じことが起こります。 run_function()
が端末に書き込んでいるので、どちらが混乱しているので、stdout
...からアクセスできると思いますか?
基本的に、誰かが私にアクセスする方法を知っていますか? test_func()
内から?
以前試したときにこれが機能しなかった理由はわかりませんが、この解決策は今私のために機能します:
Test_module.py:
import logging
from module import run_function
LOGGER = logging.getLogger(__name__)
def test_func(caplog):
LOGGER.info('Testing now.')
run_function()
assert 'Something bad happened!' in caplog.text
test_module.py
は次のようになります。
import logging
from module import run_function
LOGGER = logging.getLogger(__name__)
def test_func(caplog):
with caplog.at_level(logging.WARNING):
run_function()
assert 'Something bad happened!' in caplog.text
または:
import logging
from module import run_function
LOGGER = logging.getLogger(__name__)
def test_func(caplog):
caplog.set_level(logging.WARNING):
run_function()
assert 'Something bad happened!' in caplog.text
Pytestキャプチャログのドキュメントは here です