J'ai tout un tas de fonctions d'aide de test qui prennent une instance de test et utilisent addCleanup pour installer/décomposer proprement les threads, les fichiers temporaires, etc ... J'ai donc besoin de l'API addCleanup pour les projecteurs de classe. Je réimplémentées un peu de unittest fonctionnalité doCleanup pour me aider, et utilisé maquette patcher addCleanup() lors de la configuration de la classe
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()
Quelque chose est mal dans ce une odeur scénario. Qu'essayez-vous de tester? – fabrizioM
@fabrizioM: Qu'est-ce que tu n'aimes pas? Je cours beaucoup de cas de test qui utilisent des ressources communes. Pour réduire le temps d'exécution du test, je ne veux pas configurer les ressources communes à chaque fois. – sickgemini
voir ma réponse :) – fabrizioM