将日志分隔符添加到单元测试中的所有固定装置

Add log separators to all fixtures in unittests

我正在使用单元测试模块。我需要将 setUp、setUpClass、teardown 和 teardownClass 日志与单元测试日志分开。输出应该类似于:

**************setting things up**************
INFO: preparing database
INFO: create new users
**************end of setup****************
INFO: starting test one
INFO: ...
**************Cleaning things**************
INFO: delete users
...

我试图重写 unittest.suite 中的某些函数(_handleClassSetUp、_handleModuleFixtures、_tearDownPreviousClass)以在调用它们之前和之后记录分隔符。因此,即使测试用例不包含 setUpClass 和 tearDownClass,也会记录分隔符。而且,仍然没有用于设置和拆卸的分隔符。

如何做到?

您可以使用元类来实现此功能。它所做的只是查找您提供的函数名称列表,然后对这些函数应用装饰器。装饰器处理打印进入和退出语句。

import functools
import unittest

FUNCTIONS_TO_LOG = ('setUp', 'tearDown')


def log_start_and_end(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        print '********** start {}'.format(f.__name__)
        f(*args, **kwargs)
        print '********** end {}'.format(f.__name__)
    return wrapper


class LoggingMeta(type):
    def __new__(cls, name, bases, namespace):
        for attr, obj in namespace.items():
            if attr in FUNCTIONS_TO_LOG:
                namespace[attr] = log_start_and_end(obj)
        return super(LoggingMeta, cls).__new__(cls, name, bases, namespace)


class BaseTest(unittest.TestCase):
    __metaclass__ = LoggingMeta

    def setUp(self):
        print 'inside setup'

    def tearDown(self):
        print 'inside teardown'

    def test_test(self):
        print 'inside test'

if __name__ == '__main__':
    unittest.main()

这导致输出:

********** start setUp
inside setup
********** end setUp
inside test
********** start tearDown
inside teardown
********** end tearDown
.

Ran 1 test in 0.000s

OK