TransactionTestCase.fixtures
A test case for a database-backed website isn’t much use if there isn’t any data in the database. Tests are more readable and it’s more maintainable to create objects using the ORM, for example in TestCase.setUpTestData()
, however, you can also use fixtures.
A fixture is a collection of data that Django knows how to import into a database. For example, if your site has user accounts, you might set up a fixture of fake user accounts in order to populate your database during tests.
The most straightforward way of creating a fixture is to use the manage.py dumpdata
command. This assumes you already have some data in your database. See the dumpdata
documentation
for more details.
Once you’ve created a fixture and placed it in a fixtures
directory in one of your INSTALLED_APPS
, you can use it in your unit tests by specifying a fixtures
class attribute on your django.test.TestCase
subclass:
from django.test import TestCase from myapp.models import Animal class AnimalTestCase(TestCase): fixtures = ['mammals.json', 'birds'] def setUp(self): # Test definitions as before. call_setup_methods() def testFluffyAnimals(self): # A test that uses the fixtures. call_some_test_code()
Here’s specifically what will happen:
- At the start of each test, before
setUp()
is run, Django will flush the database, returning the database to the state it was in directly aftermigrate
was called. - Then, all the named fixtures are installed. In this example, Django will install any JSON fixture named
mammals
, followed by any fixture namedbirds
. See theloaddata
documentation for more details on defining and installing fixtures.
For performance reasons, TestCase
loads fixtures once for the entire test class, before setUpTestData()
, instead of before each test, and it uses transactions to clean the database before each test. In any case, you can be certain that the outcome of a test will not be affected by another test or by the order of test execution.
By default, fixtures are only loaded into the default
database. If you are using multiple databases and set multi_db=True
, fixtures will be loaded into all databases.
Please login to continue.