pytest-从运行测试的CLI命令指定日志级别

Avi*_*hen 5 python linux logging command-line-interface pytest

我的团队和我正在使用Pytest + Jenkins使我们的产品测试自动化。我们一直使用python的标准Logging库在测试期间,每次测试之前和之后获取正确的日志消息等。我们具有多层日志记录,我们注销ERROR,WARNING,INFO和DEBUG。我们的记录器的默认值为INFO。我们在测试的主要设置中创建了记录器对象,并将其传递给创建的每个对象,因此我们的所有日志都转到同一记录器。

到目前为止,当我们开发新功能或测试时,我们在本地以DEBUG模式工作,并在将新代码提交给SVN时将其更改回INFO,但是我试图添加使用CLI更改日志记录级别的选项,但是我还没有发现容易实现的东西。我曾经考虑过使用夹具,但据我了解,这些夹具仅用于测试本身,而不是用于安装/拆卸阶段,并且创建日志时所涉及的测试较少。关于如何在CLI命令中添加Pytest选项以支持更改日志记录级别的任何技巧或想法?

小智 15

这现在内置在 pytest 中。运行测试时,只需在命令行中添加“--log-level=”即可。例如:

pytest --log-level=INFO
Run Code Online (Sandbox Code Playgroud)

文档更新可以在这里找到:https : //docs.pytest.org/en/latest/logging.html

  • 谢谢,这比禁用第三方模块日志记录的“--log-cli-level”效果更好。 (3认同)
  • 奇怪的是,这对我、我的图书馆和第三方都不起作用。 (2认同)

Nil*_*ner 11

Pytest 3.5 引入了一个参数

pytest --log-cli-level=INFO
Run Code Online (Sandbox Code Playgroud)

对于 3.5 之前的版本,您可以结合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
Run Code Online (Sandbox Code Playgroud)

然后logger在您的测试中请求夹具

def test_bla(logger):
    assert True
    logger.info("True is True")
Run Code Online (Sandbox Code Playgroud)

然后像这样运行 pytest

py.test --log INFO
Run Code Online (Sandbox Code Playgroud)

将日志级别设置为INFO.


EXL*_*ine 5

尝试 --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
Run Code Online (Sandbox Code Playgroud)