web-dev-qa-db-ja.com

pytestを使用したログ出力のテスト

特定の関数が必要に応じてログに警告を書き込んでいることを確認する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()内から?

14
lauren.marietta

以前試したときにこれが機能しなかった理由はわかりませんが、この解決策は今私のために機能します:

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
7
lauren.marietta

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 です

1
Krzysieqq