Ich habe easy_install verwendet, um pytest auf einem Mac zu installieren, und habe angefangen, Tests für ein Projekt mit einer Dateistruktur wie folgt zu schreiben:
repo/
repo/app.py
repo/settings.py
repo/models.py
repo/tests/
repo/tests/test_app.py
Wenn Sie py.test
im Repo-Verzeichnis ausgeführt werden, verhält sich alles wie erwartet
Aber wenn ich dasselbe unter Linux oder Windows versuche (beide haben Pytest 2.2.3), bellt es immer dann, wenn es zum ersten Mal etwas aus meinem Anwendungspfad importiert. Sagen Sie zum Beispielfrom app import some_def_in_app
Muss ich meinen PFAD bearbeiten, um py.test auf diesen Systemen auszuführen? Hat das jemand erlebt?
python
unit-testing
pytest
MattoTodd
quelle
quelle
Antworten:
Ja, der Quellordner befindet sich nicht im Python-Pfad, wenn Sie
cd
zum Testverzeichnis wechseln .Sie haben 2 Möglichkeiten:
Fügen Sie den Pfad manuell zu den Testdateien hinzu.
Führen Sie die Tests mit der env var aus
PYTHONPATH=../
.quelle
cd
in ein Verzeichnis? Ich rennepy.test
von meiner Wurzel. es sei denn, ich irre mich und du meinst, wie Pytest durch meine Ordner gehtcd
Problem wäre, würde ich es nicht auch auf dem Mac treffen?Ich bin nicht sicher, warum py.test das aktuelle Verzeichnis nicht in PYTHONPATH selbst hinzufügt, aber hier ist eine Problemumgehung (die vom Stammverzeichnis Ihres Repositorys ausgeführt werden muss):
Es funktioniert, weil Python das aktuelle Verzeichnis im PYTHONPATH für Sie hinzufügt.
quelle
project/test/all-my-tests
undproject/src/app.py
und wegen dieser Änderung muss man dasapp.py
indirekt über eine__main__.py
Datei in aufrufenproject/src
, damit man den Aufruf verwenden kannpython -m src
. Soweit ich das beurteilen kann, ziemlich chaotisch./home/user/dev/projectxyz/src ...
wirklich schlecht wären und in den meisten Fällen nicht auf anderen Maschinen laufen würden. Ich denke, was ich damit gemeint habe, ist, dass ich immer den gesamten Projektstamm in den Modulpfad schreiben muss, auch wenn sich ein Modul im selben Ordner befindet wie die Datei. Ich wusste nicht, dass dies als Best Practice angesehen wird, daher ist dies eine nützliche Information, danke. Ich stimme den meisten von pep8 zu, obwohl es immer noch nicht perfekt ist.__init__.py
in Tests hinzugefügt , dass das Problem gelöst ist. Jetzt kann ich verwendenpytest
conftest
LösungDie am wenigsten invasive Lösung ist das Hinzufügen einer leeren Datei mit dem Namen
conftest.py
imrepo/
Verzeichnis:Das ist es. Sie müssen keinen benutzerdefinierten Code schreiben, um das zu entstellen,
sys.path
oder Sie müssen daran denken, mitzuschleppenPYTHONPATH
oder zu platzieren__init__.py
mitzunehmen in Verzeichnisse zu in die er nicht gehört.Das Projektverzeichnis danach:
Erläuterung
pytest
sucht nach denconftest
Modulen in der Testsammlung, um benutzerdefinierte Hooks und Fixtures zu erfassen, undpytest
fügtconftest.py
sys.path
zum Importieren der benutzerdefinierten Objekte das übergeordnete Verzeichnis von the zu (in diesem Fall dasrepo
Verzeichnis) hinzu.Andere Projektstrukturen
Wenn Sie eine andere Projektstruktur haben, platzieren Sie das
conftest.py
im Paketstammverzeichnis (dasjenige, das Pakete enthält, aber selbst kein Paket ist, also kein enthält__init__.py
), zum Beispiel:src
LayoutObwohl dieser Ansatz mit dem
src
Layout verwendet werden kann (conftest.py
imsrc
Verzeichnis platzieren):Vorsicht , dass das Hinzufügen
src
zuPYTHONPATH
den Sinn und Nutzen des mildertsrc
Layout! Am Ende testen Sie den Code aus dem Repository und nicht das installierte Paket. Wenn Sie es tun müssen, brauchen Sie vielleicht dassrc
Verzeichnis überhaupt nicht.Wohin von hier aus?
Natürlich sind
conftest
Module nicht nur einige Dateien, die bei der Erkennung des Quellcodes hilfreich sind. Hier finden alle projektspezifischen Verbesserungen despytest
Frameworks und die Anpassung Ihrer Testsuite statt.pytest
hat viele Informationen zuconftest
Modulen, die in ihren Dokumenten verteilt sind ; Beginnen Sie mitconftest.py
: lokalen Plugins pro VerzeichnisAußerdem hat SO eine ausgezeichnete Frage zu
conftest
Modulen: Wozu werden in py.test conftest.py-Dateien verwendet?quelle
pytest
und dringend davon abgeraten wird. Auf diese Weise pflanzen Sie Samen für zukünftige Fehler. Erstellen Sie ein anderes Modul mit dem Namenutils.py
und platzieren Sie dort den Code für die Wiederverwendung in Tests.conftest.py
es nicht zum Anwendungscode und imo ist essrc/
nicht korrekt , es unter zu platzieren .Ich hatte das gleiche Problem. Ich habe es behoben, indem ich
__init__.py
meinemtests
Verzeichnis eine leere Datei hinzugefügt habe .quelle
avoid “__init__.py” files in your test directories. This way your tests can run easily against an installed version of mypkg, independently from the installed package if it contains the tests or not.
SRC: pytest.org/latest/goodpractises.html__init__.py
aus meinem Testverzeichnis es für mich gelöst hat.__init__.py
In-Unterverzeichnisses vontest/
funktioniert der absolute Import für die Ausführung bestimmter Tests in diesem Unterverzeichnis für zu installierende Module. Vielen Dank.Führen Sie
pytest
sich als Modul aus mit:python -m pytest tests
quelle
python -m pytest
ohne eine andere Erklärung als "weil es funktioniert" zu verwendenpackage/src package/tests
und intests
Sie importiert wirdsrc
. Bei der Ausführung als Modul werden Importe als absolut und nicht relativ zum Ausführungsort betrachtet.Sie können mit PYTHONPATH im Projektstamm ausführen
Oder verwenden Sie pip install als bearbeitbaren Import
quelle
test
Verzeichnis, das nicht in dersrc
Verzeichnisstruktur vorliegt und aus dem Verzeichnis aufruft, das sowohltest
als auch das Verzeichnis enthältsrc
.Ich habe dies als Antwort auf Ihre Frage und meine eigene Verwirrung erstellt. Ich hoffe, es hilft. Achten Sie sowohl in der py.test-Befehlszeile als auch in der tox.ini auf PYTHONPATH.
https://github.com/jeffmacdonald/pytest_test
Insbesondere: Sie müssen py.test und tox mitteilen, wo sich die Module befinden, die Sie einschließen.
Mit py.test können Sie dies tun:
Und mit tox fügen Sie dies Ihrer tox.ini hinzu:
quelle
Ich hatte das gleiche Problem in Flask.
Als ich hinzufügte:
zum Testordner, Problem verschwunden :)
Wahrscheinlich konnte die Anwendung Ordnertests nicht als Modul erkennen
quelle
Ich habe es behoben, indem ich die oberste Ebene
__init__.py
im übergeordneten Ordner meiner Quellen entfernt habe.quelle
Ich bekam seltsame
ConftestImportFailure: ImportError('No module named ...
Fehler, als ich versehentlich eine__init__.py
Datei zu meinem src-Verzeichnis hinzugefügt hatte (das kein Python-Paket sein sollte, sondern nur ein Container aller Quellen).quelle
Ich habe diesen Fehler aufgrund von etwas noch Einfacherem erhalten (man könnte sogar Triviales sagen). Ich hatte das
pytest
Modul nicht installiert . Also einfachapt install python-pytest
Problem für mich behoben.'pytest' wäre in setup.py als Testabhängigkeit aufgeführt worden. Stellen Sie sicher, dass Sie auch die Testanforderungen installieren.
quelle
Ich hatte ein ähnliches Problem.
pytest
Ich habe kein Modul erkannt, das in der Umgebung installiert ist, in der ich gearbeitet habe.Ich habe es behoben, indem ich es auch
pytest
in derselben Umgebung installiert habe .quelle
Für mich wurde das Problem
tests.py
von Django zusammen mit demtests
Verzeichnis generiert . Das Entfernentests.py
löste das Problem.quelle
Ich habe diesen Fehler erhalten, weil ich relative Importe falsch verwendet habe. Im OP-Beispiel sollte test_app.py Funktionen importieren, indem z
Obwohl __init__.py-Dateien großzügig über die Dateistruktur verteilt sind, funktioniert dies nicht und erzeugt die Art von ImportError, die angezeigt wird, es sei denn, die Dateien und Testdateien befinden sich im selben Verzeichnis.
Hier ist ein Beispiel dafür, was ich mit einem meiner Projekte zu tun hatte:
Hier ist meine Projektstruktur:
Um über test_activity_indicator.py auf activity_indicator.py zugreifen zu können, musste ich:
quelle
Sehr oft wurden die Tests unterbrochen, weil das Modul nicht importiert werden konnte. Nach Recherchen stellte ich fest, dass das System die Datei an der falschen Stelle betrachtet und wir das Problem leicht überwinden können, indem wir die Datei mit dem Modul in kopieren der gleiche Ordner wie angegeben, um ordnungsgemäß importiert zu werden. Ein weiterer Lösungsvorschlag wäre, die Deklaration für den Import zu ändern und MutPy den korrekten Pfad der Einheit anzuzeigen. Aufgrund der Tatsache, dass mehrere Einheiten diese Abhängigkeit haben können, was bedeutet, dass wir Änderungen auch in ihren Deklarationen festschreiben müssen, ziehen wir es vor, die Einheit einfach in den Ordner zu verschieben.
quelle
Laut einem Beitrag auf Medium von Dirk Avery (und unterstützt durch meine persönliche Erfahrung) können Sie keine systemweite Installation von pytest verwenden, wenn Sie eine virtuelle Umgebung für Ihr Projekt verwenden. Sie müssen es in der virtuellen Umgebung installieren und diese Installation verwenden.
Insbesondere wenn Sie es an beiden Stellen installiert haben,
pytest
funktioniert das einfache Ausführen des Befehls nicht, da die Systeminstallation verwendet wird. Wie die anderen Antworten beschrieben haben, eine einfache Lösung laufenpython -m pytest
stattpytest
; Dies funktioniert, weil die Umgebungsversion von pytest verwendet wird. Alternativ können Sie auch die Systemversion von pytest deinstallieren. Nach der Reaktivierung der virtuellen Umgebung sollte derpytest
Befehl funktionieren.quelle
python -m pytest tests/
.Ich hatte das gleiche Problem, als ich dem Flask-Tutorial folgte, und fand die Antwort in den offiziellen Pytest- Dokumenten. Es ist eine kleine Abweichung von der Art und Weise, wie ich (und ich denke, viele andere) es gewohnt bin, Dinge zu tun.
Sie müssen eine
setup.py
Datei im Stammverzeichnis Ihres Projekts mit mindestens den folgenden zwei Zeilen erstellen :Dabei ist PACKAGENAME der Name Ihrer App. Dann müssen Sie es mit pip installieren:
Das
-e
Flag weist pip an, das Paket im bearbeitbaren oder "Entwicklungs" -Modus zu installieren. Wenn Siepytest
es das nächste Mal ausführen , sollte Ihre App im Standard enthalten seinPYTHONPATH
.quelle
Meine Lösung:
Erstellen Sie die
conftest.py
Datei in demtest
Verzeichnis, das Folgendes enthält:Dadurch wird der gewünschte Ordner zum Python-Pfad hinzugefügt, ohne dass jede Testdatei geändert , die env-Variable festgelegt oder absolute / relative Pfade verwendet werden müssen.
quelle