首页 > 解决方案 > 使用 pytest 测试日志输出

问题描述

我正在尝试使用 pytest 编写一个测试,以检查特定函数是否在需要时将警告写入日志。例如:

在 module.py 中:

import logging
LOGGER = logging.getLogger(__name__)

def run_function():
    if something_bad_happens:
        LOGGER.warning('Something bad happened!')

在 test_module.py 中:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func():
    LOGGER.info('Testing now.')
    run_function()
    ~ somehow get the stdout/log of run_function() ~
    assert 'Something bad happened!' in output

capsys我已经看到,您可以通过将或caplog作为参数传递给测试,然后使用capsus.readouterr()caplog.records访问输出来获取日志或使用 pytest 的 stdout/stderr 。

但是,当我尝试这些方法时,我只看到“现在测试。”,而不是“发生了不好的事情!”。似乎run_function()无法从 ? 访问调用中发生的日志记录输出test_func()

如果我尝试更直接的方法,例如sys.stdout.getvalue(). 哪个令人困惑,因为run_function()正在写入终端,所以我认为可以从stdout...访问?

基本上,有谁知道我如何访问“发生了不好的事情!” 从内部test_func()

标签: pythonunit-testingtestingloggingpytest

解决方案


我不知道为什么我以前尝试过它时这不起作用,但是这个解决方案现在对我有用:

在 test_module.py 中:

import logging
from module import run_function

LOGGER = logging.getLogger(__name__)

def test_func(caplog):
    LOGGER.info('Testing now.')
    run_function()
    assert 'Something bad happened!' in caplog.text

推荐阅读