我正在使用单元测试模块。我需要将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
关于python - 向单元测试中的所有装置添加日志分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32610482/