Python 如何在行车日志上使用冷冻枪

Python 如何在行车日志上使用冷冻枪,python,pytest,freezegun,logbook,Python,Pytest,Freezegun,Logbook,我正在尝试在日志中运行涉及模拟datetime的测试(用于logbook.TimedRotatingFileHandler的逻辑)。但冰枪并没有拿到航海日志。日志打印为当前(未模拟,正确)当前时间 我的示例显示了令人困惑的消息 [2019-07-09 22:01:21.583288] INFO: None: test time: 2000-01-01 00:01:00 对于下面的pytest from freezegun import freeze_time import logbook im

我正在尝试在日志中运行涉及模拟datetime的测试(用于
logbook.TimedRotatingFileHandler
的逻辑)。但冰枪并没有拿到航海日志。日志打印为当前(未模拟,正确)当前时间

我的示例显示了令人困惑的消息

[2019-07-09 22:01:21.583288] INFO: None: test time: 2000-01-01 00:01:00
对于下面的pytest

from freezegun import freeze_time
import logbook
import sys
import datetime as dt

def test_logbook():
    faketime = freeze_time('2000-01-01 00:01')
    faketime.start()
    assert dt.datetime.now().strftime('%Y%d%m') == '20000101'
    log = logbook.Logger()
    log.handlers.append(logbook.StreamHandler(sys.stdout))
    log.info('test time: ' + str(dt.datetime.now()))
    faketime.stop()
    assert 0

您在导入
日志后冻结了时间,没有涵盖模块级的一些初始化。在时间冻结的范围内移动导入;例如:

from freezegun import freeze_time
import sys
import datetime as dt

def test_logbook(capsys):
    with freeze_time('2000-01-01 00:01'):
        import logbook
        assert dt.datetime.now().strftime('%Y%d%m') == '20000101'
        log = logbook.Logger()
        log.handlers.append(logbook.StreamHandler(sys.stdout))
        log.info('hello world')
    assert capsys.readouterr().out == '[2000-01-01 00:01:00.000000] INFO: None: hello world\n'

令人惊叹的!如果我使用--noconftest运行该测试,它将通过。我的configtest.py导入一个导入日志的文件(带有我正在测试的函数),因此我认为在导入之前我无法获得feeztime。也许这是另一个问题。也感谢capsys。我不知道!很高兴我能帮忙!全局冻结时间确实很棘手,有时甚至需要动态导入(通过
importlib
),但肯定是可行的。我通常在
pytest\u configure
hook中定义并启动一个全局冻结器,并将所有受影响的导入(如
datetime
)移动到fixture/hook中,然后在
pytest\u unconfigure
中停止冻结器。如果你在一个新的问题上发表一篇文章,我很乐意帮忙。