192đź‘Ť
Check out django-nose. This allows you to specify tests to run like:
python manage.py test another.test:TestCase.test_method
or as noted in comments, use the syntax:
python manage.py test another.test.TestCase.test_method
261đź‘Ť
Since Django 1.6 you can run a complete test case, or single test, using the complete dot notation for the element you want to run.
Automatic test discovery will now find tests in any file that starts with test under the working directory, so addressing the question you would have to rename your files, but you can now keep them inside the directory you want. If you want to use custom file names you can specify a pattern (default Django test runner) with the option flag --pattern="my_pattern_*.py"
.
So if you are in your manage.py
directory and want to run the test test_a
inside TestCase
subclass A
inside a file tests.py
under the app/module example
you would do:
python manage.py test example.tests.A.test_a
If you don’t want to include a dependency and are in Django 1.6 or later that’s how you do it.
- [Django]-Django Template Language: Using a for loop with else
- [Django]-Django related_name for field clashes
- [Django]-Django-rest-framework returning 403 response on POST, PUT, DELETE despite AllowAny permissions
- [Django]-How do I get user IP address in Django?
- [Django]-Can I access constants in settings.py from templates in Django?
- [Django]-Django urlsafe base64 decoding with decryption
16đź‘Ť
Use the -k
flag to run a specific test by name without specifying the whole path:
./manage.py test animals.AnimalTestCase -k my_test_name
or just
./manage.py test -k my_test_name
(I know this wasn’t the exact question but this page ranks high in a google search when I was trying to figure this out)
- [Django]-When saving, how can you check if a field has changed?
- [Django]-How do I do an OR filter in a Django query?
- [Django]-Where is a good place to work on accounts/profile in Django with the Django registration app?
11đź‘Ť
I was having this problem myself and found this question, in case anyone else comes along, here was what I dug up. The DjangoTestSuiteRuner uses a method called build_test(label) that figures out what test cases to run based on the label. Looking into this method it turns out they’re doing a getattr() on either the “models” or “test” module. This means if you return a suite the test runner isn’t looking for your test cases in that suite, it only looks in one of those modules.
A quick work-around is to use __init__.py
to import your tests directly instead of defining a suite. The makes them part of the “test” module and so build_test(label) can find them.
For your example above, tests/__init__.py
should simply contain:
from field_tests import *
from storage_tests import *
This isn’t very elegant and of course if you’re trying to do something more complicated with your suite then this won’t work, but it would for this case.
- [Django]-How to get username from Django Rest Framework JWT token
- [Django]-Django Admin app or roll my own?
- [Django]-Get Timezone from City in Python/Django
4đź‘Ť
I also ran into this problem and instead of using django-nose I followed this link here: http://www.pioverpi.net/2010/03/10/organizing-django-tests-into-folders/. You need to open you init.py and import your tests.
Ex in init.py: from unique_test_file import *
- [Django]-How to get GET request values in Django?
- [Django]-Handle `post_save` signal in celery
- [Django]-Function decorators with parameters on a class based view in Django
4đź‘Ť
Put this code in your __init__.py and it will import all test classes in the package and subpackages. This will allow you to run specific tests without manually importing every file.
import pkgutil
import unittest
for 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__)
Similarly, for your test suite you can simply use:
def suite():
return unittest.TestLoader().discover("appname.tests", pattern="*.py")
Now all you have to do for new tests is write them and make sure they are in the tests folder. No more tedious maintenance of the imports!
- [Django]-Add a custom button to a Django application's admin page
- [Django]-How to reset Django admin password?
- [Django]-Do django db_index migrations run concurrently?
3đź‘Ť
If you want to run a test case class which has the path <module_name>/tests/test_views.py
, you can run the command python manage.py test <module_name>.tests.test_views.<test_case_name>
.
- [Django]-Can I access constants in settings.py from templates in Django?
- [Django]-How to save pillow image object to Django ImageField?
- [Django]-Specifying limit and offset in Django QuerySet wont work