web-dev-qa-db-ja.com

pytest-テストを実行するCLIコマンドからログレベルを指定します

私のチームと私は、Pytest + Jenkinsを使用して製品テストを自動化しています。 pythonの標準ログライブラリを使用して、テスト中、各テストの前後などに適切なログメッセージを取得しています。ログの複数のレイヤーがあり、エラー、警告、情報をログアウトします。 DEBUG。ロガーのデフォルト値はINFOです。テストのプライマリセットアップでロガーオブジェクトを作成し、作成された各オブジェクトに渡すので、すべてのログが同じロガーに送られます。

これまでのところ、新しい機能やテストを開発しているときは、ローカルでDEBUGモードで作業しており、SVNに新しいコードを送信するときにINFOに戻しますが、CLIを使用してログレベルを変更するオプションを追加しようとしていますが、簡単に実装できるものは見つかりませんでした。フィクスチャの使用を検討しましたが、私が理解していることから、これらはテスト自体のためのものであり、セットアップ/ティアダウンフェーズのためのものではなく、ログはテストに関係なく作成されます。ログレベルの変更をサポートするためにCLIコマンドにPytestオプションを追加する方法に関するハックやアイデアはありますか?

8
Avishay Cohen

pytestコマンドラインオプションコマンドラインの例からのpythonログレベル を組み合わせると、次のことができます。

以下をconftest.pyに追加します。

import pytest
import logging


def pytest_addoption(parser):
    parser.addoption(
        "--log", action="store", default="WARNING", help="set logging level"
    )


@pytest.fixture
def logger():
    loglevel = pytest.config.getoption("--log")
    logger = logging.getLogger(__name__)

    numeric_level = getattr(
        logging,
        loglevel.upper(),
        None
    )
    if not isinstance(numeric_level, int):
        raise ValueError('Invalid log level: %s' % loglevel)

    logger.setLevel(numeric_level)
    return logger

次に、テストでloggerフィクスチャをリクエストします

def test_bla(logger):
    assert True
    logger.info("True is True")

次に、次のようにpytestを実行します

py.test --log INFO

ログレベルをINFOに設定します。

1
Nils Werner

--log-cli-level=INFOをお試しください

お気に入り:

pytest -vv -s --log-cli-level=INFO --log-cli-format="%(asctime)s [%(levelname)8s] %(message)s (%(filename)s:%(lineno)s)" --log-cli-date-format="%Y-%m-%d %H:%M:%S" ./test_file.py
5
EXLsunshine

これは現在、pytestに組み込まれています。テストを実行するときは、コマンドラインに「--log-level =」を追加するだけです。例えば:

pytest --log-level=INFO

ドキュメントの更新はここにあります: https://docs.pytest.org/en/latest/logging.html

2
Edwin H