Projektstruktur in VS Code mit unittesting

Probleme bei der Installation?
Antworten
Benutzeravatar
panderl
User
Beiträge: 2
Registriert: Freitag 13. Juni 2025, 09:03

Hallo zusammen,

als Python-Neuling versuche ich mich gerade in die Projektorganisation (Ordnerstruktur, unittesting, etc...) einzuarbeiten. Als Programmierumgebung nutze ich VS Code auf einem Mac.
Bei dem Demo-Projekt solle ein Package entstehen. Dazu habe ich mit uv init demo-projekt erst mal einen Ordner aufgesetzt und darin folgende Ordner/Datei-Struktur angelegt:

Code: Alles auswählen

demo-projekt/
    demo-projekt/
        __init__.py
        mein_modul.py
    tests/
        __init__.py
        test_mein_modul.py
    main.py
    pyproject.toml
    ...
main.py, pyproject.toml und einige weitere Dateien u. Ordner wurden von uv automatisch angelegt, aber um die soll es nicht gehen...

Für das in VS Code integrierte Python Testing habe ich folgende Konfiguration durchgeführt:

Code: Alles auswählen

{
    "python.testing.unittestArgs": [
        "-v",
        "-s",
        "./tests",
        "-p",
        "test_*.py"
    ],
    "python.testing.pytestEnabled": false,
    "python.testing.unittestEnabled": true,
}
test_mein_modul.py sieht so aus:

Code: Alles auswählen

import unittest
from demo-projekt import mein_modul

...

# Damit die test_....py direkt als Skript gestartet werden kann:
if __name__ == "__main__":
    unittest.main()
Was geht:
  • In VS Code integrierte Tests

    Code: Alles auswählen

    Received test ids from temp file.
    test_funkt1 (test_mein_modul.TestMeinModul.test_funkt1) ... ok
    test_funkt2 (test_mein_modul.TestMeinModul.test_funkt2) ... ok
    test_non_value (test_mein_modul.TestMeinModul.test_non_value) ... ok
    
    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s
    
    OK
    Finished running tests!
  • python3 -m unittest tests/test_mein_modul.py

    Code: Alles auswählen

    ...
    ----------------------------------------------------------------------
    Ran 3 tests in 0.000s
    
    OK
Was NICHT geht:
  • python3 tests/test_mein_modul.py

    Code: Alles auswählen

    Traceback (most recent call last):
      File "/Users/panderl/develop/Python/demo-projekt/tests/test_mein_modul.py", line 3, in <module>
        from demo-projekt import mein_modul
    ModuleNotFoundError: No module named 'demo-projekt'
    
Kann mir jemand sagen, wie ich das hinkriege, dass auch das direkte ausführen des Test-Python Scripts funktioniert? Ich habe es mir angewöhnt, Python Scripts aus VS Code direkt mittels Short Cut zu starten und finde es etwas umständlich, über die VS Test Integration gehen zu müssen.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Randbemerkung: Schau Dir mal `pytest` an. `unittest` ist so Java-esque. Und nicht vergessen, dass es auch Doctests gibt, mit denen sich auch einiges erschlagen lässt was man dann nicht doppelt in den Unittests haben muss, wenn man Doctests mit den Unittests zusammen macht.

Ansonsten ``python3 -m tests.test_mein_modul``. Module in Packages sollte/darf man nicht direkt ausführen, weil es dann ein Durcheinander gibt was Importpfade angeht.

Edit: Oder eine ``tests/__main__.py`` anlegen und dann ``python3 -m tests`` um die auszuführen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
panderl
User
Beiträge: 2
Registriert: Freitag 13. Juni 2025, 09:03

Danke für Deine Anregungen. Da ich noch ganz neu in Python bin, will ich erst ausloten, was mit unittest geht und was nicht. Erst dann weiß ich ja zu schätzen, was pytest und Co. besser machen :)

Ich habe zwischenzeitlich auch ChatGPT befragt.
Der hat zwar mal wieder im Brustton der Überzeugung ein Lösung präsentiert, die nicht funktioniert hatte. Aber zumindest hat er mich damit in die richtige Richtung gelenkt, und so bin ich für mich auf folgende Lösung gekommen:

VS Code hatte ja bereits .vscode/settings.json angelegt. Darin habe ich manuell noch den PYTHONPATH für das integrierte Terminal gesetzt:

Code: Alles auswählen


    "python.testing.unittestArgs": [
        "-v",
        "-s",
        "./tests",
        "-p",
        "test_*.py"
    ],
    "python.testing.pytestEnabled": false,
    "python.testing.unittestEnabled": true,

    // Manuelle Ergänzung
    "terminal.integrated.env.osx": {
        "PYTHONPATH": "${workspaceFolder}",
    },
}
nezzcarth
User
Beiträge: 1749
Registriert: Samstag 16. April 2011, 12:47

panderl hat geschrieben: Samstag 14. Juni 2025, 13:14 Danke für Deine Anregungen. Da ich noch ganz neu in Python bin, will ich erst ausloten, was mit unittest geht und was nicht. Erst dann weiß ich ja zu schätzen, was pytest und Co. besser machen :)
Das kann ich vom Ansatz her prinzipiell nachvollziehen. Allerdings ist es so, dass für einige der "included batteries" in der Standardbibliothek in der Praxis so gut wie immer externe Bibliotheken verwendet werden. Und dazu gehört nach meiner Einschätzung nach auch das unittest Modul. Mal abgesehen davon, dass du mit 'uv' ja auch schon nicht das Standardwerkzeug, sondern das "hippe Mode-Tool-of-the-Week" benutzt :). 'pytest' macht als Kommandozeilentool gute (m.M.n. bessere) automatische Test-Discovery – einschließlich Tests, die 'unittest' verwenden.
Antworten