255 votes

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

La documentation de Django (http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests- dit que vous pouvez exécuter des cas de test en les précisant:

$ ./manage.py test animals.AnimalTestCase

Cela suppose que vous avez vos tests dans un tests.py fichier dans votre application Django. Si cela est vrai, alors cette commande fonctionne comme prévu.

J'ai mes tests pour une application Django dans un répertoire tests:

my_project/apps/my_app/
├── __init__.py
├── tests
│   ├── __init__.py
│   ├── field_tests.py
│   ├── storage_tests.py
├── urls.py
├── utils.py
└── views.py

L' tests/__init__.py le fichier a une suite() fonction:

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

D'essayer de préciser un test individuel affaire soulève 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 de l'exception a dit:

$ ./manage.py test my_app.StorageTestCase
...
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test

Comment puis-je spécifier un cas de test lors de mes tests sont en plusieurs fichiers?

265voto

cristiano2lopes Points 225

Depuis Django 1.6 vous pouvez exécuter un test complet de cas, ou un test, à l'aide de l'complet dot notation pour l'élément que vous souhaitez exécuter.

Test automatique de la découverte trouverez maintenant des tests dans un fichier qui commence par test dans le répertoire de travail, de sorte que la question que vous auriez à renommer vos fichiers, mais maintenant vous pouvez les garder à l'intérieur du répertoire que vous voulez.

Donc, si vous êtes dans votre manage.py annuaire et que vous voulez exécuter le test test_a cas de test à l'intérieur de la sous-classe à l'intérieur d'un fichier tests.py en vertu de l'application/module exemple, que vous devez faire:

python manage.py test example.tests.A.test_a

Si vous ne voulez pas inclure une dépendance et sont dans django 1.6 c'est comment vous le faites.

Documentation -> https://docs.djangoproject.com/en/dev/topics/testing/overview/

194voto

sdolan Points 15572

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
 

11voto

Chris T Points 41

J'ai eu ce problème moi-même et trouve cette question, au cas où quelqu'un d'autre arrive, voici ce que j'ai dégoté. Le DjangoTestSuiteRuner utilise une méthode appelée build_test(étiquette) qui découvre ce cas de test à exécuter en fonction de l'étiquette. La recherche dans cette méthode, il s'avère qu'ils font un getattr() sur les "modèles" ou "test" du module. Cela signifie que si vous retournez une suite de testeur n'est pas à la recherche de vos cas de test dans la suite, on ne regarde que dans l'un de ces modules.

Un rapide travail est d'utiliser __init__.py d'importer vos tests directement au lieu de définir une suite. Le fait une partie de "test" du module et donc build_test(étiquette) peut les trouver.

Pour ton exemple ci-dessus, tests/__init__.py doit 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 alors cela ne fonctionne pas, mais pour ce cas.

4voto

Bryce Drennan Points 316

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!

4voto

Austin Points 647

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 ouvrir votre fichier .py et importer vos tests.

Ex en init .py: from unique_test_file import *

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