通过stderr

时间:2017-02-16 16:07:08

标签: python unit-testing logging

我有一堆单元测试,其中一个我想捕获哪些日志输出到一个变量(意味着它不应该对运行测试的人可见)。在我开始考虑这样做之前,我一直试图让一个简单的测试用例起作用:

import logging
import sys
from cStringIO import StringIO


logging.basicConfig(stream=sys.stderr)
logger = logging.getLogger(__name__)

class Abc():

    @staticmethod
    def pr():
        logger.setLevel("WARN")

        old_stderr = sys.stderr 
        sys.stderr = mystderr = StringIO()
        logger.warn('bla bla bla')
        sys.stderr = old_stderr
        print mystderr.getvalue()


if __name__ == '__main__':
    Abc.pr()

但事实并非如此。它输出:

WARNING:__main__:bla bla bla
(empty line from print)

我做错了什么?

1 个答案:

答案 0 :(得分:1)

CausesValidation = true是指向对象的指针。因此,首先调用CausesValidation = false会将记录器的流设置为有效流。

稍后更改为Validating只会更改sys.stderr指向的内容,但不会更改记录器内的内容。

我建议如下:

logging.basicConfig(stream=sys.stderr)