web-dev-qa-db-fra.com

Exécution d'un scénario de test spécifique dans Django lorsque votre application contient un répertoire de tests

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?

139
hekevintran

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
134
Sam Dolan

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.

Voir la Django pour plus d'informations

152
cristiano2lopes

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.

10
Chris T

Cela devrait fonctionner

python manage.py test my_app.tests.storage_tests
9
Swapnil Patel

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!

3
Bryce Drennan

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 *

3
Austin