web-dev-qa-db-fra.com

Django test runner ne trouve pas de tests

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

49
user1333

Ç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

11
user1333

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.

129
Eduardo

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!).

48
David Lam

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
14
codingrhythm

Dans mon cas, j'ai tapé def au lieu de class. Au lieu de 

class TestDisplayWeight(TestCase):

J'ai eu

def TestDisplayWeight(TestCase):
10
Flimm

Cela se produit également si vous avez une erreur de syntaxe dans votre tests.py.

9
Daniel Gasull

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 *
6
devsnd

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.

3
David Boshton

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
3
Thijs

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).

3
Nils

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:

  1. Le nom de l'application est répertorié dans INSTALLED_APPS dans settings.py
  2. Assurez-vous que votre DATABASES['default'] à l'intérieur de settings.py est défini correctement
  3. L'application a un models.py (même si vous n'en utilisez pas, au moins un vide doit être présent)
1
Dean Quiñanola

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

1
S.Lott

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'...
0
Benyamin

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.

0
Chris

Utiliser cette syntaxe

python manage.py test

au lieu de ./manage.py test résolu ce problème pour moi.

0
Aleksandr Aksarin

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.

0
Rick Graves

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>

0
Qarj