Introduced a mixin for serializing tests.

This commit is contained in:
Aymeric Augustin 2015-02-06 11:38:22 +01:00
parent bf2c969eb7
commit ba81386487
1 changed files with 29 additions and 0 deletions

View File

@ -20,6 +20,7 @@ from django.apps import apps
from django.conf import settings from django.conf import settings
from django.core import mail from django.core import mail
from django.core.exceptions import ImproperlyConfigured, ValidationError from django.core.exceptions import ImproperlyConfigured, ValidationError
from django.core.files import locks
from django.core.handlers.wsgi import WSGIHandler, get_path_info from django.core.handlers.wsgi import WSGIHandler, get_path_info
from django.core.management import call_command from django.core.management import call_command
from django.core.management.color import no_style from django.core.management.color import no_style
@ -1379,3 +1380,31 @@ class LiveServerTestCase(TransactionTestCase):
def tearDownClass(cls): def tearDownClass(cls):
cls._tearDownClassInternal() cls._tearDownClassInternal()
super(LiveServerTestCase, cls).tearDownClass() super(LiveServerTestCase, cls).tearDownClass()
class SerializeMixin(object):
"""
Mixin to enforce serialization of TestCases that share a common resource.
Define a common 'lockfile' for each set of TestCases to serialize. This
file must exist on the filesystem.
Place it early in the MRO in order to isolate setUpClass / tearDownClass.
"""
lockfile = None
@classmethod
def setUpClass(cls):
if cls.lockfile is None:
raise ValueError(
"{}.lockfile isn't set. Set it to a unique value "
"in the base class.".format(cls.__name__))
cls._lockfile = open(cls.lockfile)
locks.lock(cls._lockfile, locks.LOCK_EX)
super(SerializeMixin, cls).setUpClass()
@classmethod
def tearDownClass(cls):
super(SerializeMixin, cls).tearDownClass()
cls._lockfile.close()