如何在Python中使用logging模块与unittest模块?

8
我想使用Python日志模块记录所有来自unittest的输出,以便将其纳入我正在尝试编写的测试框架中。这样做的目的是使用两组输出运行测试,一组为简单输出,告诉测试用例步骤,另一组为更详细的调试级别输出,以便在出现问题时我们拥有尽可能多的信息。输出将放置在两个文件中,一个可以通过电子邮件发送给其他人,另一个则保留以防失败。我注意到TextTestRunner可以使用流,这是否可以与日志模块一起使用?我计划使用Python 2.7中的一些新功能。
1个回答

1

你可以这样做,但我不确定这是最好的方法。

对于这个方法,你需要:

  1. 实例化一个内存流,可以被TextTestRunner使用。这种情况下,io.StringIO几乎是完美的选择,但它只能处理Unicode输入,而且我不确定TextTestRunner是否能正确地将Unicode写入流中。另一种选择是编写自己的内存流,以满足你的需求,可能需要用编码器包装StringIO

  2. 创建自己的TextTestRunner,并用这个内存流进行初始化。

  3. 创建一个从流中读取并写入日志的类。

这可以很简单,例如:

class StreamLogger(object):
    def __init__(self, input_stream, output_logger):
        self.input_stream = input_stream
        self.output_logger
    def run(self):
        while True:
            line = input_stream.readline()
            if not line:
                break
            output_logger.error(line)

这种方法存在的问题:

  • 在将TextTestRunner输出的不同部分定向到不同的日志级别方面,您没有太多的灵活性。
  • 如果配置不正确,TextTestRunner会写入一堆您可能不想要的东西。默认的冗长度为1,这将在测试时写入进度点...这可能只会妨碍您在日志输出中的工作。
  • 如果您天真地这样做,您将只在将所有输出写入流之后才调用stream_logger.run()。因此,您将无法实时获得日志输出,并且您的日志时间戳将无用。您可以通过生成一个单独的线程来解决这个问题,例如,但然后您需要选择/滚动一个可以同时处理读取器和编写器线程的流,或者分叉一个进程并放弃内存中的流,或者进行相对复杂的操作。

我建议的方法是放弃流,简单地滚动自己的测试运行程序-称为LoggingTestRunner-以按照您想要的方式将测试输出写入记录器。这将使您避免这三个问题。


谢谢。那听起来就是我需要做的事情,对于我需要完成的其他一些事情也是如此。 - user197674

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接