La Django documentation ( http://docs.djangoproject.com/fr/1.3/topics/testing/#running-tests )) indique que vous pouvez exécuter un test individuel. cas en les spécifiant:
$ ./manage.py test animals.AnimalTestCase
Cela suppose que vos tests soient dans un fichier tests.py dans votre application Django. Si cela est vrai, cette commande fonctionne comme prévu.
J'ai mes tests pour une application Django dans un répertoire de tests:
my_project/apps/my_app/
├── __init__.py
├── tests
│ ├── __init__.py
│ ├── field_tests.py
│ ├── storage_tests.py
├── urls.py
├── utils.py
└── views.py
Le tests/__init__.py
Le fichier a une fonction suite ():
import unittest
from my_project.apps.my_app.tests import field_tests, storage_tests
def suite():
tests_loader = unittest.TestLoader().loadTestsFromModule
test_suites = []
test_suites.append(tests_loader(field_tests))
test_suites.append(tests_loader(storage_tests))
return unittest.TestSuite(test_suites)
Pour exécuter les tests que je fais:
$ ./manage.py test my_app
Essayer de spécifier un cas de test individuel déclenche une exception:
$ ./manage.py test my_app.tests.storage_tests.StorageTestCase
...
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method
J'ai essayé de faire ce que le message d'exception disait:
$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test
Comment spécifier un cas de test individuel lorsque mes tests sont dans plusieurs fichiers?
Commander Django-nose . Il vous permet de spécifier que les tests doivent être exécutés comme suit:
python manage.py test another.test:TestCase.test_method
ou comme indiqué dans les commentaires, utilisez la syntaxe:
python manage.py test another.test.TestCase.test_method
Depuis Django 1.6, vous pouvez exécuter un scénario de test complet, ou un test unique, en utilisant la notation complète par points de l’élément que vous souhaitez exécuter.
La découverte automatique des tests trouvera désormais des tests dans tous les fichiers commençant par test dans le répertoire de travail. Vous devrez donc renommer vos fichiers, mais vous pouvez maintenant les conserver dans le répertoire que vous voulez. Si vous souhaitez utiliser des noms de fichiers personnalisés, vous pouvez spécifier un modèle (par défaut Django test runner) avec l'option flag --pattern="my_pattern_*.py"
.
Donc, si vous êtes dans votre manage.py
répertoire et souhaitez exécuter le test test_a
dans TestCase
sous-classe A
dans un fichier tests.py
sous l'app/module example
vous feriez:
python manage.py test example.tests.A.test_a
Si vous ne souhaitez pas inclure de dépendance et que vous êtes dans Django 1.6 ou version ultérieure, procédez comme suit.
J'avais moi-même ce problème et j'ai trouvé cette question, au cas où quelqu'un d'autre arriverait, voici ce que j'ai découvert. DjangoTestSuiteRuner utilise une méthode appelée build_test (label) qui détermine les scénarios de test à exécuter en fonction du label. En regardant dans cette méthode, il s'avère qu'ils font un getattr () sur le module "models" ou "test". Cela signifie que si vous retournez une suite, l'exécutant de test ne recherche pas vos scénarios de test dans cette suite, il ne recherche que dans l'un de ces modules.
Une solution rapide consiste à utiliser __init__.py
pour importer vos tests directement au lieu de définir une suite. Cela les intègre au module "test" et permet donc à build_test (label) de les trouver.
Pour votre exemple ci-dessus, tests/__init__.py
devrait simplement contenir:
from field_tests import *
from storage_tests import *
Ce n'est pas très élégant et, bien sûr, si vous essayez de faire quelque chose de plus compliqué avec votre suite, cela ne fonctionnera pas, mais cela fonctionnerait dans ce cas.
Cela devrait fonctionner
python manage.py test my_app.tests.storage_tests
Mettez ce code dans votre __init__.py et il importera toutes les classes de test du package et des sous-packages. Cela vous permettra d'exécuter des tests spécifiques sans importer manuellement chaque fichier.
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__)
De même, pour votre suite de tests, vous pouvez simplement utiliser:
def suite():
return unittest.TestLoader().discover("appname.tests", pattern="*.py")
Maintenant, tout ce que vous avez à faire pour les nouveaux tests est de les écrire et de s’assurer qu’ils sont dans le dossier des tests. Plus de maintenance fastidieuse des importations!
J'ai aussi rencontré ce problème et au lieu d'utiliser Django-nose, j'ai suivi ce lien ici: http://www.pioverpi.net/2010/03/10/organizing-Django-tests-into-folders/ . Vous devez vous ouvrir init . Py et importer vos tests.
Ex dans init . Py: from unique_test_file import *