139 votes

Comment faire pour étaler les tests unitaires django sur plusieurs fichiers ?

  • J'ai un python-django application
  • Je suis en utilisant le framework de test unitaire
  • Les tests sont organisés dans le fichier "tests.py" dans le répertoire du module
  • Je suis d'exécuter les tests via ./manage.py test app

Maintenant..

  • L' tests.py fichier est assez volumineux/complexes/sale
  • J'aimerais casser tests.py dans de petites collections d'essais...

Comment?

132voto

Tomasz Zielinski Points 9300

Vous pouvez créer tests le dossier avec ___init___.py à l'intérieur (de sorte qu'il devient un package). Ensuite à vous d'y ajouter votre split test .py fichiers et l'importation de tous dans _le__init___.py.


I. e: Remplacer le test.py le fichier avec un module qui ressemble et agit comme le fichier:

Créer un tests sous-Répertoire de l'application en question

app
app\models.py
app\views.py
app\tests
app\tests\__init__.py
app\tests\bananas.py
app\tests\apples.py

Importer les submodules en app\tests\__init__.py:

from bananas import *
from apples import *

Maintenant, vous pouvez utiliser ./manage.py comme si ils sont tous dans un seul fichier:

./manage.py test app.some_test_in_bananas

EDIT: N'est plus valable à partir de Django 1.6, voir ce post.

54voto

Sergey Orshanskiy Points 1180

Le comportement a changé dans Django 1.6, donc il n'est plus nécessaire de créer un package. Juste le nom de vos fichiers test*.py.

De Django 1.7

Lorsque vous exécutez vos tests, le comportement par défaut de l'utilitaire de test est trouver tous les cas de test (qui est, les sous-classes de unittest.TestCase) dans un fichier dont le nom commence par test, de créer automatiquement un test suite de ces cas de test, et exécuter la suite.

De Django 1.6 documentation,

Test de la découverte est basée sur le module unittest de test intégrée de la découverte. Par défaut, cela permettra de découvrir les tests dans un fichier nommé "test*.py" sous le répertoire de travail courant.

Le comportement précédent, à partir de Django 1.5 documentation:

Lorsque vous exécutez vos tests, le comportement par défaut de l'utilitaire de test est trouver tous les cas de test (qui est, les sous-classes de unittest.TestCase) dans models.py et tests.py met en place automatiquement une suite de tests de ces cas de test, et exécuter la suite.

Il y a une deuxième façon de définir la suite de test pour un module: si vous définir une fonction appelée suite() dans les deux models.py ou tests.py le Django test runner va utiliser cette fonction pour construire la suite de test pour ce module. Il fait suite à la proposition d'organisation de l'unité les tests. Voir la documentation Python pour plus de détails sur la façon de la construction d'un complexe de suite de tests.

27voto

Bryce Drennan Points 316

La réponse, comme indiqué par Tomasz est correct. Cependant, cela peut devenir fastidieux pour s'assurer que les importations en __init__.py correspondent à la structure de votre fichier.

Pour détecter automatiquement tous les tests dans le dossier , vous pouvez ajouter ce dans __init__.py:

import unittest

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")

Cela vous permettra d'exécuter ./manage.py test appname , mais ne gère pas l'exécution de tests spécifiques. Pour ce faire vous pouvez utiliser ce code (également en __init__.py):

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__)

Maintenant, vous pouvez exécuter vos tests via manage.py test app ou plus spécifiques via manage.py test app.TestApples

5voto

Jim Deville Points 7137

http://docs.Python.org/library/UnitTest.html#Organizing-tests parle de diviser les fichiers en modules, et la section juste au-dessus c’est un exemple.

1voto

Joel Cross Points 422

Si vous avez une configuration plus complexe, ou ne voulez pas utiliser -tapez instructions, vous pouvez définir une fonction appelée tests.py (ou d’essais/init.py), qui retourne une instance de `` .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X