代码之家  ›  专栏  ›  技术社区  ›  Zelphir Kaltstahl

pytest日志记录忽略pytest.ini中的选项

  •  3
  • Zelphir Kaltstahl  · 技术社区  · 6 年前

    我正在进行一项测试:

    pytest --capture=no --verbose --rootdir=testing/ testing/tests/docker_test.py
    

    /home/user/development/ . 测试检查一些容器是否正在运行,并使用python 3.6的默认日志框架。测试文件中的记录器配置如下:

    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    logging.basicConfig(level=logging.INFO, stream=sys.stdout, format="%(asctime)s %(levelname)s %(message)s")
    

    内部测试我使用的记录器如下:

    logger.info(f"TEST SUCCESSFUL: container {container_name} is running")
    logger.info(f"TEST SUCCESSFUL: all required containers are running")
    

    里面 testing (根目录)我有一个文件 pytest.ini :

    [pytest]
    log_level = INFO
    log_cli_level = INFO
    log_format = %(asctime)s %(levelname)s %(message)s
    log_cli_format = %(asctime)s %(levelname)s %(message)s
    log_date_format = %H:%M:%S
    log_cli_date_format = %H:%M:%S
    

    基本上,我不希望任何日期在时间戳中,我希望pytest在运行测试时实时登录到命令行。

    首先我想知道 asctime 代表。它看起来像“ascii时间”。我不想要标准化的时间戳,而是我在 pytest.ini文件 . 所以我也试着用 date , datetime timestamp ,而不是 ASCTIME公司 ,都会导致错误。所以我想 ASCTIME公司 是获取时间戳的唯一方法。

    然而,pytest似乎忽略了我在 pytest.ini文件 文件,虽然是指示它找到了该文件,但在我运行测试时:

    cachedir: testing/.pytest_cache
    rootdir: /home/user/development/testing, inifile: pytest.ini
    

    如何更改pytest日志中的时间戳?

    1 回复  |  直到 6 年前
        1
  •  4
  •   hoefling    6 年前

    我想你缺少的是 log_cli = 1 (或) true / yes /等)在你的 pytest.ini . 除此之外,通过提供的配置,日志记录将以您在中指定的格式打印 log_cli_format . 你甚至可以减少 pytest.ini文件 到:

    [pytest]
    log_cli = 1
    log_cli_level = INFO
    log_cli_format = %(asctime)s %(levelname)s %(message)s
    log_cli_date_format = %H:%M:%S
    

    另外,上面的配置将负责测试会话中的根日志记录器配置,因此您不需要在测试中为实时日志记录配置日志记录器。只需在测试中调用记录器:

    import logging
    
    def test_spam():
        logger = logging.getLogger(__name__)
        logger.info('spam')
        logger.warning('eggs')
        logger.error('bacon')
    

    这将打印:

    $ pytest
    ============================== test session starts ================================
    platform linux -- Python 3.6.5, pytest-3.4.1, py-1.5.3, pluggy-0.6.0 -- /data/gentoo64/usr/bin/python3.6
    cachedir: .pytest_cache
    rootdir: /data/gentoo64/home/u0_a82/projects/stackoverflow/so-50677656, inifile: pytest.ini
    plugins: mock-1.6.3, cov-2.5.1, flaky-3.4.0
    collected 1 item
    
    testing/tests/test_docker.py::test_logs
    ---------------------------------- live log call ----------------------------------
    16:29:12 INFO spam
    16:29:13 WARNING eggs
    16:29:13 ERROR bacon
    PASSED                                                                       [100%]
    ============================ 1 passed in 1.08 seconds =============================
    

    首先我想知道asctime代表什么

    这个 logging docs 有点简洁:

    创建日志记录时的人类可读时间。默认情况下,格式为2003-07-08 16:49:45896(逗号后面的数字是时间的毫秒部分)。

    然而, asctime 并不意味着记录将始终使用 time.asctime -这只是默认的日期时间格式,当您不将自己的日期时间格式传递给 logging.Formatter ( second argument in the formatter constructor )