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?

101
demandé sur John Mee 2011-06-06 10:33:15

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.

De Django 1.7

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.

33
répondu osa 2014-04-22 16:53:21

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
108
répondu Tomasz Zielinski 2017-05-23 12:02:02

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

26
répondu Bryce Drennan 2013-04-19 20:05:03

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.

6
répondu spiderlama 2017-09-21 00:37:43

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.

5
répondu Jim Deville 2011-06-06 06:41:00

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.

1
répondu Joel Cross 2012-03-05 13:57:04

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
1
répondu MaxBlax360 2016-11-07 10:46:11

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

0
répondu Yauhen Yakimovich 2017-05-23 12:10:19