テスト インスタンスを取得し、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()