diff --git a/djblets/testing/decorators.py b/djblets/testing/decorators.py
new file mode 100644
index 0000000000000000000000000000000000000000..786e9438d14a34551a56f965a2ae79f3a5bfdbee
--- /dev/null
+++ b/djblets/testing/decorators.py
@@ -0,0 +1,11 @@
+def add_fixtures(fixtures, replace=False):
+    """Adds or replaces the fixtures used for this test.
+
+    This must be used along with :py:func:`djblets.testing.testcases.TestCase`.
+    """
+    def _dec(func):
+        func._fixtures = fixtures
+        func._replace_fixtures = replace
+        return func
+
+    return _dec
diff --git a/djblets/testing/testcases.py b/djblets/testing/testcases.py
index 2e002a6073718313556c6bbac0d9564eee1451a9..2fe03e23869508cb7da9e502c64980089b81fc9f 100644
--- a/djblets/testing/testcases.py
+++ b/djblets/testing/testcases.py
@@ -31,7 +31,7 @@ from django.conf import settings
 from django.core.handlers.wsgi import WSGIHandler
 from django.core.servers import basehttp
 from django.template import Node
-from django.test.testcases import call_command, TestCase, TransactionTestCase
+from django.test import testcases
 from nose import SkipTest
 
 
@@ -54,6 +54,28 @@ class StubParser:
         pass
 
 
+class TestCase(testcases.TestCase):
+    """Base class for test cases.
+
+    Individual tests on this TestCase can use the :py:func:`add_fixtures`
+    decorator to add or replace the fixtures used for the test.
+    """
+    def __call__(self, *args, **kwargs):
+        method = getattr(self, self._testMethodName)
+        old_fixtures = getattr(self, 'fixtures', [])
+
+        if hasattr(method, '_fixtures'):
+            if getattr(method, '_replace_fixtures'):
+                self.fixtures = method._fixtures
+            else:
+                self.fixtures = old_fixtures + method._fixtures
+
+        super(TestCase, self).__call__(*args, **kwargs)
+
+        if old_fixtures:
+            self.fixtures = old_fixtures
+
+
 class TagTest(TestCase):
     """Base testing setup for custom template tags"""
 
@@ -64,7 +86,7 @@ class TagTest(TestCase):
         return "content"
 
 
-class SeleniumUnitTest(TransactionTestCase):
+class SeleniumUnitTest(TestCase):
     """A unit test that makes use of the Selenium browser automation tool.
 
     SeleniumUnitTest makes it easy to write unit tests that make use of
@@ -264,7 +286,7 @@ class TestServerThread(threading.Thread):
             if hasattr(self, 'fixtures'):
                 # We have to use this slightly awkward syntax due to the fact
                 # that we're using *args and **kwargs together.
-                call_command('loaddata', verbosity=0, *self.fixtures)
+                testcases.call_command('loaddata', verbosity=0, *self.fixtures)
 
         # Loop until we get a stop event.
         while not self._stopevent.isSet():
