Python日志记录模块:如果(只有)断言测试失败,如何将日志保存到文件?

时间:2019-04-11 06:26:15

标签: python python-3.x python-2.7 unit-testing logging

我正在寻找一种优雅且 Pythonic 的解决方案,以使测试将日志保存到文件中,尽管仅在测试失败的情况下 。我想保持简单,并坚持使用Python的内置logging模块。

我当前的解决方案是对每个测试使用断言包装函数:

import unittest

class superTestCase(unittest.TestCase): 
    ...

    def assertWithLogging(self, assertion, assertion_arguments, expected_response, actual_response, *args):
        try:
            assertion(*assertion_arguments)
        except AssertionError as ae:
            test_name = inspect.stack()[1][3]
            current_date_time = datetime.datetime.now().strftime("%Y.%m.%d %H-%M-%S")
            logging.basicConfig(filename='tests/{}-{}-Failure.log'.format(current_date_time, test_name),
                                filemode='a',
                                format='%(message)s',
                                level=logging.DEBUG
                                )
            logger = logging.getLogger('FailureLogger')
            logger.debug('{} has failed'.format(test_name))
            logger.debug('Expected response(s):')
            logger.debug(expected_response)
            logger.debug('Actual response:')
            logger.debug(actual_response)
            for arg in args:
                logger.debug('Additionl logging info:')
                logger.debug(arg)
            raise ae

    def testSomething(self):
        ...

        self.assertWithLogging(self.assertEqual,
                               [expected_response, actual_response]
                               expected_response,
                               actual_response,
                               some_other_variable
                               )

尽管它能按我预期的那样工作,但对我来说,这种解决方案似乎笨拙而不是 Pythonic

  1. 实现相同结果的一种更优雅的方法是(在那里)?
  2. 当前方法的缺点是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用各种日志记录机制,在其中可以设置要实现的日志类型。

下面的一个将仅记录错误消息。

Logger.error(msg, *args, **kwargs)

这会将msglevel logging.ERROR记录到此记录器中。参数的解释与debug()相同。