У меня есть целая группа тестовых вспомогательных функций, которые берут тестовый экземпляр и используют addCleanup для чистой установки/срыва потоков, файлов temp и т. Д., Поэтому мне понадобился API AddCleanup для работы с инструментами уровня класса. Я переписана немного о 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()
Что-то пахнущая плохо в этом сценарии. Что вы пытаетесь проверить? – fabrizioM
@fabrizioM: Что вам не нравится? Я запускаю множество тестовых примеров, которые используют некоторые общие ресурсы. Чтобы сократить время выполнения теста, я не хочу каждый раз настраивать общие ресурсы. – sickgemini
см. Мой ответ :) – fabrizioM