Comment répartir les tests unitaires django sur plusieurs fichiers?
- j'ai une application python-django
- j'utilise le cadre de test unitaire
- Les tests sont disposés dans le fichier "tests.py" dans le répertoire du module
- j'exécute les tests via
./manage.py test app
Maintenant..
- le fichier
tests.py
devient plutôt volumineux/complexe / désordonné - je voudrais diviser
tests.py
en plus petites collections de tests...
Comment?
8 réponses
Le comportement a changé dans Django 1.6, il n'est donc plus nécessaire de créer un paquet. Nommez simplement vos fichiers test*.py
.
Lorsque vous exécutez vos tests, le comportement par défaut de l'utilitaire de test est pour trouver tous les cas de test (c'est-à-dire les sous-classes d'unittest.Cas de test) dans tout fichier dont le nom commence par test, créez automatiquement un test suite de ces cas de test, et exécutez cette suite.
Depuis Django 1.6 documentation ,
La Découverte de Test est basée sur le test intégré du module unittest découverte. Par défaut, cela détectera les tests dans n'importe quel fichier nommé "test*. py" dans le répertoire de travail actuel.
Comportement précédent, de la documentation Django 1.5:
Lorsque vous exécutez vos tests, le comportement par défaut de l'utilitaire de test est pour trouver tous les cas de test (c'est-à-dire les sous-classes d'unittest.Cas de test) dans models.py et tests.py, construire automatiquement une suite de tests de ces cas de test, et exécutez cette suite.
Il existe une deuxième façon de définir la suite de tests pour un module: si vous définissez une fonction appelée suite () dans models.py ou tests.py, le Django test runner utilisera cette fonction pour construire la suite de tests pour ce module. Cela fait suite à l'organisation suggérée pour l'unité test. Voir la documentation Python pour plus de détails sur la façon de construire une suite de tests complexe.
Notez que cette approche n'est plus valide à partir de Django 1.6, voir ce post .
Vous pouvez créer un dossier tests
avec ___init___.py
à l'intérieur (pour qu'il devienne un paquet). Ensuite, vous ajoutez vos fichiers test .py fractionnés et les importez tous dans ___init___.py
.
C'est-à-dire: remplacez le fichier test.py
par un module qui ressemble et agit comme le fichier:
Créez un répertoire tests
sous 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 sous-modules dans app\tests\__init__.py
:
from bananas import *
from apples import *
Maintenant, vous pouvez utiliser ./manage.py comme si ils étaient tous dans un seul fichier:
./manage.py test app.some_test_in_bananas
La réponse de Tomasz est correcte. Cependant, il peut devenir fastidieux de s'assurer que les importations dans __init__.py
correspondent à la structure de votre fichier.
À 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 dans __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 spécifiques via manage.py test app.TestApples
Faites simplement votre structure de répertoire comme ceci:
myapp/
__init__.py
tests/
__init__.py
test_one.py
test_two.py
...
...
Et python manage.py test myapp
fonctionneront comme prévu.
Http://docs.python.org/library/unittest.html#organizing-tests parle de diviser les fichiers en modules, et la section juste au-dessus a un exemple.
Si vous avez une configuration plus compliquée ou si vous ne souhaitez pas utiliser les instructions from ... import *
-type, vous pouvez définir une fonction appelée suite
dans votre tests.py (ou tests/__init__.py), qui renvoie une instance de unittest.TestSuite
.
Pas besoin de coder quoi que ce soit dans init. Créez simplement un sous-répertoire dans votre application. La seule exigence est de ne pas l'appeler tests * Par exemple
app/
app/__init_.py
app/serializers.py
app/testing/
app/testing/__init__.py
app/testing/tests_serializers.py
Je pense que ./manage.py test
exécute simplement tous les tests (dans django > = 1.7).
Si votre l'organisation de tests de est d'environ regroupement de et cherrypicking et que vous êtes fan de nose
utiliser django nez:
python manage.py test another.test:TestCase.test_method
Si vous connaissez nose, alors vous savez comment "Joker" beaucoup plus agréable sur tous vos fichiers.
PS
C'est juste une meilleure pratique. Espérons que cela aide. La réponse a été empruntée ici: exécuter un cas de test spécifique dans Django lorsque votre l'application a un répertoire de tests