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