Django-Testläufer findet keine Tests

77

Ich bin sowohl für Python als auch für Django neu und lerne, indem ich eine Website für das Diätmanagement erstelle, aber ich bin völlig besiegt, weil meine Unit-Tests ausgeführt wurden. Alle Dokumente und Blogs, die ich gefunden habe, besagen, dass sich tests.py, solange es aus tests.py erkennbar ist, im selben Ordner befindet wie models.py und Ihre Testklasse-Unterklassen TestCase, automatisch abgerufen werden sollte. Dies funktioniert bei mir nicht, wenn ich es ausführe manage.py test <myapp>, werden keine Tests gefunden.

Ich habe mit all meinen Tests in einem eigenen Paket begonnen, es aber auf alle Tests vereinfacht, die sich nur in meiner Datei tests.py befinden. Die aktuelle tests.py sieht aus wie:

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

Ich habe es versucht, indem ich auch die Django TestCase-Klasse untergeordnet habe, aber das hat auch nicht funktioniert. Ich verwende Django 1.1.1, Python 2.6 und verwende Snow Leopard.

Ich bin mir sicher, dass mir etwas sehr Grundlegendes und Offensichtliches fehlt, aber ich kann einfach nicht herausfinden, was. Irgendwelche Ideen?

Bearbeiten: Nur ein kurzes Update nach einem Kommentar

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'pyDietTracker',
 )

Um die Tests zum Laufen zu bringen, laufe ich manage.py test pyDietTracker

Geckon
quelle
Welchen Befehl führen Sie aus, damit diese ausgeführt werden? Wie settingssiehst du aus? Befindet sich diese Anwendung in der Liste von INSTALLED_APPS?
S.Lott
Ich habe die Frage mit meinem INSTALLED_APPS aktualisiert. Gibt es einen anderen Teil der Einstellungen, der relevant ist? Danke
Welche Nachrichten erhalten Sie tatsächlich?
S.Lott
Ich erhalte keine Fehlermeldung, es heißt nur, dass 0 Tests ausgeführt werden. Ich bin nicht am Computer, aber wenn ich versuche, die Testklasse direkt zu benennen, wird eine Fehlermeldung angezeigt, die sich nach einem nicht geeigneten Testfall richtet. Ich werde es genau dann veröffentlichen, wenn ich zurück bin.
@ L2Type: Sie können die TestCase-Klasse nicht einfach direkt benennen. Sie nennen die App, der Django-Läufer macht seine Entdeckungssache, indem er in models.py und tests.py
S.Lott

Antworten:

165

Ich hatte das gleiche Problem, aber mein Problem war anders.

Ich wurde Ran 0 testsals OP.

Es stellt sich jedoch heraus, dass die Testmethoden in Ihrer Testklasse mit dem Schlüsselwort beginnen müssen, um testausgeführt zu werden .

Beispiel:

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'

Auch die Dateien mit Ihren Tests müssen mit dem testSchlüsselwort beginnen .

Eduardo
quelle
14
Wenn es immer noch nicht funktioniert, überprüfen Sie, ob der Dateiname mit diesem Muster übereinstimmt: test*.pySo wählt Django die Testanzugdateien aus. Django Doc
Linqu
Für andere Leser gibt es auch eine Änderung, um Djangos TestCase anstelle von
unittest
84

Wenn Sie ein yourapp/testsPaket / einen Stil für Unittests verwenden, stellen Sie sicher, dass dort ein enthalten ist __init__.py(da dies ein Python-Modul ist!).

