Tester une application Django

Cet article détail comment utiliser le lanceur de tests de Django (Django test runner) pour tester une application réutilisable.

Quand l’application est installée, elle est testable directement via Django et son utilitaire en ligne de commande: python manage.py test customflatpages. Mais en phase de développement, devoir installer l’appli et la redéployer à chaque modification, avant de pouvoir la tester n’est pas pratique, voici comment lancer directement les tests de l’application.

J’ai pris l’habitude de structurer mes applications Django de la façon suivante

(django1.7)gluchet@localhost django-customflatpages (master) $ tree

.
├── README.md
├── setup.py
    └── src
        └── geelweb
            ├── __init__.py
            └── django
                ├── __init__.py
                └── customflatpages
                    ├── __init__.py
                    ├── admin.py
                    ├── models.py
                    └── tests.py

4 directories, 8 files

Le fichier tests.py contient les tests du module, il est exécuté par Django lorsque la commande test est utilisée.

Pour utiliser le lanceur de tests de Django pour tester une application, il suffit d’ajouter un répertoire tests, qui contiendra le lanceur dans un fichier runtests.py, et la configuration dans un fichier test_settings.py.

└── tests
    ├── __init__.py
    ├── runtests.py
    └── test_settings.py

 

#!/usr/bin/env python

import os
import sys

# pour s'assurer que le module tests sera dans le path
DIRNAME = os.path.join(os.path.dirname(__file__), '..')
sys.path.append(DIRNAME)

# ceci n'est nécessaire que parce que mon module est dans un répertoire src
sys.path.append(os.path.join(DIRNAME, 'src')) 

import django
from django.conf import settings
from django.test.utils import get_runner

if __name__ == "__main__":
    os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.test_settings'
    django.setup()
    TestRunner = get_runner(settings)
    test_runner = TestRunner()
    failures = test_runner.run_tests(["geelweb.django.customflatpages"]) # le nom du module à tester
    sys.exit(bool(failures))

 

SECRET_KEY = 'sfbysvgcizvncwhf89'

# La configuration de la base de données si nécessaire
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': ':memory:',
    },
}

# L'application à tester et ses dépendances
INSTALLED_APPS = [
    "django.contrib.sites",
    "django.contrib.flatpages",
    "geelweb.django.customflatpages",
]

# La configuration des dépendances
SITE_ID = 1

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)

# La configuration de l'application à tester
FLATPAGES_EMPLACEMENTS = (
    ('footer', 'Flatpage with link in footer'),
    ('menu', 'Flatpage with link in menu'),
)

FLATPAGES_DEFAULT_EMPLACEMENT = 'footer'

Il ne reste plus qu’à lancer les tests


(django1.7)gluchet@localhost django-customflatpages (master) $ python tests/runtests.py
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Destroying test database for alias 'default'...

About the Author: Guillaume Luchet

Guillaume Luchet est Directeur de la R&D et Lead Développeur chez Bilendi Technology, entrepreneur et développeur freelance.