【发布时间】:2014-10-23 16:28:38
【问题描述】:
我在 python 中有一个多模块包。其中一个模块本质上是一个命令行应用程序。我们将其称为“顶级”模块。另一个模块中包含三个类,它们本质上是应用程序的后端。
顶级模块,在它的类的 init 中,执行 logging.basicConfig 以将调试记录到文件中,然后为 info 及以上添加一个控制台记录器。后端类只使用getLogger(classname),因为当应用程序完全运行时,后端会被顶层命令行前端调用,所以日志已经配置好了。
在 Test 类(从 unittest.TestCase 子类化并通过鼻子运行)中,我只需在 setup 中运行 testfixtures.LogCapture(),在 tearDown 中运行 testfixtures.LogCapture.uninstall_all(),所有的日志记录都被很好地捕获,不费吹灰之力。
在后端测试文件中,我尝试做同样的事情。我在设置中运行 testfixtures.LogCapture,在拆卸中运行uninstall_all。但是,当我为后端运行单元测试时,仍然会打印所有“INFO”级别的日志消息。
任何帮助
1) 为什么日志捕获适用于前端而不适用于后端
2) 一种优雅的方式,能够在我的后端类中记录和捕获日志,而无需在这些文件中明确设置日志记录。
会很棒。
【问题讨论】:
-
结果是,如果我同时运行任一测试文件(每个模块一个文件),那么我就没有日志记录问题。只有当我一起运行它们时,我才会将日志行打印到控制台。
-
我还发现,如果我将后端测试文件重命名为在前端之前运行的文件,它就可以工作。我目前的猜测是,由于 basicConfig 不可覆盖,因此执行 basicConfig 会以某种方式继承第二个测试文件未使用的流,因此不起作用。我将尝试以不同的方式配置我的记录器。
标签: python logging unit-testing