diff --git a/tests/migrations/test_base.py b/tests/migrations/test_base.py
index 01062667aa..7ab09b04a5 100644
--- a/tests/migrations/test_base.py
+++ b/tests/migrations/test_base.py
@@ -1,12 +1,14 @@
-from django.test import TestCase
+from django.test import TransactionTestCase
 from django.db import connection
 
 
-class MigrationTestBase(TestCase):
+class MigrationTestBase(TransactionTestCase):
     """
     Contains an extended set of asserts for testing migrations and schema operations.
     """
 
+    available_apps = ["migrations"]
+
     def assertTableExists(self, table):
         self.assertIn(table, connection.introspection.get_table_list(connection.cursor()))
 
diff --git a/tests/migrations/test_executor.py b/tests/migrations/test_executor.py
index 5167f428d1..dbdea900a5 100644
--- a/tests/migrations/test_executor.py
+++ b/tests/migrations/test_executor.py
@@ -38,6 +38,11 @@ class ExecutorTests(TransactionTestCase):
         # Are the tables there now?
         self.assertIn("migrations_author", connection.introspection.get_table_list(connection.cursor()))
         self.assertIn("migrations_book", connection.introspection.get_table_list(connection.cursor()))
+        # Alright, let's undo what we did
+        executor.migrate([("migrations", None)])
+        # Are the tables gone?
+        self.assertNotIn("migrations_author", connection.introspection.get_table_list(connection.cursor()))
+        self.assertNotIn("migrations_book", connection.introspection.get_table_list(connection.cursor()))
 
     @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations", "sessions": "migrations.test_migrations_2"})
     def test_empty_plan(self):
diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py
index 2ff3f73b8a..1bc4a42d7e 100644
--- a/tests/migrations/test_operations.py
+++ b/tests/migrations/test_operations.py
@@ -127,12 +127,13 @@ class OperationTests(MigrationTestBase):
         self.assertTableExists("test_adflmm_pony_stables")
         self.assertColumnNotExists("test_adflmm_pony", "stables")
         # Make sure the M2M field actually works
-        app_cache = new_state.render()
-        Pony = app_cache.get_model("test_adflmm", "Pony")
-        p = Pony.objects.create(pink=False, weight=4.55)
-        p.stables.create()
-        self.assertEqual(p.stables.count(), 1)
-        p.stables.all().delete()
+        with atomic():
+            app_cache = new_state.render()
+            Pony = app_cache.get_model("test_adflmm", "Pony")
+            p = Pony.objects.create(pink=False, weight=4.55)
+            p.stables.create()
+            self.assertEqual(p.stables.count(), 1)
+            p.stables.all().delete()
         # And test reversal
         with connection.schema_editor() as editor:
             operation.database_backwards("test_adflmm", editor, new_state, project_state)
diff --git a/tests/schema/tests.py b/tests/schema/tests.py
index bf9fa6bbcc..c3764979d6 100644
--- a/tests/schema/tests.py
+++ b/tests/schema/tests.py
@@ -195,7 +195,7 @@ class SchemaTests(TransactionTestCase):
         # Ensure the field is right afterwards
         columns = self.column_classes(Author)
         self.assertEqual(columns['name'][0], "TextField")
-        self.assertEqual(columns['name'][1][6], bool(connection.features.interprets_empty_strings_as_nulls))
+        self.assertEqual(bool(columns['name'][1][6]), False)
 
     def test_rename(self):
         """
@@ -230,7 +230,7 @@ class SchemaTests(TransactionTestCase):
         # Create the tables
         with connection.schema_editor() as editor:
             editor.create_model(Author)
-            editor.create_model(Tag)
+            editor.create_model(TagM2MTest)
             editor.create_model(BookWithM2M)
         # Ensure there is now an m2m table there
         columns = self.column_classes(BookWithM2M._meta.get_field_by_name("tags")[0].rel.through)