TransactionTestCase.available_apps
Warning
This attribute is a private API. It may be changed or removed without a deprecation period in the future, for instance to accommodate changes in application loading.
It’s used to optimize Django’s own test suite, which contains hundreds of models but no relations between models in different applications.
By default, available_apps
is set to None
. After each test, Django calls flush
to reset the database state. This empties all tables and emits the post_migrate
signal, which re-creates one content type and three permissions for each model. This operation gets expensive proportionally to the number of models.
Setting available_apps
to a list of applications instructs Django to behave as if only the models from these applications were available. The behavior of TransactionTestCase
changes as follows:
-
post_migrate
is fired before each test to create the content types and permissions for each model in available apps, in case they’re missing. - After each test, Django empties only tables corresponding to models in available apps. However, at the database level, truncation may cascade to related models in unavailable apps. Furthermore
post_migrate
isn’t fired; it will be fired by the nextTransactionTestCase
, after the correct set of applications is selected.
Since the database isn’t fully flushed, if a test creates instances of models not included in available_apps
, they will leak and they may cause unrelated tests to fail. Be careful with tests that use sessions; the default session engine stores them in the database.
Since post_migrate
isn’t emitted after flushing the database, its state after a TransactionTestCase
isn’t the same as after a TestCase
: it’s missing the rows created by listeners to post_migrate
. Considering the order in which tests are executed, this isn’t an issue, provided either all TransactionTestCase
in a given test suite declare available_apps
, or none of them.
available_apps
is mandatory in Django’s own test suite.
Please login to continue.