David Lam
quelle
Ja! Wenn Sie einen benutzerdefinierten Ordner für die gewünschte App verwenden, um Tests auszuführen (z. B. my_apps/app_name/", sollten Sie eine __init__.pyDatei in erstellen my_apps/.
31

Ich kann Tests für bestimmte Apps ausführen, z

python project/manage.py test app_name

aber wenn ich renne

python project/manage.py test

Es wurden 0 Tests gefunden

Finden Sie heraus, dass ich dies im selben Verzeichnis wie manage.py ausführen muss

Die Lösung wäre also, CD in das Projektverzeichnis zu schreiben und auszuführen

python manage.py test
Kodierungsrhythmus
quelle
Das gleiche passierte mir ( github.com/agconti/cookiecutter-django-rest/blob/master/… )
Julien Le Coupanec
2
Das hat mir geholfen, danke. Es scheint, dass der Testläufer das aktuelle Arbeitsverzeichnis erkennt , bei dem es sich selbst um ein Python-Paket handeln muss ( docs.djangoproject.com/de/dev/topics/testing/overview/… ). Alternativ können Sie Tests wie diesen python project/manage.py test project/
aufrufen
15

In meinem Fall fehlte im App-Ordner selbst ein __init__.py. Dies führt zu dem Verhalten, mit dem der Test ausgeführt wird, python manage.py test project.app_namejedoch nicht mit python manage.py test.

project/
  app_name/
    __init__.py   # this was missing
Thijs
quelle
1
Vielen Dank! Sie haben mir geholfen, mein Problem zu finden, nämlich, dass ich einen Ordner 'tests' erstellt habe, in dem meine Testskripte gespeichert sind, aber vergessen habe, die Datei init .py
Little Brain
Gleiches hier: Ich hatte project/apps/core, ohne __init__.pyin project/apps.
20.
Vielen Dank, dass Sie dies testsgepostet haben. Ich habe einen Unterordner erstellt, aber vergessen, einen __init__.pyunter dieser Richtung einzufügen . Das Hinzufügen hat es geschafft!
Ezra_Bender
Vielen Dank. Ich hatte sehr lange mit diesem Problem zu kämpfen. Endlich hat das Hinzufügen __init__.pyzur App funktioniert. Anfangs habe ich nur __init__.pyden Testordner eingecheckt.
Pooja
14

Dies passiert auch, wenn Sie in Ihrer tests.py einen Syntaxfehler haben.

Daniel Gasull
quelle
11

Hat es geschafft.

Es stellte sich heraus, dass ich es getan hatte, django-admin.py startproject pyDietTrackeraber nicht python manage.py startapp myApp. Nachdem ich zurückgegangen war und dies getan hatte, funktionierte es wie dokumentiert. Anscheinend muss ich viel über das Lesen und den Unterschied zwischen einer Website und einer App in Django lernen.

Vielen Dank für Ihre Hilfe S.Lott und Emil Stenström. Ich wünschte, ich könnte beide Ihre Antworten akzeptieren, weil beiden sehr geholfen wird.

Wichtigste Lektion Tests funktionieren nur auf App-Ebene, nicht auf Site-Ebene


quelle
11

In meinem Fall habe ich getippt defstatt class. Anstatt

class TestDisplayWeight(TestCase): # correct!

ich hatte

def TestDisplayWeight(TestCase): # wrong!
Flimm
quelle
9

Dies kann auch passieren, wenn Sie ein testsModul anstelle von a verwenden tests.py. In diesem Fall müssen Sie alle Testklassen in das __init__.pyModul Ihres Tests importieren , z

tests/
    __init__.py
    somemodule.py

In Ihrem müssen __init__.pySie jetzt Folgendes importieren somemodule:

from .somemodule import *
devsnd
quelle
1
Das war mein Problem und ich habe es dank dir behoben. Grüße!
Dhargan
2
Dies mag funktionieren, aber ich denke nicht, dass es die richtige Lösung ist, da ich ein anderes Python-Projekt habe, für das dieser Import nicht erforderlich ist, um Tests auszuführen.
Matt
Das war auch mein Problem. Vielen Dank!
dnsiv
Ich verwende Skripte, um meine Tests auszuführen. Ein paar Monate und ein neuer Computer später brachen die Tests unerwartet ab. Dies hat es behoben. Keine Ahnung, was der Unterschied war. Vielleicht eine andere Python-Version. Vielleicht ein neuerer Django ...
Chris
4

Hier ist noch eine, die ich gerade hatte: Überprüfen Sie, ob Ihre Testdateien nicht ausführbar sind. Meine Virtualbox hat sie automatisch als ausführbare Datei gemountet, sodass die Testerkennung sie vollständig übersehen hat. Ich musste sie in die relevanten __init__.pyDateien einfügen, bevor mir jemand sagte, was das Problem war, aber jetzt sind sie entfernt und nicht ausführbar und alles funktioniert.

David Boshton
quelle
3

Dies geschah, als ich eine test.py-Datei und ein test / -Unterverzeichnis im selben Django-App-Verzeichnis hatte. Ich denke, ich verwirre Python oder den Testläufer, ob ich nach einem Testmodul (in test.py) oder einem Testpaket (in test / subdir) suche.

Nils
quelle
3

In meinem Fall vermisse ich es, meinen Funktionsnamen mit test_ zu beginnen und wenn ich meinen Test mit:

python manage.py test myapp

Ergebnis war:

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

es scheint, dass Django meine Tests nicht erkennen kann!

dann ändere ich die Datei myproject / myapp / test.py wie folgt :

from django.test import TestCase
# Create your tests here.
class apitest(TestCase):

    def test_email(self):
        pass
    def test_secend(self):
        pass

nach diesem Ergebnis ist:

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'...
Benyamin
quelle
2

Verwendung dieser Syntax

python manage.py test

anstatt ./manage.py testdieses Problem für mich zu lösen.

Aleksandr Aksarin
quelle
1

Wenn Sie versuchen, einen Test in Ihrer Haupt-App wie my_app / my_app / auszuführen, stellen Sie sicher, dass Folgendes überprüft wurde:

  1. Der Name der App ist in INSTALLED_APPS aufgeführt settings.py
  2. Stellen Sie sicher, dass Ihr DATABASES['default']Inneres settings.pyrichtig eingestellt ist
  3. Die App hat eine models.py(auch wenn Sie keine verwenden, muss mindestens eine leere vorhanden sein)
Dean Quiñanola
quelle
4
Wenn Sie einen '' Tests '' - Ordner verwenden, denken Sie daran, dort eine '' _ init _.py '' - Datei abzulegen.
Xbello
1

Siehe https://docs.djangoproject.com/de/1.11/topics/testing/overview/

Der häufigste Grund dafür, dass Tests nicht ausgeführt werden, ist, dass Ihre Einstellungen nicht richtig sind und sich Ihr Modul nicht in INSTALLED_APPS befindet.

Wir verwenden django.test.TestCaseanstelle von unittest.TestCase. Es hat dieClient gebündelt.

https://docs.djangoproject.com/de/1.11/topics/testing/tools/#django.test.TestCase

S.Lott
quelle
Vielen Dank, ich war über Seite und mein Modul ist in der INSTALLED_APPS
Testmethoden in Ihrer Testklasse müssen mit dem Schlüsselworttest beginnen, um ausgeführt zu werden.
hassanzadeh.sd
0

In derselben Datei hatte ich zwei Testklassen mit dem gleichen Namen , und dies verhinderte natürlich, dass alle Tests ausgeführt wurden.

Rick Graves
quelle
0

Ich habe eine Methode erstellt, die runin meiner Testklasse aufgerufen wurde und sich als sehr schlechte Idee herausstellte. Python konnte sehen, dass ich Tests ausführen wollte, dies aber nicht konnte. Dieses Problem ist etwas anders, aber das Ergebnis ist das gleiche - es schien, als könnten die Tests nicht gefunden werden.

Beachten Sie, dass die folgende Meldung angezeigt wurde: You want to run the existing test: <unittest.runner.TextTestResult run=0 errors=0 failures=0>

Qarj
quelle
0

Laufen Sie --helpund suchen Sie nach ausführlichen. Kurbeln Sie es auf max.

Ich lief manage.py test --verboseund fand diese Debug-Ausgabe ganz oben:

>nosetests --with-spec --spec-color --verbose --verbosity=2.

Oh schau! Ich hatte installiert und vergessen nosetests. Und es heißt --verbosity=2. Ich habe herausgefunden, dass 3 das Maximum ist und habe es mit 3 ausgeführt. Ich habe viele davon gefunden:

nose.selector: INFO: /media/sf_C_DRIVE/Users/me/git/django/app/tests/test_processors.py is executable; skipped

Das gab mir den richtigen Hinweis. Es hat tatsächlich Probleme mit Dateien, bei denen das x-Bit gesetzt ist. Ich wurde jedoch von der Strecke geworfen, da einige der Tests ausgeführt wurden - obwohl ausdrücklich angegeben wurde, dass sie übersprungen werden würden. Das Ändern von Bits ist nicht möglich, da ich die Tests in einer VM ausführe und meine Windows NTFS-Festplatte freigebe. Also das Hinzufügen --exebehoben.

Chris
quelle
0

Hatte das gleiche Problem und es lag daran, dass mein Dateiname ein -Zeichen im Namen hatte. Mein Dateiname war route-tests.pyund wurde geändert inroute_tests.py

O-9
quelle
0

Wenn dieser Fehler nach dem Upgrade auf Django 3 auftritt, kann dies daran liegen, dass der -kParameter seine Bedeutung geändert hat von:

-k, --keepdb          Preserves the test DB between runs.

zu

-k TEST_NAME_PATTERNS   Only run test methods and classes that match the pattern or substring. Can be used multiple times. Same as unittest -k option.

So ersetzen Sie einfach -kmit , --keepdbum es wieder zu arbeiten.

Eric Darchis
quelle
0

Die Django-Engine durchsucht Dateien und Ordner mit dem test_Präfix (innerhalb einestests Ordners). In meinem Fall war es eine einfache Lösung.

Stellen Sie also sicher, dass der Name der Datei / des Ordners damit beginnt.

George
quelle