Django TestCase Transaction Wrapping
Django supplies it’s own
TestCase class which wraps each test in a transaction. This means any changes a test makes to the test database(s) are rolled back when the test has finished. It also means that test fixtures are reloaded for each test.
I wanted to test a substantial data set, and still have succinct tests. Using the Django
TestCase was proving too slow, so I repurposed some of the code from
TestCase into two functions:
from django.db import connections from django.db import transaction def disable_transaction_methods(): from django.test.testcases import disable_transaction_methods for db in connections: transaction.enter_transaction_management(using=db) transaction.managed(True, using=db) disable_transaction_methods() def restore_transaction_methods(): from django.test.testcases import restore_transaction_methods restore_transaction_methods() for db in connections: transaction.rollback(using=db) transaction.leave_transaction_management(using=db)</pre>
These can then be used by the class setup and teardown methods that nose supports, so the fixtures load once per
# See https://gist.github.com/3830479 for disable_ and restore_ functions from unittest import TestCase class Test(TestCase): @classmethod def class_setup(cls): disable_transaction_methods() # ... import test fixtures @classmethod def class_teardown(cls): restore_transaction_methods() def test_data_attributes(self): # ... def test_class_properties(self): # ...