将日志分隔符添加到单元测试中的所有固定装置
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
我正在使用单元测试模块。我需要将 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