Ich kann das Nasentest-Framework anscheinend nicht dazu bringen , Module unter meinem Testskript in der Dateistruktur zu erkennen. Ich habe das einfachste Beispiel erstellt, das das Problem demonstriert. Ich werde es unten erklären.
Hier ist die Struktur der Paketdatei:
./__init__.py
./foo.py
./tests
./__init__.py
./test_foo.py
foo.py enthält:
def dumb_true():
return True
tests / test_foo.py enthält:
import foo
def test_foo():
assert foo.dumb_true()
Beide init .py-Dateien sind leer
Wenn ich nosetests -vv
im Hauptverzeichnis (wo foo.py ist) laufe, bekomme ich:
Failure: ImportError (No module named foo) ... ERROR
======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
addr.filename, addr.module)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
return self.importFromDir(dir_path, fqname)
File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
mod = load_module(part_fqname, fh, filename, desc)
File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
import foo
ImportError: No module named foo
----------------------------------------------------------------------
Ran 1 test in 0.002s
FAILED (errors=1)
Ich erhalte den gleichen Fehler, wenn ich aus dem Verzeichnis tests / heraus laufe. Gemäß der Dokumentation und einem Beispiel, das ich gefunden habe, soll nas alle übergeordneten Pakete zum Pfad sowie zu dem Verzeichnis hinzufügen, aus dem es aufgerufen wird, aber dies scheint in meinem Fall nicht zu geschehen.
Ich verwende Ubuntu 8.04 mit Python 2.6.2. Ich habe die Nase manuell gebaut und installiert (nicht mit setup_tools), wenn das wichtig ist.
quelle
Bist du in einer virtuellen Umgebung? In meinem Fall
nosetests
war derjenige in/usr/bin/nosetests
, der verwendet wurde/usr/bin/python
. Die Pakete in der virtuellen Umgebung befinden sich definitiv nicht im Systempfad. Folgendes hat dies behoben:quelle
nosetests
wurde vonbash
dem system eins in zwischengespeichert/usr/local/bin
(währendwhich nosetests
das richtige ergebnis gegeben wurde). Früher habe ich dies um es zu löschen.Für diejenigen unter Ihnen, die diese Frage später finden: Ich erhalte den Importfehler, wenn ich keine
__init__.py
Datei in meinem Testverzeichnis habe.Meine Verzeichnisstruktur war wie folgt:
Wenn ich Nasentests durchgeführt habe:
Es würde das geben
ImportError
, was alle anderen sehen. Wenn ich eine leere__init__.py
Datei hinzufüge , funktioniert das einwandfrei:quelle
Ein weiteres potenzielles Problem scheinen Bindestriche / Bindestriche im Verzeichnisbaum zu sein. Ich habe kürzlich ein Problem mit dem ImportError behoben, indem ich ein Verzeichnis von
sub-dir
nach umbenannt habesub_dir
.quelle
Natürlich, wenn Sie einen Syntaxfehler im zu importierenden Modul haben, der dies verursacht. Für mich hat sich das Problem bemerkbar gemacht, als ich eine Sicherungskopie einer Testdatei mit einem Pfad wie module / tests.bak.py im selben Verzeichnis wie tests.py hatte. Um das Problem mit dem Init- Paket / Modul in einer Django-App zu beheben, können Sie Folgendes ausführen (in einer Bash / OSX-Shell), um sicherzustellen, dass keine Init- Pyc-Dateien herumliegen:
quelle
Ich habe diese Fehlermeldung erhalten, weil ich das ausführe
nosetests
Befehl aus dem falschen Verzeichnis ausgeführt habe.Dumm, aber passiert.
quelle
nosetests
in einem Verzeichnis ohne Tests führt zuRan 0 tests
keinem Importfehler. In der gegenwärtigen Form ist diese Antwort nicht nützlich.Ich bin nur auf eine weitere Sache gestoßen, die dieses Problem verursachen könnte: die Benennung von Tests im Formular
testname.test.py
. Dieses Extra.
verwirrt die Nase und führt dazu, dass Dinge importiert werden, die es nicht sollte. Ich nehme an, es mag offensichtlich sein, dass die Verwendung unkonventioneller Namenskonventionen für Tests die Dinge kaputt macht, aber ich dachte, es könnte erwähnenswert sein.quelle
Zum Beispiel mit der folgenden Verzeichnisstruktur, wenn Sie wollen laufen
nosetests
inm1
,m2
oder aufm3
bestimmte Funktionen zu testenn.py
, die Sie verwenden sollenfrom m2.m3 import n
intest.py
.quelle
Nur um die Frage zu beantworten: Wenn Sie mit einer Struktur wie dieser zu kämpfen haben:
Und vielleicht möchten Sie den Test von einem Pfad außerhalb des Projekts aus ausführen und Ihren Projektpfad in Ihren PYTHONPATH aufnehmen.
Fügen Sie es in Ihr .profile ein. Wenn Sie sich in einer virtuellen Umgebung befinden, fügen Sie sie in die Aktivierung in Ihrer venv-Wurzel ein
quelle