Speziell benannte Verzeichnisse mit Nosetests

Ist die nosetests Verzeichnisse mit bestimmten Namen anders? Ist ein src Verzeichnis speziell?

Wenn ich ein Projekt habe, dessen Quellverzeichnis heißt src , nosetests scheint gut zu funktionieren. Allerdings, wenn das Verzeichnis irgendetwas anderes benannt wird, berichtet nosetests eine Reihe von nosetests .

Hier ist was ich tat:

  1. Test durchführen

     ~/src$ nosetests .. ---------------------------------------------------------------------- Ran 2 tests in 0.001s OK 
  2. Umbenennen Verzeichnis

     ~/src$ cd .. ~/$ mv src/ src2 
  3. Wiederholungen durchführen

     ~/$ cd src2 ~/src2$ nosetests E ====================================================================== ERROR: Failure: ImportError (No module named **whatever**) ---------------------------------------------------------------------- Traceback (most recent call last): ... etc. ... import **whatever** ImportError: No module named **whatever** ---------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (errors=1) 

Ich konnte in den dokumenten nichts finden.


Beispiel: mit dieser Verzeichnisstruktur:

 . |-- a | |-- b.py | `-- __init__.py |-- __init__.py `-- test |-- a | |-- __init__.py | `-- testb.py `-- __init__.py 

Alle __init__.py Dateien sind leer, der Inhalt von a/b.py sind:

 y = 3 

Und von test/a/testb.py :

 import ab import unittest as u class TestB(u.TestCase): def test1(self): self.assertTrue(True) def test2(self): self.assertTrue(False) 

Ich kann dieses Problem zuverlässig reproduzieren. Laufende nosetests -V gibt:

 nosetests version 1.2.1 

One Solution collect form web for “Speziell benannte Verzeichnisse mit Nosetests”

Schnelle Lösung ist, um __init__.py aus dem Top-Level-Verzeichnis zu entfernen. Eine weitere Möglichkeit ist die Verwendung von relativen Importen, für Ihr Beispiel: ersetzen Sie den import ab mit from ...a import b .

Der Schuldige dieses Chaos und Trickiness ist Nase Importeur .

Wenn das Verzeichnis, in dem du nosetests , ein Paket ist, wird die Nase es nicht zu sys.path hinzufügen, sonst wird es es hinzufügen ( Quelle ). Dann geht es hinauf den Verzeichnisbaum und wendet rekursiv die gleiche Logik an. Gleiche Sache für alle betroffenen Dateien. Dies erklärt, warum es nicht funktioniert mit __init__.py – root dir ( src2 in deinem Fall) war nicht in sys.path – das ist, warum Paket a nicht gefunden wurde.

Aber die offene Frage hier ist: Warum hat es das erste Mal gearbeitet, mit src Ordner? src Ordner ist auf sys.path in diesem Fall. Vielleicht gibt es andere Antworten oder Änderungen.

Siehe ähnliche Fragen:

  • Python Nase Import Error
  • Nosetest mit unerwünschten Elternverzeichnissen
  • Python-Importe für Tests mit Nase – was ist die beste Praxis für die Einfuhr von Modulen über dem aktuellen Paket
  • Python spöttische Drittanbieter-Module
  • Bei der Verwendung von unittest.mock.patch, warum ist autospec nicht true standardmäßig?
  • Python spöttische globale Variable
  • Django Benutzer Setup für Nase Tests
  • AttributeError: <module '__main__' von [..] hat nicht das Attribut 'open'
  • Testen argparse mit unbescheidenen und verspotten
  • Pythonschock und Bibliotheken, die nicht installiert sind
  • Erhalten der End-Speicher-Adresse eines Speicherbereichs über Python / Ctypes
  • Eine Liste aller Module im aktuellen Paket erhalten
  • Verwenden von unittest.mock zum Patch-Eingabe () in Python 3
  • Wie kann ich verhindern, dass Unit-Tests beim Aufruf von webbrowser.open () beenden?
  • Python ist die beste Programmiersprache der Welt.