diff --git a/docs/topics/testing/advanced.txt b/docs/topics/testing/advanced.txt index 8a883dfb84..414f1f515a 100644 --- a/docs/topics/testing/advanced.txt +++ b/docs/topics/testing/advanced.txt @@ -234,30 +234,76 @@ Advanced features of ``TransactionTestCase`` Using ``reset_sequences = True`` will slow down the test, since the primary key reset is an relatively expensive database operation. -Running tests outside the test runner -===================================== -If you want to run tests outside of ``./manage.py test`` -- for example, -from a shell prompt -- you will need to set up the test -environment first. Django provides a convenience method to do this:: +Using the Django test runner to test reusable applications +========================================================== - >>> from django.test.utils import setup_test_environment - >>> setup_test_environment() +If you are writing a :doc:`reusable application ` +you may want to use the Django test runner to run your own test suite +and thus benefit from the Django testing infrastructure. -:func:`~django.test.utils.setup_test_environment` puts several Django features -into modes that allow for repeatable testing, but does not create the test -databases; :func:`django.test.runner.DiscoverRunner.setup_databases` -takes care of that. +A common practice is a *tests* directory next to the application code, with the +following structure:: -The call to :func:`~django.test.utils.setup_test_environment` is made -automatically as part of the setup of ``./manage.py test``. You only -need to manually invoke this method if you're not using running your -tests via Django's test runner. + runtests.py + polls/ + __init__.py + models.py + ... + tests/ + __init__.py + models.py + test_settings.py + tests.py -.. versionchanged:: 1.7 +Let's take a look inside a couple of those files: + +.. snippet:: + :filename: runtests.py + + #!/usr/bin/env python + import os + import sys + + import django + from django.conf import settings + from django.test.utils import get_runner + + if __name__ == "__main__": + os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings' + django.setup() + TestRunner = get_runner(settings) + test_runner = TestRunner() + failures = test_runner.run_tests(["tests"]) + sys.exit(bool(failures)) + + +This is the script that you invoke to run the test suite. It sets up the +Django environment, creates the test database and runs the tests. + +For the sake of clarity, this example contains only the bare minimum +necessary to use the Django test runner. You may want to add +command-line options for controlling verbosity, passing in specific test +labels to run, etc. + +.. snippet:: + :filename: tests/test_settings.py + + SECRET_KEY = 'fake-key' + INSTALLED_APPS = [ + "tests", + ] + +This file contains the :doc:`Django settings ` +required to run your app's tests. + +Again, this is a minimal example; your tests may require additional +settings to run. + +Since the *tests* package is included in :setting:`INSTALLED_APPS` when +running your tests, you can define test-only models in its ``models.py`` +file. - If you are not using a management command to invoke the tests, you will - also need to first setup Django itself using :func:`django.setup()`. .. _other-testing-frameworks: