如何在python中使用单元测试模块的日志记录模块?

时间:2010-07-27 19:11:14

标签: python unit-testing logging

我想使用python日志记录模块记录unittest的所有输出,以便我可以将它合并到我试图编写的测试框架中。这样做的目的是使用2组输出运行测试,一组具有简单输出,告诉测试用例步骤和更多调试级别输出,以便在出现问题时尽可能多地提供信息。输出将被放入两个文件中,一个可以通过电子邮件发送给人们,另一个可以保存。我注意到TextTestRunner可以使用流,这可以用于日志记录模块吗?我打算在python 2.7中使用一些新功能。

1 个答案:

答案 0 :(得分:1)

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

对于这种方法,你会:

  1. 实例化TextTestRunner可以使用的内存中的流。这是io.StringIO几乎完美的事情,除了它只适用于Unicode输入,我不确定TextTestRunner是否正确地将Unicode写入流。您的另一个选择是编写您自己的内存流,以满足您的目的,可能用编码器包裹StringIO

  2. 创建您自己的TextTestRunner并使用此内存中的流初始化它。

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

  4. 这可以很简单:

    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 - 它将测试输出以你想要的方式输出到记录器。这样可以避免所有这三个问题。