python - Pytest 日志记录忽略 pytest.ini 中的选项
问题描述
我有一个正在运行的测试:
pytest --capture=no --verbose --rootdir=testing/ testing/tests/docker_test.py
从/home/user/development/
. 该测试检查某些容器是否正在运行并使用 Python 3.6 的默认日志记录框架。测试文件里面的logger配置如下:
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 日志记录中的时间戳?
解决方案
我猜你缺少的是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 代表什么
日志记录文档对此有点简洁:
创建 LogRecord 的人类可读时间。默认情况下,格式为“2003-07-08 16:49:45,896”(逗号后面的数字是时间的毫秒部分)。
但是,asctime
这并不意味着记录将始终使用格式化time.asctime
- 它只是您不将自己的日期时间格式传递给logging.Formatter
(格式化程序构造函数中的第二个参数)时使用的默认日期时间格式。
推荐阅读
- .net - 在 http 请求中找不到 Saml2 响应
- javascript - 当我传递一个引用字符串的错误语句时,while循环不会停止
- php - mysqli 日期结果显示随机日期
- android - Android Studio 项目的自动版本控制
- python - 如何在 Mac (OS X) 中安装不同版本的 Python
- azure-active-directory - 使用 Swagger UI 获取 AzureAD 隐式流
- php - 带有模型的 Laravel 表单
- .net - MAC OS/Linux 中的 Serilog RollingFile 路径问题
- prolog - prolog 是解决数独或类似扫雷游戏的好语言吗
- c - leetcode二叉树遍历上的heap-use-after-free