web-dev-qa-db-fra.com

Comment répartir Django tests unitaires sur plusieurs fichiers?

  • J'ai une application python-Django
  • J'utilise le framework de tests unitaires
  • Les tests sont organisés dans le fichier "tests.py" dans le répertoire du module
  • J'exécute les tests via ./manage.py test app

À présent..

  • Le tests.py le fichier devient plutôt volumineux/complexe/désordonné
  • Je voudrais casser tests.py dans de plus petites collections de tests ...

Comment?

118
John Mee

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 consiste à rechercher tous les cas de test (c'est-à-dire les sous-classes de unittest.TestCase) dans tout fichier dont le nom commence par test, à créer automatiquement une suite de tests à partir de ces cas de test, et exécutez cette suite.

De documentation Django 1.6 ,

La découverte de test est basée sur la découverte de test intégrée du module le plus complet. Par défaut, cela découvrira les tests dans n'importe quel fichier nommé "test * .py" sous le répertoire de travail actuel.

Comportement précédent, de Django 1.5 :

Lorsque vous exécutez vos tests, le comportement par défaut de l'utilitaire de test consiste à rechercher tous les cas de test (c'est-à-dire les sous-classes de unittest.TestCase) dans models.py et tests.py, à créer automatiquement une suite de tests à partir 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 runner de test Django utilisera cette fonction pour construire la suite de tests pour ce module. Ceci suit l'organisation suggérée pour les tests unitaires. Voir la documentation Python pour plus de détails sur la façon de construire une suite de tests complexes.

43
osa

Notez que cette approche n'est plus valide à partir de Django 1.6, voir ceci post .

Vous pouvez créer un dossier tests avec ___init___.py inside (pour qu'il devienne un package). Ensuite, vous y ajoutez vos fichiers .py de test fractionné et les importez tous dans ___init___.py.

C'est-à-dire: remplacer le test.py fichier avec 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 

Importez les sous-modules dans app\tests\__init__.py:

from bananas import *
from apples import *

Vous pouvez maintenant utiliser ./manage.py comme s'ils étaient tous dans un seul fichier:

./manage.py test app.some_test_in_bananas
116

La réponse donnée par Tomasz est correcte. Cependant, il peut devenir fastidieux de s'assurer que les importations en __init__.py correspond à la structure de votre fichier.

Pour détecter automatiquement tous les tests du dossier vous pouvez l'ajouter 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__)

Vous pouvez maintenant exécuter tous vos tests via manage.py test app ou spécifiques via manage.py test app.TestApples

26
Bryce Drennan

Créez 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 fonctionnera comme prévu.

11
spiderlama

http://docs.python.org/library/unittest.html#organizing-tests parle de diviser les fichiers en modules, et la section juste au-dessus contient un exemple.

5
Jim Deville

Si vous avez une configuration plus compliquée ou si vous ne souhaitez pas utiliser from ... import *- instructions de type, vous pouvez définir une fonction appelée suite dans votre tests.py (ou tests/__ init__.py), qui retourne une instance de unittest.TestSuite.

1
Joel Cross

Avec Django 2.2 une solution simple et assez bonne pourrait être de créer un dossier test dans une application, et vous pouvez mettre vos fichiers test_...py Associés dans, juste ajoutez __init__.py au dossier test.

1
Gabor

Pas besoin de coder quoi que ce soit en init. Créez simplement un sous-répertoire dans votre application. La seule exigence est pour 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
MaxBlax360

Je pense ./manage.py test exécute simplement toutes les astuces de test (dans Django> = 1.7).

Si votre organisation des tests concerne le regroupement et cherrypicking et vous êtes fan de nose use Django nose :

python manage.py test another.test:TestCase.test_method

Si vous connaissez le nez, vous savez comment "joker" beaucoup plus agréable sur tous vos fichiers.

PS

C'est juste une meilleure pratique. J'espère que ça t'as aidé. La réponse a été empruntée à partir d'ici: Exécution d'un cas de test spécifique dans Django lorsque votre application a un répertoire de tests

0
Yauhen Yakimovich