How to spread django unit tests over multiple files? How to spread django unit tests over multiple files? django django

How to spread django unit tests over multiple files?


Note that this approach is no longer valid from Django 1.6, see this post.

You can create tests folder with ___init___.py inside (so that it becomes a package). Then you add your split test .py files there and import all of them in ___init___.py.

I.e: Substitute the test.py file with a module that looks and acts like the file:

Create a tests Directory under the app in question

appapp\models.pyapp\views.pyapp\testsapp\tests\__init__.pyapp\tests\bananas.pyapp\tests\apples.py

Import the submodules into app\tests\__init__.py:

from bananas import *from apples import *

Now you can use ./manage.py as if they were all in a single file:

./manage.py test app.some_test_in_bananas


The behavior has changed in Django 1.6, so there is no longer a need to create a package. Just name your files test*.py.

From Django 1.7 documentation

When you run your tests, the default behavior of the test utility is to find all the test cases (that is, subclasses of unittest.TestCase) in any file whose name begins with test, automatically build a test suite out of those test cases, and run that suite.

From Django 1.6 documentation,

Test discovery is based on the unittest module’s built-in test discovery. By default, this will discover tests in any file named “test*.py” under the current working directory.

Previous behavior, from Django 1.5 documentation:

When you run your tests, the default behavior of the test utility is to find all the test cases (that is, subclasses of unittest.TestCase) in models.py and tests.py, automatically build a test suite out of those test cases, and run that suite.

There is a second way to define the test suite for a module: if you define a function called suite() in either models.py or tests.py, the Django test runner will use that function to construct the test suite for that module. This follows the suggested organization for unit tests. See the Python documentation for more details on how to construct a complex test suite.


The answer as stated by Tomasz is correct. However, it can become tedious to ensure that the imports in __init__.py match your file structure.

To automatically detect all tests in the folder you can add this in __init__.py:

import unittestdef suite():       return unittest.TestLoader().discover("appname.tests", pattern="*.py")

This will allow you to run ./manage.py test appname but won't handle running specific tests. To do that you can use this code (also in __init__.py):

import pkgutilimport unittestfor loader, module_name, is_pkg in pkgutil.walk_packages(__path__):    module = loader.find_module(module_name).load_module(module_name)    for name in dir(module):        obj = getattr(module, name)        if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):            exec ('%s = obj' % obj.__name__)

Now you can run all your tests via manage.py test app or specific ones via manage.py test app.TestApples