我有一大堆测试辅助函数,它们接受一个测试实例并使用 addCleanup 干净地设置/拆除线程、临时文件等,所以我也需要 addCleanup API 来处理类级别的固定装置。我重新实现了一些 unittest doCleanup 功能来帮助我,并在课程设置期间使用模拟来修补 addCleanup()
import unittest
import logging
import mock
LOGGER = logging.getLogger(__name__)
class ClassCleanupTestCase(unittest.TestCase):
_class_cleanups = []
@classmethod
def setUpClassWithCleanup(cls):
def cleanup_fn():
"""Do some cleanup!"""
# Do something that requires cleanup
cls.addCleanup(cleanup_fn)
@classmethod
def addCleanupClass(cls, function, *args, **kwargs):
cls._class_cleanups.append((function, args, kwargs))
@classmethod
def doCleanupsClass(cls):
results = []
while cls._class_cleanups:
function, args, kwargs = cls._class_cleanups.pop()
try:
function(*args, **kwargs)
except Exceptions:
LOGGER.exception('Exception calling class cleanup function')
results.append(sys.exc_info())
if results:
LOGGER.error('Exception(s) raised during class cleanup, re-raising '
'first exception.')
raise results[0]
@classmethod
def setUpClass(cls):
try:
with mock.patch.object(cls, 'addCleanup') as cls_addCleanup:
cls_addCleanup.side_effect = cls.addCleanupClass
cls.setUpClassWithCleanup()
except Exception:
cls.doCleanupsClass()
raise
@classmethod
def tearDownClass(cls):
cls.doCleanupsClass()