1018 Stimmen

Ausführung von unittest mit typischer Testverzeichnisstruktur

Die übliche Verzeichnisstruktur selbst für ein einfaches Python-Modul scheint darin zu bestehen, die Unit-Tests in ihre eigenen test Verzeichnis:

new_project/
    antigravity/
        antigravity.py
    test/
        test_antigravity.py
    setup.py
    etc.

siehe zum Beispiel dies Anleitung zum Python-Projekt .

Meine Frage ist einfach Wie werden die Tests in der Regel durchgeführt? Ich vermute, das ist für alle außer mir offensichtlich, aber man kann nicht einfach python test_antigravity.py aus dem Testverzeichnis als seine import antigravity wird fehlschlagen, da das Modul nicht im Pfad enthalten ist.

Ich weiß, dass ich PYTHONPATH und andere Suchpfad-bezogene Tricks ändern könnte, aber ich kann nicht glauben, dass das der einfachste Weg ist - es ist in Ordnung, wenn Sie der Entwickler sind, aber nicht realistisch zu erwarten, dass Ihre Benutzer es benutzen, wenn sie nur überprüfen wollen, ob die Tests erfolgreich sind.

Die andere Alternative ist, die Testdatei einfach in das andere Verzeichnis zu kopieren, aber das scheint etwas dumm und verfehlt den Sinn, sie zunächst in einem separaten Verzeichnis zu haben.

Wenn Sie also gerade den Quellcode meines neuen Projekts heruntergeladen hätten, wie würden Sie die Unit-Tests ausführen? Ich würde eine Antwort bevorzugen, die es mir ermöglicht, meinen Benutzern zu sagen: "Um die Unit-Tests auszuführen, machen Sie X."

6 Stimmen

@EMP Die richtige Lösung, wenn Sie den Suchpfad festlegen müssen, ist,... den Suchpfad festzulegen. Welche Art von Lösung haben Sie erwartet?

9 Stimmen

@CarlMeyer eine andere bessere Lösung ist die Verwendung der unittest Befehlszeilenschnittstelle wie in meinem Antwort unten damit Sie das Verzeichnis nicht zum Pfad hinzufügen müssen.

65 Stimmen

Das gilt auch für mich. Ich habe gerade damit begonnen, meine allerersten Unit-Tests für ein kleines Python-Projekt zu schreiben und habe mehrere Tage gebraucht, um mich mit der Tatsache auseinanderzusetzen, dass ich nicht ohne weiteres einen Test ausführen kann, während ich meine Quellen in einem src-Verzeichnis und die Tests in einem Test-Verzeichnis aufbewahre, anscheinend mit einem der vorhandenen Test-Frameworks. Ich werde schließlich Dinge akzeptieren, einen Weg finden; aber dies war eine sehr frustrierende Einführung. (Und ich bin ein Unit-Testing-Veteran außerhalb von Python.)

18voto

andpei Punkte 2434

Ich hatte das gleiche Problem, mit einem separaten Ordner für Unit-Tests. Von den erwähnten Vorschlägen füge ich die absoluter Quellpfad a sys.path .

Der Vorteil der folgenden Lösung ist, dass man die Datei ausführen kann test/test_yourmodule.py ohne vorher in das Test-Verzeichnis zu wechseln:

import sys, os
testdir = os.path.dirname(__file__)
srcdir = '../antigravity'
sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir)))

import antigravity
import unittest

15voto

Alan L Punkte 1535

Mir ist aufgefallen, dass die Importe korrekt und ohne Änderungen funktionieren, wenn Sie die Unittest-Befehlszeilenschnittstelle von Ihrem "src"-Verzeichnis aus starten.

python -m unittest discover -s ../test

Wenn Sie dies in eine Batch-Datei in Ihrem Projektverzeichnis einfügen möchten, können Sie dies folgendermaßen tun:

setlocal & cd src & python -m unittest discover -s ../test

13voto

Derek Soike Punkte 10066

Lösung/Beispiel für das Python unittest Modul

Gegeben sei die folgende Projektstruktur:

ProjectName
  project_name
 |     models
 |    |     thing_1.py
 |     __main__.py
  test
       models
      |     test_thing_1.py
       __main__.py

Sie können Ihr Projekt aus dem Root-Verzeichnis mit python project_name , die die ProjectName/project_name/__main__.py .


So führen Sie Ihre Tests mit python test , die effektiv läuft ProjectName/test/__main__.py müssen Sie Folgendes tun:

1) Drehen Sie Ihr test/models Verzeichnis in ein Paket durch Hinzufügen eines __init__.py Datei. Dadurch wird der Zugriff auf die Testfälle innerhalb des Unterverzeichnisses vom übergeordneten Verzeichnis test Verzeichnis.

# ProjectName/test/models/__init__.py

from .test_thing_1 import Thing1TestCase        

2) Ändern Sie Ihren Systempfad in test/__main__.py zur Aufnahme der project_name Verzeichnis.

# ProjectName/test/__main__.py

import sys
import unittest

sys.path.append('../project_name')

loader = unittest.TestLoader()
testSuite = loader.discover('test')
testRunner = unittest.TextTestRunner(verbosity=2)
testRunner.run(testSuite)

Jetzt können Sie erfolgreich Dinge aus project_name in Ihren Tests.

# ProjectName/test/models/test_thing_1.py    

import unittest
from project_name.models import Thing1  # this doesn't work without 'sys.path.append' per step 2 above

class Thing1TestCase(unittest.TestCase):

    def test_thing_1_init(self):
        thing_id = 'ABC'
        thing1 = Thing1(thing_id)
        self.assertEqual(thing_id, thing.id)

11voto

Tom Willis Punkte 5186

Wenn Sie "python setup.py develop" ausführen, wird das Paket im Pfad enthalten sein. Aber Sie wollen das vielleicht nicht tun, weil Sie Ihre System-Python-Installation infizieren könnten, weshalb Werkzeuge wie virtualenv y Aufbau existieren.

8voto

iambr Punkte 4055

Python 3+

Hinzufügung zu @Pierre

Verwendung von unittest Verzeichnisstruktur wie folgt:

new_project
 antigravity
    __init__.py         # make it a package
    antigravity.py
 test
     __init__.py         # also make test a package
     test_antigravity.py

So führen Sie das Testmodul aus test_antigravity.py :

$ cd new_project
$ python -m unittest test.test_antigravity

Oder eine einzelne TestCase

$ python -m unittest test.test_antigravity.GravityTestCase

Obligatorisch Vergessen Sie nicht die __init__.py auch wenn sie leer ist, sonst nicht funktionieren wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X