Je connais Python et Django pour la première fois et j'apprends en créant un site de gestion de régime, mais j'ai été complètement vaincu en faisant exécuter mes tests unitaires. Tous les documents et blogs que j'ai trouvés indiquent que, tant qu'il est détectable à partir de tests.py, tests.py se trouve dans le même dossier que models.py et que votre sous-classe de classe de test TestCase doit être automatiquement récupérée. Cela ne fonctionne pas pour moi, lorsque je lance manage.py test <myapp>
, il ne trouve aucun test.
J'ai commencé avec tous mes tests dans leur propre package, mais je l'ai simplifié pour tous les tests juste dans mon fichier tests.py. Le tests.py actuel ressemble à ceci:
import unittest
from pyDietTracker.models import Weight
from pyDietTracker.weight.DisplayDataAdapters import DisplayWeight
class TestDisplayWeight(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def testGetWeightInStone_KG_Correctly_Converted(self):
weight = Weight()
weight.weight = 99.8
testAdapter = DisplayWeight(weight)
self.assertEquals(testAdapter.GetWeightInStone(), '15 st 10 lb')
Je l'ai essayé en sous-classant également la classe Django TestCase, mais cela n'a pas fonctionné non plus. J'utilise Django 1.1.1, Python 2.6 et Snow Leopard.
Je suis sûr que je manque quelque chose de très fondamental et évident, mais je ne peux pas trouver quoi. Des idées?
Edit: Juste une mise à jour rapide après un commentaire
INSTALLED_APPS = (
'Django.contrib.auth',
'Django.contrib.contenttypes',
'Django.contrib.sessions',
'Django.contrib.sites',
'Django.contrib.admin',
'pyDietTracker',
)
Pour exécuter les tests, je lance manage.py test pyDietTracker
Ça a fonctionné.
Il s’avère que j’ai fait Django-admin.py startproject pyDietTracker
mais pas python manage.py startapp myApp
. Après cela, cela a fonctionné comme indiqué. Il semblerait que j'ai beaucoup à apprendre sur la lecture et la différence entre un site et une application sur Django.
Merci pour votre aide S.Lott et Emil Stenström. J'aimerais pouvoir accepter vos deux réponses car elles sont beaucoup aidées.
Leçon la plus importante Les tests ne fonctionnent qu'au niveau de l'application, pas au niveau du site
J'ai eu le même problème, mais mon problème était différent.
Je recevais Ran 0 tests
, en tant que OP.
Mais il s'avère que (les méthodes de test de votre classe de test doivent commencer par le mot clé test
pour s'exécuter).
Exemple:
from Django.test import TestCase
class FooTest(TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def this_wont_run(self):
print 'Fail'
def test_this_will(self):
print 'Win'
De plus, les les fichiers contenant vos tests doivent commencer par le mot clé test
.
Si vous utilisez un paquet/style yourapp/tests
pour les unittests, assurez-vous qu’il contient un __init__.py
(car c’est ce qui en fait un module Python!).
Je peux exécuter des tests pour des applications spécifiques, par exemple.
python project/manage.py test app_name
mais quand je cours
python project/manage.py test
0 tests ont été trouvés
J'ai besoin de l'exécuter dans le même répertoire que manage.py
donc la solution serait, cd au répertoire du projet et exécutez
python manage.py test
Dans mon cas, j'ai tapé def
au lieu de class
. Au lieu de
class TestDisplayWeight(TestCase):
J'ai eu
def TestDisplayWeight(TestCase):
Cela se produit également si vous avez une erreur de syntaxe dans votre tests.py.
Cela peut également se produire lorsque vous utilisez un module tests
au lieu d'un tests.py
. Dans ce cas, vous devez importer toutes les classes de test dans le __init__.py
de votre module de tests, par exemple.
tests/
__init__.py
somemodule.py
Dans votre __init__.py
, vous devez maintenant importer la somemodule
comme ceci:
from .somemodule import *
En voici une autre que je viens de recevoir: vérifiez que vos fichiers de test ne sont pas exécutables. Ma virtualbox les a automatiquement montés en tant qu'exécutables, de sorte que le test de détection les a complètement perdus. Je devais les ajouter aux fichiers __init__.py
pertinents avant que quelqu'un ne me dise quel était le problème, mais ils sont maintenant supprimés et non exécutables, et tout _just_works.
Dans mon cas, il manquait un __init__.py
dans le dossier de l'application. Cela entraîne le comportement selon lequel le test sera exécuté avec python manage.py test project.app_name
mais pas avec python manage.py test
.
project/
app_name/
__init__.py # this was missing
C'est ce qui s'est passé lorsque j'ai eu un fichier test.py et un sous-répertoire test/dans le même répertoire d'applications Django. Je suppose que je confonds python ou le coureur de test si je cherche un module de test (dans test.py) ou un package de test (dans test/subdir).
Si vous essayez d'exécuter un test dans votre application principale, telle que my_app/my_app /, assurez-vous que les éléments suivants sont cochés:
settings.py
DATABASES['default']
à l'intérieur de settings.py
est défini correctementmodels.py
(même si vous n'en utilisez pas, au moins un vide doit être présent)Voir https://docs.djangoproject.com/fr/1.11/topics/testing/overview/
La raison la plus courante pour laquelle les tests ne sont pas exécutés est que vos paramètres ne sont pas corrects et que votre module n'est pas dans INSTALLED_APPS.
Nous utilisons Django.test.TestCase
au lieu de unittest.TestCase
. Il contient la Client
dans.
https://docs.djangoproject.com/fr/1.11/topics/testing/tools/#Django.test.TestCase
dans mon cas, le démarrage de mon nom de fonction avec test_ .__ me manque et lorsque je lance mon test avec:
python manage.py test myapp
le résultat était:
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Destroying test database for alias 'default'...
il semble que Django ne reconnaisse pas mes tests!
alors je change myproject/myapp/test.py fichier comme ceci:
from Django.test import TestCase
# Create your tests here.
class apitest(TestCase):
def test_email(self):
pass
def test_secend(self):
pass
après ce résultat est:
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..
----------------------------------------------------------------------
Ran 2 tests in 2.048s
OK
Destroying test database for alias 'default'...
Exécutez --help
et cherchez verbose. Lancez-le au maximum.
J'ai exécuté manage.py test --verbose
et trouvé cette sortie de débogage tout en haut:
>nosetests --with-spec --spec-color --verbose --verbosity=2
.
Oh regarde! J'avais installé et oublié nosetests
. Et il dit --verbosity=2
. J'ai compris que 3 est le max et en l'exécutant avec 3, j'ai trouvé beaucoup d'entre eux:
nose.selector: INFO: /media/sf_C_DRIVE/Users/me/git/Django/app/tests/test_processors.py is executable; skipped
Cela m'a donné le bon indice. Il a en effet des problèmes avec les fichiers ayant le bit x défini. Cependant, j’ai été mis à l’écart de la piste car certains essais avaient été effectués, même si cela était explicitement indiqué. Changer de bits n'est pas possible car j'exécute les tests sur une machine virtuelle en partageant mon disque Windows NTFS. Donc, ajouter --exe
le corrige.
Utiliser cette syntaxe
python manage.py test
au lieu de ./manage.py test
résolu ce problème pour moi.
Dans le même fichier, j'avais deux classes de test avec SAME NAME , ce qui a bien sûr empêché l'exécution de tous les tests.
J'ai créé une méthode appelée run
dans ma classe de test, qui s'est avérée être une très mauvaise idée. Python pouvait voir que je voulais exécuter des tests, mais que je ne pouvais pas. Ce problème est légèrement différent, mais le résultat est le même - il a semblé que les tests ne pouvaient pas être trouvés.
Notez que le message suivant était affiché:
You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>