用 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

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

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

如果尝试更直接的方法(如 sys.stdout.getvalue()) ,也会发生同样的情况。这是令人困惑的,因为 run_function()正在写入终端,所以我认为可以从 stdout访问... ?

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

49025 次浏览

我不知道为什么我之前尝试的时候这个方法不起作用,但是现在这个方法对我很有效:

在 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

test_module.py应该是这样的:

import logging
from module import run_function


LOGGER = logging.getLogger(__name__)


def test_func(caplog):
with caplog.at_level(logging.WARNING):
run_function()
assert 'Something bad happened!' in caplog.text

或者,也可以说:

import logging
from module import run_function


LOGGER = logging.getLogger(__name__)


def test_func(caplog):
caplog.set_level(logging.WARNING)
run_function()
assert 'Something bad happened!' in caplog.text

Pytest 捕获日志记录的文档是 给你

在日志记录设置中,选中 propagate设置为 True,否则 caplog 处理程序将无法查看日志记录消息。

我还想为将来遇到这个问题的任何人添加到这个线程中。你可能需要

@pytest.fixture(autouse=True)

作为测试中的装饰器,以便测试可以访问 caplog 装置。

我也有同样的问题。我只是在 test 函数中明确地提到了模块的名称,而不是 姓名,并且将傳播属性设置为 True。

注意: 模块应该是要测试脚本的目录。

Def test _ func () :

LOGGER = logging.getLogger("module")
LOGGER.propagate = True
run_function()
~ somehow get the stdout/log of run_function() ~
assert 'Something bad happened!' in output