PyTest - 生产代码中的日志记录

3 投票
1 回答
625 浏览
提问于 2025-04-28 13:22

我有一个简单的模块,里面包含一些工具方法,比如密码解密和文件夹删除,这些方法会被代码中的其他模块使用。我正在尝试为这些方法编写单元测试。

这个模块还引入了另一个模块,叫做LogFactory,它负责处理日志记录和日志配置。

simplemodule.py

from log import LogFactory

log = LogFactory.getlogger(__name__)

def decrypt(pass, key):
   #magic
   log.debug(message)

问题出现在这里。日志配置是通过一个INI文件传递给LogFactory模块中的日志模块的。整个Python代码是通过一个shell脚本运行的,这个脚本在运行Python模块之前会替换INI文件中的某些条目。所以在生产环境中,一切都能顺利进行。

但问题是,当pytest导入第一个生产代码时,如果日志记录所需的值没有被shell脚本替换,就会出现错误。

test_simplemodule.py

import simplemodule <----- ERROR, needed values absent from the INI

def test_decryption():
   #test code

目前我在编写测试时没有包含日志条目。但我最终需要在后面加入这些日志条目。

1) 在设计上,我在工具方法的日志记录方面做错了什么?我觉得问题出在生产代码上,因为我无法为它正确编写单元测试。

2) 我尝试过Monkeypatching,但意识到错误是在导入生产代码时出现的。

3) 在这种情况下,标准做法是什么?是放弃单元测试,转而进行某种端到端的自动化测试吗?

暂无标签

1 个回答

2

首先,这段话提到你可能需要重新整理一下日志记录的代码,避免在导入时做一些副作用的事情。正如你刚刚发现的,在导入时做任何事情可能会带来麻烦。

一旦这个问题解决了,你就可以轻松创建一个自动使用的测试工具,这个工具会在测试时创建一个(虚拟的)日志记录实例。这个过程可以非常简单,比如所有的日志记录都不做任何事情,或者把日志存起来以便在测试断言中检查(可以参考pytest-capturelog,它为标准库的日志记录提供了这样的工具)。

如果你真的无法重新整理你的日志模块,你可以通过在pytest_configure()这个钩子里创建正确的INI文件来解决这个问题(然后在pytest_unconfigure()中恢复它,这个钩子会在py.test进行测试收集之前被调用,所以在尝试导入任何东西之前)。

撰写回答