【问题标题】:how to use freezegun on logbook如何在日志上使用冻结枪
【发布时间】:2019-11-19 12:28:48
【问题描述】:

我正在尝试运行涉及在日志中模拟日期时间的测试(用于 logbook.TimedRotatingFileHandler 周围的逻辑)。但是freezegun没有到达日志。日志打印为当前(未模拟,正确)当前时间!

我的示例打印出令人困惑的消息

[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

【问题讨论】:

    标签: python pytest freezegun logbook


    【解决方案1】:

    在导入logbook 后,您正在冻结时间,而不是覆盖模块级别的一些初始化。在冻结时间的范围内移动导入;示例:

    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 导入了一个导入日志的文件(带有我正在测试的功能) - 所以我认为我不能在导入之前得到 feezetime。也许这是一个不同的问题。还要感谢 capsys。不知道!
    • 很高兴我能帮上忙!全局冻结时间确实很棘手,有时甚至需要动态导入(通过importlib),但肯定是可行的。我通常在pytest_configure 钩子中定义并启动一个全局冷冻器,并将所有受影响的导入(如datetime)移动到固定装置/钩子内,然后在pytest_unconfigure 中停止冷冻器。如果您在新问题中发布 minimal reproducible example,我将很乐意提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2018-06-15
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多