1

我正在使用 Python 的日志记录模块在特定情况下生成错误消息,然后是 sys.exit()。

if platform is None:  
    logging.error(f'No platform provided!')
    sys.exit()

Continue do other stuff

现在我正在使用 pytest 对特定的错误消息进行单元测试。但是 sys.exit() 语句会导致 pytest 由于 SystemExit 事件而检测到错误,即使错误消息通过了测试。

并且嘲笑 sys.exit 使得其余代码正在运行('继续做其他事情'),然后导致其他问题。

我尝试了以下方法:

LOGGER = logging.getLogger(__name__)

platform = None
data.set_platform(platform, logging=LOGGER)
assert "No platform provided!" in caplog.text

这个问题类似:How to assert both UserWarning and SystemExit in pytest,但它以不同的方式引发错误。

如何让 pytest 忽略 SystemExit?

4

1 回答 1

1

这是一种方法。

在您的测试模块中,您可以编写以下测试,其中your_module是定义实际代码的模块的名称,并且function()是执行日志记录和调用的函数sys.exit()

import logging
from unittest import mock
from your_module import function

def test_function(caplog):
    with pytest.raises(SystemExit):
        function()

    log_record = caplog.records[0]
    assert log_record.levelno == logging.ERROR
    assert log_record.message == "No platform provided!"
    assert log_record.lineno == 8   # Replace with the line no. in which log is actually called in the main code.

(如果你想稍微缩短一点,你可以使用record_tuples代替records。)

编辑:使用caplog而不是模拟日志模块。

于 2021-06-04T08:13:34.233 回答