Add unitests to a Django application
Suppose you have written a Django app and obviously you want to test it, the filesystem structure is something like the following:
.
├── my_django_app
│ ├── __init__.py
│ ├── models.py
│ ├── tests.py
└── runtests.py
where models.py
contains something like this
from django.db import models
class A(models.Model):
name = models.CharField(max_length=100)
and with very simple test module tests.py
:
from django.test import TestCase
from .models import A
class Test(TestCase):
def setUp(self):
self.a = A(name='kebab')
self.a.save()
def test_model(self):
self.assertEqual(self.a.name, 'kebab')
The magic happens with runtests.py
that sets all the necessary
in order to run all the tests:
from __future__ import absolute_import
import sys
from django.conf import settings
from django.core import management
APP_NAME = 'my_django_app'
def main():
settings.configure(
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
}
},
INSTALLED_APPS = ( # These apps depend on what your app need
'django.contrib.auth',
'django.contrib.contenttypes',
APP_NAME,
),
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.debug',
'django.core.context_processors.i18n',
'django.core.context_processors.media',
'django.core.context_processors.request',
'django.core.context_processors.static',
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages'
),
ROOT_URLCONF = '%s.tests.urls' % APP_NAME,
STATIC_URL = '/static/',
)
import django
django.setup()
management.execute_from_command_line(['', 'test', APP_NAME,])
sys.exit()
if __name__ == '__main__':
main()
Now you can launch the test without a complete Django project with a simple
$ python runtests.py
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Destroying test database for alias 'default'...
This is only an example, inspired from other projects like dj-stripe. If you want really to wrote a Django app use cookiecutter-djangopackage that includes an updated version of this configuration and much more.
Comments
Comments powered by Disqus