Añadir separadores de registro a todos los accesorios en unittests

Estoy usando el módulo unittest. Necesito separar los registros setUp, setUpClass, teardown y teardownClass de los registros de unittests. La salida debe verse algo como:

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

Intenté anular algunas funciones en unittest.suite (_handleClassSetUp, _handleModuleFixtures, _tearDownPreviousClass) para registrar separadores antes y después de que se llamen. Como resultado, los separadores se registran incluso si el caso de prueba no contiene setUpClass y tearDownClass. Y aún así, no hay separador para la configuración y el desassembly.

¿Cómo puede hacerse esto?

Podrías usar una metaclase para lograr esta funcionalidad. Todo lo que hace es buscar una lista de nombres de funciones que proporcione y luego aplicar un decorador a esas funciones. El decorador se encarga de imprimir las declaraciones de entrada y salida.

 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() 

Esto resulta en salida:

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

 Ran 1 test in 0.000s OK