2017-05-11 6 views
1

Ich bin neu bei Python und komme aus dem Java-Hintergrund.Wie importiere ich getestete Module in Tests?

Angenommen, ich entwickle ein Python-Projekt mit Paket hello:

hello_python/ 
    hello/ 
    hello.py 
    __init__.py 
    test/ 
    test_hello1.py 
    test_hello2.py 

Ich glaube, die Projektstruktur korrekt ist.

Angenommen hello.py enthält Funktion do_hello() Ich möchte in Tests verwenden. Wie importiere ich do_hello in Tests test_hello1.py und test_hello2.py?

+1

Das Importieren in Tests unterscheidet sich nicht vom Importieren in anderem Code. In deinem Fall würdest du 'von hallo.hello import do_hello' machen. –

+0

Danke. Ich hab es geschafft. Jetzt laufen die Tests in 'PyCharm'. Wenn ich jedoch einen Test in der Befehlszeile 'python -m unittest test_hello_server' im aktuellen Verzeichnis' test' starte, habe ich 'ImportError: Kein Modul namens hallo_server.hello_server'. – Michael

+0

Da das übergeordnete Verzeichnis nicht im Pythonpfad enthalten wäre. Stattdessen sollten Sie von "hallo_python" ausgehen und "python -m unittest test.test_hello" oder was auch immer machen. –

Antwort

1

Sie haben 2 kleine Probleme hier. Erstens, Sie führen Ihren Testbefehl aus dem falschen Verzeichnis und zweitens haben Sie Ihr Projekt nicht richtig strukturiert.

Normalerweise versuche ich, wenn ich ein Python-Projekt entwickle, alles im Fokus des Projekts zu halten, was in Ihrem Fall hello_python/ wäre. Python hat das aktuelle Arbeitsverzeichnis standardmäßig auf seiner Laststrecke, also wenn Sie ein Projekt wie dieses haben:

hello_python/ 
    hello/ 
    hello.py 
    __init__.py 
    test/ 
    test_hello1.py 
    test_hello2.py 


# hello/hello.py 
def do_hello(): 
    return 'hello' 

# test/test_hello.py 
import unittest2 
from hello.hello import do_hello 

class HelloTest(unittest2.TestCase): 
    def test_hello(self): 
     self.assertEqual(do_hello(), 'hello') 

if __name__ == '__main__': 
    unittest2.main() 

Zweitens test ist kein Modul gerade jetzt, da Sie die __init__.py verpasst haben in dieses Verzeichnis. Sie sollten eine Hierarchie haben, die wie folgt aussieht:

hello_python/ 
    hello/ 
    hello.py 
    __init__.py 
    test/ 
    __init__.py # <= This is what you were missing 
    test_hello1.py 
    test_hello2.py 

Wenn ich versuche, dass auf meinem Rechner, läuft python -m unittest test.hello_test gut für mich funktioniert.

Sie können feststellen, dass dies noch ein wenig umständlich ist. Ich würde dringend empfehlen, nose zu installieren, mit dem Sie einfach nosetests von Ihrem Projektstamm aufrufen können, um alle Ihre Tests automatisch zu finden und auszuführen - vorausgesetzt, Sie haben die richtigen Module mit __init__.py s.

+0

Gerade bemerkt, dass Sie 'Python' mit' -m' Schalter ausführen. Es funktioniert jetzt für mich! Danke vielmals. – Michael

+0

Ihr Beispiel hat ein kleines Problem. Wenn ich den Komponententest ausführe, läuft _no test_ tatsächlich, weil die Testmethode 'hallo_test' nicht mit' test' beginnt. Instanzen von 'TestCase' führen nur die Methoden' test_ * 'als ihre Tests nach Konvention aus. – Michael

+0

@Michael Whoops! Bedient mich dazu, alles von Hand zu transkribieren und nicht zu kopieren. – ymbirtt

Verwandte Themen