logging - 即使禁用了日志文件捕获,Pytest 也会捕获日志文件
问题描述
运行 pytest--capture=sys
应该只捕获 stdout/stderr,但如果我这样做--tb=auto --capture=sys
,回溯仍然包括应该只路由到日志文件的调试语句。即使使用-s
.
我有很多调试语句被记录到我不想在控制台上看到的文件中。所以我将我的logging.StreamHandler
记录器设置为logging.INFO
和logging.FileHandler
设置为logging.DEBUG
.
当我运行测试时,如果出现故障并打印回溯,如果我使用and ,它总是会打印Captured log call
and部分。阻止这种情况发生的唯一方法是使用,但随后我会丢失有价值的回溯信息。Captured stdout call
--tb=auto
--tb=short
--tb=no
最小的例子(我称之为文件test_basic.py
):
import logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler(filename="log.txt")
fh.setLevel(logging.DEBUG)
logger.addHandler(fh)
sh = logging.StreamHandler()
sh.setLevel(logging.INFO)
logger.addHandler(sh)
def test_one():
logger = logging.getLogger("test_one")
logger.info("Logging at INFO level")
logger.debug("Logging at DEBUG level")
assert False
输出python -m pytest --tb=auto --capture=sys
:
==================================================== FAILURES ====================================================
____________________________________________________ test_one ____________________________________________________
def test_one():
logger = logging.getLogger("test_one")
logger.info(f"Logging at INFO level")
logger.debug(f"Logging at DEBUG level")
> assert False
E assert False
test_basic.py:19: AssertionError
---------------------------------------------- Captured stderr call ----------------------------------------------
Logging at INFO level
----------------------------------------------- Captured log call ------------------------------------------------
INFO test_one:test_basic.py:17 Logging at INFO level
DEBUG test_one:test_basic.py:18 Logging at DEBUG level
============================================ 1 failed in 0.09 seconds ============================================
期望的输出:
==================================================== FAILURES ====================================================
____________________________________________________ test_one ____________________________________________________
def test_one():
logger = logging.getLogger("test_one")
logger.info(f"Logging at INFO level")
logger.debug(f"Logging at DEBUG level")
> assert False
E assert False
test_basic.py:19: AssertionError
---------------------------------------------- Captured stderr call ----------------------------------------------
Logging at INFO level
============================================ 1 failed in 0.09 seconds ============================================
如果我使用--tb=no
我会删除该Captured log call
部分,但也会删除所有回溯信息:
============================================== test session starts ===============================================
test_basic.py F [100%]
============================================ 1 failed in 0.07 seconds ============================================
我怎样才能达到我的预期行为?
解决方案
答案是--show-capture=stdout
。
不过,禁用捕获并不会这样做,这有点令人困惑。我本来想-s
覆盖--show-capture=all
(默认)。
推荐阅读
- django - Django 中的 .add() 方法未添加多对多关系条目
- flutter - NestedScrollView 标头中的 Flutter SliverAppbar 不会像在 CustomScrollView 中那样拉伸和缩放
- javascript - 使用 math.min 在对象列表中查找最小数字的最佳方法?
- c++ - Windows 上的 Qt 和 cmake:LNK2019 未解决的外部符号错误
- android - 获取自定义视图的项目
- html - 如何将逗号分隔的json数组放入来自ngFor的span标签中,角度为8
- kotlin - Kotlin - if 语句无法正常工作
- c++ - websocketpp 连接失败,asio.system 错误代码 10057
- python - 按特定索引值过滤具有 MultiIndex 的数据帧
- python - 这个 Python 代码有什么问题?权限错误:[Errno 13]