Bei der Verwendung von pytest kommt es häufig zu ImportError-Ausnahmen aufgrund von Pfadproblemen. Dies kann insbesondere bei unterschiedlichen Betriebssystemen und Projektstrukturen der Fall sein. Lassen Sie uns dieses Problem angehen und mögliche Lösungen erkunden.
Eine effektive Möglichkeit, Pfadprobleme zu beheben, ist die Verwendung einer conftest.py-Datei. Pytest sucht während der Testsammlung nach Conftest-Modulen, um benutzerdefinierte Hooks und Fixtures zu sammeln. Indem Sie eine leere conftest.py-Datei im Stammverzeichnis Ihres Projekts platzieren (wo Sie pytest ausführen), fügt pytest automatisch das übergeordnete Verzeichnis zu sys.path hinzu und macht Ihre Anwendungsmodule für den Import verfügbar.
Für eine Projektstruktur wie diese:
repo/ |--app.py |--settings.py |--models.py |--tests/ |--test_app.py
Fügen Sie einfach eine leere conftest.py-Datei zum Repo/ hinzu. Verzeichnis.
Für neuere Versionen von pytest (7 und höher) ist die Verwendung der Pythonpath-Einstellung eine bequemere Lösung. Dadurch können Sie sys.path direkt über die Pytest-Konfiguration ändern. Fügen Sie in Ihrer pyproject.toml- oder pytest.ini-Datei Folgendes hinzu:
[tool.pytest.ini_options] pythonpath = ["."]
Dies ist ein saubererer Ansatz, der keinen benutzerdefinierten Code oder eine Manipulation von sys.path erfordert.
Projektstruktur: Passen Sie die Platzierung der conftest.py-Datei oder die Pythonpath-Konfiguration basierend an auf Ihre Projektstruktur. Platzieren Sie beispielsweise in einem typischen src-basierten Layout conftest.py im src-Verzeichnis, nicht im Stammverzeichnis.
src-Layout: Seien Sie vorsichtig, wenn Sie src zu PYTHONPATH hinzufügen. Dies kann die Vorteile der Verwendung eines src-Layouts zunichte machen, da Sie am Ende den Repository-Code und nicht das installierte Paket testen.
Das obige ist der detaillierte Inhalt vonWie löse ich „ImportError: Kein Modul benannt…'-Probleme in Pytest aufgrund von Pfadproblemen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!