2016-04-29 7 views
0

Hier ist meine Ordnerstruktur:Wie Python "Import" funktioniert tatsächlich bei Verwendung von Unittest?

. 
├── mod 
│   └── a.py 
└── tests 
    └── test_a.py 

2 directories, 2 files 

Tests/test_a.py einfach wie folgt aussieht:

import unittest 
from mod import a 

class ATestCase(unittest.TestCase): 
    def test_a(self): 
     print(a.a) 

if __name__ == "__main__": 
    unittest.main() 

Als ich Unittest tun, sicherlich alles in Ordnung ist:

$ python -m unittest tests/test_a.py 
1 
. 
---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 

jedoch , wenn ich einfach tests/test_a.py als Python-Skript ausführen, passiert der Fehler:

$ python tests/test_a.py 
Traceback (most recent call last): 
    File "tests/test_a.py", line 2, in <module> 
    from mod import a 
ImportError: No module named 'mod' 

Meine Frage ist, warum Mod mit Unittest importiert werden kann?

+0

@czheo haben Sie diese ähnliche Frage http://stackoverflow.com/questions/1896918/running-unittest-with-typic-test-directory-structure gesehen Hilft das? –

+0

@shafaq Meinst du das unitest Modul modifiziert "sys.path"? Als ich jedoch sys.path in meiner Datei test_a.py ausgedruckt habe, habe ich nicht festgestellt, dass es modifiziert wurde. – czheo

+0

Es führt den ersten Artikelpfad [0] aus. Versuchen Sie, 'print os.path.abspath (sys.path [0])' 'zu drucken. Sie werden sehen, dass es Ihnen den Pfad zum 'mod'-Verzeichnis geben würde. Ohne "unitest" würde es in das "test" -Verzeichnis gehen. Also ist ein Modul nicht nachvollziehbar. –

Antwort

0

Wie bereits erwähnt und diskutiert diese Frage: Running unittest with typical directory structure

Die beste Lösung meiner Meinung nach ist das Unittest Kommandozeilen-Schnittstelle zu verwenden, die das Verzeichnis in das sys.path hinzufügen wird, so dass Sie nicht haben (in der TestLoader-Klasse getan).

bei der Dokumentation der Suche: sys.path

Wie beim Programmstart initialisiert, das erste Element dieser Liste, Pfad [0], ist das Verzeichnis, das das Skript enthält, das verwendet wurde, die Python-Interpreter aufgerufen . Versuchen

print os.path.abspath(sys.path[0]) Druck, wenn python -m unittest tests.test_a mit (in einer Funktion/Methode), und Sie werden ../mod auf Ihrem Weg sehen, und deshalb a befindet.

Jetzt laufen python tests/test_a.py und tests Verzeichnis wäre auf Pfad daher a würde nicht gefunden werden.

Verwandte Themen