Organizing Django unit tests

DjangoUnit Testing

Django Problem Overview


Right now I have my Django unit tests living at mcif/tests.py. I would prefer to have something more like mcif/tests/foo_test.py, mcif/tests/bar_test.py, etc., but if I organize my tests that way, Django flips out.

Is there a way to do what I'm trying to do or do I have to have all my tests in one file?

Django Solutions


Solution 1 - Django

From version 1.6 of Django, the test discovery mechanism changed. You no longer need to import everything from tests/__init__.py, but now you have to make sure that all your files containing tests match the pattern test*.py.

So, instead of having app/tests/models.py and app/tests/views.py, now you should have app/tests/test_models.py and app/tests/test_views.py.

You could also create a file named app/tests/test.py and include your other files from there. The thing is that the runner will look for files matching the pattern test*.py and execute them.

Solution 2 - Django

Note: This describes behavior prior to Django 1.6. See Artur Soler's answer for Django 1.6 and later.

Make a package: myapp/tests/

Within the package, put as many different testing modules as you want. In the __init__.py within tests, import the tests from those modules. (Or some variation on this theme.)

edit: Wow, didn't notice you already mentioned a tests package.

The important thing is to get everything available from the package. Django will get the tests from the package, so they have to be visible in __init__.py.

[edit: Added note about Django version 1.6]

Solution 3 - Django

Just to add to Artur Soler's great answer...

You can also use the --pattern option to specify how your test files are named.

For example if your test files are named foo_test.py, bar_test.py and similar, you can use:

$ ./manage.py test --pattern="*_test.py"

Solution 4 - Django

In your _init_.py put something like:

from foo_test import *
from bar_test import *

Solution 5 - Django

As @artur-soler explained,

Let's say you have an app named "AppName":

AppName tests

Your __init__.py inside the tests folder should consists of something like -

from AppName.tests import *

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJason SwettView Question on Stackoverflow
Solution 1 - DjangoArtur SolerView Answer on Stackoverflow
Solution 2 - DjangodappawitView Answer on Stackoverflow
Solution 3 - DjangogeckonView Answer on Stackoverflow
Solution 4 - DjangoEvgenyView Answer on Stackoverflow
Solution 5 - DjangoMatan DobrushinView Answer on Stackoverflow