From decd2a00025a64e818b1a2514e517e3f7ebf17e0 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 23 Sep 2026 09:33:26 +0200 Subject: [PATCH] =?UTF-8?q?Test-Audit=20sn=5Fbasis=20fortgesetzt:=20messag?= =?UTF-8?q?e=5Fwrapper.py=20fachlich=20gepr=C3=BCft=20(#76)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 5 Testfälle fachlich geprüft und markiert: test_message_wrapper.py komplett (inkl. 1 neuer Test für die Meldungsstufen von info/warning/error/success). Nebenbefund: die Namens-Heuristik des Testkatalogs führte warning als referenziert, weil es in test_pruefmanager/test_dockmanager nur per @patch ersetzt wird (bekannte, in testkatalog.py dokumentierte Grenze). Testkatalog neu erzeugt. Co-Authored-By: Claude Opus 5.5 --- docs/status/testpruefungen.json | 20 +++++++++++++++++++ docs/tests/testkatalog.html | 24 ++++++++++++---------- docs/tests/testkatalog.md | 35 +++++++++++++++------------------ 3 files changed, 50 insertions(+), 29 deletions(-) diff --git a/docs/status/testpruefungen.json b/docs/status/testpruefungen.json index 2efc950..ed69170 100644 --- a/docs/status/testpruefungen.json +++ b/docs/status/testpruefungen.json @@ -611,6 +611,26 @@ "datum": "2026-09-23", "hash": "83fd0b51b9df" }, + "sn_basis.tests.test_message_wrapper.GetMessageBarTests.test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck": { + "datum": "2026-09-23", + "hash": "dc6c3cdbfae1" + }, + "sn_basis.tests.test_message_wrapper.GetMessageBarTests.test_liefert_objekt_mit_pushmessage_methode": { + "datum": "2026-09-23", + "hash": "e9d99a0b1f02" + }, + "sn_basis.tests.test_message_wrapper.MeldungsstufenTests.test_info_warning_error_success_setzen_die_passende_meldungsstufe": { + "datum": "2026-09-23", + "hash": "04f2f5ea94e9" + }, + "sn_basis.tests.test_message_wrapper.PushMessageTests.test_fehler_in_der_message_bar_wird_abgefangen": { + "datum": "2026-09-23", + "hash": "a8fdcf8ba3b8" + }, + "sn_basis.tests.test_message_wrapper.PushMessageTests.test_liefert_dict_mit_titel_text_level_und_dauer": { + "datum": "2026-09-23", + "hash": "525b2fdab218" + }, "sn_basis.tests.test_pruefmanager.TestPruefmanager.test_datei_existiert_append": { "datum": "2026-09-17", "hash": "25e169c45423" diff --git a/docs/tests/testkatalog.html b/docs/tests/testkatalog.html index 17ac009..717936a 100644 --- a/docs/tests/testkatalog.html +++ b/docs/tests/testkatalog.html @@ -123,10 +123,10 @@

Prüfstand

Testkatalog der sn_*-Plugins — was die Suite heute prüft, auf einen Blick.
-
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
Prüf-Audit: docs/status/testpruefungen.json (SHA-256 86bcb6ced85a)
+
Quelle: docs/tests/testkatalog.md
Baseline: docs/status/testbaseline.json (SHA-256 aeabc946a7f3)
Prüf-Audit: docs/status/testpruefungen.json (SHA-256 4ed158c391ca)
-
596Testfälle
-
553grün
+
597Testfälle
+
554grün
35rot (Baseline)
76%mit Docstring
@@ -135,12 +135,12 @@
35%ohne Testbezug
Verteilung je Paket
-
sn_basis32 Dateien · 344 Testfälle
+
sn_basis32 Dateien · 345 Testfälle
sn_verfahrensgebiet12 Dateien · 208 Testfälle
sn_plan415 Dateien · 44 Testfälle
@@ -159,11 +159,11 @@

sn_basis

Plattform-Plugin · Ordner Plugin_SN_Basis

- -
32Testdateien
344Testfälle
344grün
0rot (Baseline)
100%mit Docstring
51%geprüft
72ohne Testbezug
+
32Testdateien
345Testfälle
345grün
0rot (Baseline)
100%mit Docstring
52%geprüft
70ohne Testbezug

Tests für sn_basis/ui/base_dockwidget.py::closeEvent (Issue #65).

CloseEventTests 5
flowchart TD
   root(["test_base_dockwidget.py"])
   class root rootnode
@@ -646,7 +646,7 @@
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
ApplyStyleFromPathTests
test_fehlender_layer_liefert_false
Prüft, dass ein fehlender Layer (None) False liefert.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_erfolgreiches_laden_liefert_true_und_triggert_repaint
Prüft, dass ein erfolgreich geladener Stil True liefert und den Layer neu zeichnet.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_pfad_wird_als_text_an_loadnamedstyle_uebergeben
Prüft, dass ein als Path übergebener Stilpfad unverändert als Text an loadNamedStyle weitergereicht wird.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_fehlgeschlagenes_laden_liefert_false_ohne_repaint
Prüft, dass ein fehlgeschlagenes Laden False liefert, ohne den Layer neu zu zeichnen.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_ausnahme_beim_laden_wird_abgefangen
Prüft, dass eine Ausnahme beim Laden des Stils abgefangen wird und False liefert.grüngeprüft am 2026-09-23

Tests für sn_basis/functions/message_wrapper.py (Issue #65).

GetMessageBarTests 2PushMessageTests 2
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
ApplyStyleFromPathTests
test_fehlender_layer_liefert_false
Prüft, dass ein fehlender Layer (None) False liefert.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_erfolgreiches_laden_liefert_true_und_triggert_repaint
Prüft, dass ein erfolgreich geladener Stil True liefert und den Layer neu zeichnet.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_pfad_wird_als_text_an_loadnamedstyle_uebergeben
Prüft, dass ein als Path übergebener Stilpfad unverändert als Text an loadNamedStyle weitergereicht wird.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_fehlgeschlagenes_laden_liefert_false_ohne_repaint
Prüft, dass ein fehlgeschlagenes Laden False liefert, ohne den Layer neu zu zeichnen.grüngeprüft am 2026-09-23
ApplyStyleFromPathTests
test_ausnahme_beim_laden_wird_abgefangen
Prüft, dass eine Ausnahme beim Laden des Stils abgefangen wird und False liefert.grüngeprüft am 2026-09-23

Tests für sn_basis/functions/message_wrapper.py (Issue #65).

GetMessageBarTests 2PushMessageTests 2MeldungsstufenTests 1
flowchart TD
   root(["test_message_wrapper.py"])
   class root rootnode
   root --> g1["GetMessageBarTests (2)"]
@@ -657,15 +657,19 @@
   class g2 groupnode
   g2 --> t3("liefert_dict_mit_titel_text_level_und_dauer")
   g2 --> t4("fehler_in_der_message_bar_wird_abgefangen")
+  root --> g3["MeldungsstufenTests (1)"]
+  class g3 groupnode
+  g3 --> t5("info_warning_error_success_setzen_die_passende_meldungsstufe")
   class t1 ok
   class t2 ok
   class t3 ok
   class t4 ok
+  class t5 ok
   classDef rootnode fill:#1f4038,stroke:#16302a,stroke-width:1px,color:#f4f1e8,font-weight:600;
   classDef groupnode fill:#cfe0da,stroke:#5c8a7d,stroke-width:1px,color:#152420;
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
-  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
GetMessageBarTests
test_liefert_objekt_mit_pushmessage_methode
Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert.grünnie geprüft
GetMessageBarTests
test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck
Prüft, dass ein Fehler beim Zugriff auf iface.messageBar() auf eine funktionierende Mock-MessageBar zurückfällt.grünnie geprüft
PushMessageTests
test_liefert_dict_mit_titel_text_level_und_dauer
Prüft, dass push_message im Mock-Modus ein Dict mit den übergebenen Werten liefert.grünnie geprüft
PushMessageTests
test_fehler_in_der_message_bar_wird_abgefangen
Prüft, dass eine fehlschlagende MessageBar push_message nicht zum Absturz bringt, sondern None liefert.grünnie geprüft

Tests für sn_basis/ui/navigation.py::Navigation (Issue #67, ohne init_ui – s. Docstring dort).

AddActionTests 2FinalizeMenuAndToolbarTests 2SetActivePluginTests 2RemoveActionTests 3RemoveAllTests 3
flowchart TD
+  classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
GetMessageBarTests
test_liefert_objekt_mit_pushmessage_methode
Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert.grüngeprüft am 2026-09-23
GetMessageBarTests
test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck
Prüft, dass ein Fehler beim Zugriff auf iface.messageBar() auf eine funktionierende Mock-MessageBar zurückfällt.grüngeprüft am 2026-09-23
PushMessageTests
test_liefert_dict_mit_titel_text_level_und_dauer
Prüft, dass push_message im Mock-Modus ein Dict mit den übergebenen Werten liefert.grüngeprüft am 2026-09-23
PushMessageTests
test_fehler_in_der_message_bar_wird_abgefangen
Prüft, dass eine fehlschlagende MessageBar push_message nicht zum Absturz bringt, sondern None liefert.grüngeprüft am 2026-09-23
MeldungsstufenTests
test_info_warning_error_success_setzen_die_passende_meldungsstufe
Prüft, dass info, warning, error und success jeweils ihre eigene Qgis.MessageLevel-Stufe setzen und Titel, Text und Dauer weiterreichen.grüngeprüft am 2026-09-23

Tests für sn_basis/ui/navigation.py::Navigation (Issue #67, ohne init_ui – s. Docstring dort).

AddActionTests 2FinalizeMenuAndToolbarTests 2SetActivePluginTests 2RemoveActionTests 3RemoveAllTests 3
flowchart TD
   root(["test_navigation.py"])
   class root rootnode
   root --> g1["AddActionTests (2)"]
@@ -1234,7 +1238,7 @@
   classDef ok fill:#dcefdc,stroke:#3f7d4a,stroke-width:1px,color:#1c3a20;
   classDef warn fill:#f6ead9,stroke:#b5722a,stroke-width:1px,color:#4a2c08;
   classDef skip fill:#e6e6ee,stroke:#6f7285,stroke-width:1px,color:#2b2d38;
TestfallprüftStatusgeprüft
TestVerfahrensgebietManager
test_get_verfahrensgebiet_layer_id_returns_value
Prüft, dass get_verfahrensgebiet_layer_id() die in der Projektvariable gespeicherte Layer-ID liefert.grünnie geprüft
TestVerfahrensgebietManager
test_get_verfahrensgebiet_layer_id_returns_none_for_empty_value
Prüft, dass get_verfahrensgebiet_layer_id() bei leerer Projektvariable None statt eines leeren Strings liefert.grünnie geprüft
TestVerfahrensgebietManager
test_set_verfahrensgebiet_layer_id_writes_project_variable
Prüft, dass set_verfahrensgebiet_layer_id() die Layer-ID als Projektvariable 'verfahrensgebiet_layer' speichert.grünnie geprüft
TestVerfahrensgebietManager
test_update_without_layer_does_not_write_when_already_empty
Prüft, dass ohne gefundenen Verfahrensgebiet-Layer keine Schreibaktion erfolgt, wenn die Variable bereits leer ist.grünnie geprüft
TestVerfahrensgebietManager
test_update_with_layer_writes_variable
Prüft, dass ein gefundener Verfahrensgebiet-Layer seine ID als Projektvariable speichert.grünnie geprüft
OnHandlerTests
test_on_project_changed_ohne_layer_setzt_variable_leer
Prüft, dass _on_project_changed die Variable leert, wenn kein Verfahrensgebiet-Layer existiert.grünnie geprüft
OnHandlerTests
test_on_project_changed_mit_layer_setzt_variable
Prüft, dass _on_project_changed die Layer-ID eines gefundenen Verfahrensgebiet-Layers übernimmt.grünnie geprüft
OnHandlerTests
test_on_layers_added_findet_neuen_layer
Prüft, dass _on_layers_added nach neu hinzugefügten Layern sucht und die Variable aktualisiert.grünnie geprüft
OnHandlerTests
test_on_layer_removed_bei_aktuellem_layer_sucht_neu
Prüft, dass das Entfernen des aktuell aktiven Verfahrensgebiet-Layers eine Neusuche auslöst.grünnie geprüft
OnHandlerTests
test_on_layer_removed_bei_anderem_layer_aendert_nichts
Prüft, dass das Entfernen eines anderen Layers keine Neusuche auslöst.grünnie geprüft
ListenerSetupTests
test_setup_ohne_qgis_tut_nichts
Prüft, dass setup_verfahrensgebiet_listener ohne QGIS keine Signale registriert.grünnie geprüft
ListenerSetupTests
test_setup_verbindet_signale_und_ist_idempotent
Prüft, dass setup_verfahrensgebiet_listener die Projektsignale verbindet und ein zweiter Aufruf nichts doppelt registriert.grünnie geprüft
ListenerSetupTests
test_teardown_trennt_alle_signale_und_ist_idempotent
Prüft, dass teardown_verfahrensgebiet_listener alle Signale trennt und mehrfacher Aufruf nicht fehlschlägt.grünnie geprüft
-

Heuristik: Name kommt in keiner Testdatei des Pakets vor (Details siehe docs/tests/testkatalog.md). beabsichtigt liest den Docstring der Funktion – ein Vermerk wie „von Test abgesehen, weil …“ oder „Test ausgesetzt, zunächst Refactor“ gilt als bewusste Entscheidung. ungeklärt hat weder Test noch Vermerk.

DateiFunktion/MethodeZeileStatus
functions/dialog_wrapper.pyshow_info_dialog42beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_vg_laden192beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_abbrechen244beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_total339beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_value348beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_label361beabsichtigt
functions/dialog_wrapper.pyProgressDialog.is_canceled371beabsichtigt
functions/dialog_wrapper.pyProgressDialog.raise_to_front389beabsichtigt
functions/dialog_wrapper.pycreate_progress_dialog408beabsichtigt
functions/message_wrapper.pyinfo67beabsichtigt
functions/message_wrapper.pysuccess84beabsichtigt
functions/os_wrapper.pynormalize_path43beabsichtigt
functions/os_wrapper.pyget_home_dir55beabsichtigt
functions/os_wrapper.pyis_absolute_path64beabsichtigt
functions/os_wrapper.pybasename75beabsichtigt
functions/os_wrapper.pypath_suffix106beabsichtigt
functions/qgisui_wrapper.pyadd_toolbar204beabsichtigt
functions/qt_wrapper.pyexec_dialog60beabsichtigt
functions/qt_wrapper.pydebug_qt_status67beabsichtigt
modules/DataGrabber.pyDataGrabber.set_source68beabsichtigt
modules/DataGrabber.pyDataGrabber._process_database_source312beabsichtigt
modules/DataGrabber.pyDataGrabber._process_service_source324beabsichtigt
modules/LayerLoader.pyLayerLoader._was_canceled42beabsichtigt
modules/LayerLoader.pyLayerLoader._process_events51beabsichtigt
modules/Pruefmanager.pyPruefmanager.report_summary45beabsichtigt
modules/Pruefmanager.pyPruefmanager.zeige_hinweis63beabsichtigt
modules/Pruefmanager.pyPruefmanager._handle_datei_existiert87beabsichtigt
modules/Pruefmanager.pyPruefmanager._ask_use_or_replace_pufferlayer280beabsichtigt
modules/linkpruefer.pyLinkpruefer._ist_url41beabsichtigt
modules/linkpruefer.pyLinkpruefer._pruefe_url84beabsichtigt
modules/linkpruefer.pyLinkpruefer._pruefe_dateipfad121beabsichtigt
modules/print_layout.pyPrintLayout._create_map_item98beabsichtigt
modules/print_layout.pyPrintLayout._set_item_frame_stroke_width120beabsichtigt
modules/print_layout.pyPrintLayout._fit_extent_to_map_item156beabsichtigt
modules/print_layout.pyPrintLayout.add_text_label214beabsichtigt
modules/print_layout.pyPrintLayout._setup_layout_objects246beabsichtigt
modules/print_layout.pyPrintLayout._create_label_item378beabsichtigt
modules/print_layout.pyPrintLayout._resolve_visible_map_layers476beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_common_settings798beabsichtigt
modules/print_layout.pyPrintLayout._safe_grid_call805beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_annotation_text_style817beabsichtigt
modules/print_layout.pyPrintLayout._create_rectangle_box_item918beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe.create_baufreigabe_layout90beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._setup_layout_objects_baufreigabe264beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._calc_atlas_margin_percent398beabsichtigt
modules/print_logic.pyPrintLogic._failed_result123beabsichtigt
modules/print_logic.pyPrintLogic._show_target_size_too_small127beabsichtigt
modules/print_logic.pyPrintLogic._is_enabled_flag135beabsichtigt
modules/print_logic.pyPrintLogic._resolve_layer_from_project141beabsichtigt
modules/print_logic.pyPrintLogic._resolve_active_layer162beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_cm172beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_m181beabsichtigt
modules/print_logic.pyPrintLogic._import_qgis_symbol185beabsichtigt
modules/print_logic.pyPrintLogic._build_rectangle193beabsichtigt
modules/print_logic.pyPrintLogic._clone_extent203beabsichtigt
modules/print_logic.pyPrintLogic._get_existing_layer_by_name270beabsichtigt
modules/print_logic.pyPrintLogic._create_druckrechteck_layer284beabsichtigt
modules/print_logic.pyPrintLogic._clear_layer_features313beabsichtigt
modules/print_logic.pyPrintLogic.configure_atlas_for_baufreigabe_layout483beabsichtigt
modules/print_logic.pyPrintLogic._store_druckrechteck631beabsichtigt
modules/print_logic.pyPrintLogic.activate_druckrechteck_capture680beabsichtigt
modules/print_logic.pyPrintLogic._resolve_selection_layer811beabsichtigt
modules/print_logic.pyPrintLogic._get_selected_extent825beabsichtigt
modules/print_logic.pyPrintLogic._get_plot_dimensions_mm1078beabsichtigt
modules/print_logic.pyPrintLogic._get_required_map_dimensions_mm1088beabsichtigt
ui/tabs/print_tab.pyPrintTab._build_ui115beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_kartenname_changed335beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_massstab_changed349beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_zielgroesse_changed361beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_formfaktor_changed367beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_druckbereich_changed374beabsichtigt
ui/tabs/print_tab.pyPrintTab._format_druckpuffer_label432beabsichtigt
+

Heuristik: Name kommt in keiner Testdatei des Pakets vor (Details siehe docs/tests/testkatalog.md). beabsichtigt liest den Docstring der Funktion – ein Vermerk wie „von Test abgesehen, weil …“ oder „Test ausgesetzt, zunächst Refactor“ gilt als bewusste Entscheidung. ungeklärt hat weder Test noch Vermerk.

DateiFunktion/MethodeZeileStatus
functions/dialog_wrapper.pyshow_info_dialog42beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_vg_laden192beabsichtigt
functions/dialog_wrapper.pyask_detailpruefung_oder_abbrechen244beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_total339beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_value348beabsichtigt
functions/dialog_wrapper.pyProgressDialog.set_label361beabsichtigt
functions/dialog_wrapper.pyProgressDialog.is_canceled371beabsichtigt
functions/dialog_wrapper.pyProgressDialog.raise_to_front389beabsichtigt
functions/dialog_wrapper.pycreate_progress_dialog408beabsichtigt
functions/os_wrapper.pynormalize_path43beabsichtigt
functions/os_wrapper.pyget_home_dir55beabsichtigt
functions/os_wrapper.pyis_absolute_path64beabsichtigt
functions/os_wrapper.pybasename75beabsichtigt
functions/os_wrapper.pypath_suffix106beabsichtigt
functions/qgisui_wrapper.pyadd_toolbar204beabsichtigt
functions/qt_wrapper.pyexec_dialog60beabsichtigt
functions/qt_wrapper.pydebug_qt_status67beabsichtigt
modules/DataGrabber.pyDataGrabber.set_source68beabsichtigt
modules/DataGrabber.pyDataGrabber._process_database_source312beabsichtigt
modules/DataGrabber.pyDataGrabber._process_service_source324beabsichtigt
modules/LayerLoader.pyLayerLoader._was_canceled42beabsichtigt
modules/LayerLoader.pyLayerLoader._process_events51beabsichtigt
modules/Pruefmanager.pyPruefmanager.report_summary45beabsichtigt
modules/Pruefmanager.pyPruefmanager.zeige_hinweis63beabsichtigt
modules/Pruefmanager.pyPruefmanager._handle_datei_existiert87beabsichtigt
modules/Pruefmanager.pyPruefmanager._ask_use_or_replace_pufferlayer280beabsichtigt
modules/linkpruefer.pyLinkpruefer._ist_url41beabsichtigt
modules/linkpruefer.pyLinkpruefer._pruefe_url84beabsichtigt
modules/linkpruefer.pyLinkpruefer._pruefe_dateipfad121beabsichtigt
modules/print_layout.pyPrintLayout._create_map_item98beabsichtigt
modules/print_layout.pyPrintLayout._set_item_frame_stroke_width120beabsichtigt
modules/print_layout.pyPrintLayout._fit_extent_to_map_item156beabsichtigt
modules/print_layout.pyPrintLayout.add_text_label214beabsichtigt
modules/print_layout.pyPrintLayout._setup_layout_objects246beabsichtigt
modules/print_layout.pyPrintLayout._create_label_item378beabsichtigt
modules/print_layout.pyPrintLayout._resolve_visible_map_layers476beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_common_settings798beabsichtigt
modules/print_layout.pyPrintLayout._safe_grid_call805beabsichtigt
modules/print_layout.pyPrintLayout._apply_grid_annotation_text_style817beabsichtigt
modules/print_layout.pyPrintLayout._create_rectangle_box_item918beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe.create_baufreigabe_layout90beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._setup_layout_objects_baufreigabe264beabsichtigt
modules/print_layout_baufreigabe.pyPrintLayoutBaufreigabe._calc_atlas_margin_percent398beabsichtigt
modules/print_logic.pyPrintLogic._failed_result123beabsichtigt
modules/print_logic.pyPrintLogic._show_target_size_too_small127beabsichtigt
modules/print_logic.pyPrintLogic._is_enabled_flag135beabsichtigt
modules/print_logic.pyPrintLogic._resolve_layer_from_project141beabsichtigt
modules/print_logic.pyPrintLogic._resolve_active_layer162beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_cm172beabsichtigt
modules/print_logic.pyPrintLogic._get_druckpuffer_m181beabsichtigt
modules/print_logic.pyPrintLogic._import_qgis_symbol185beabsichtigt
modules/print_logic.pyPrintLogic._build_rectangle193beabsichtigt
modules/print_logic.pyPrintLogic._clone_extent203beabsichtigt
modules/print_logic.pyPrintLogic._get_existing_layer_by_name270beabsichtigt
modules/print_logic.pyPrintLogic._create_druckrechteck_layer284beabsichtigt
modules/print_logic.pyPrintLogic._clear_layer_features313beabsichtigt
modules/print_logic.pyPrintLogic.configure_atlas_for_baufreigabe_layout483beabsichtigt
modules/print_logic.pyPrintLogic._store_druckrechteck631beabsichtigt
modules/print_logic.pyPrintLogic.activate_druckrechteck_capture680beabsichtigt
modules/print_logic.pyPrintLogic._resolve_selection_layer811beabsichtigt
modules/print_logic.pyPrintLogic._get_selected_extent825beabsichtigt
modules/print_logic.pyPrintLogic._get_plot_dimensions_mm1078beabsichtigt
modules/print_logic.pyPrintLogic._get_required_map_dimensions_mm1088beabsichtigt
ui/tabs/print_tab.pyPrintTab._build_ui115beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_kartenname_changed335beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_massstab_changed349beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_zielgroesse_changed361beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_formfaktor_changed367beabsichtigt
ui/tabs/print_tab.pyPrintTab._on_druckbereich_changed374beabsichtigt
ui/tabs/print_tab.pyPrintTab._format_druckpuffer_label432beabsichtigt
diff --git a/docs/tests/testkatalog.md b/docs/tests/testkatalog.md index 803d427..46fcb32 100644 --- a/docs/tests/testkatalog.md +++ b/docs/tests/testkatalog.md @@ -8,21 +8,21 @@ für die fachliche Frage, ob die Abdeckung sinnvoll ist. Die Angaben stammen aus selbst (Docstrings) und aus der Testbaseline. Stand der Baseline: `docs/status/testbaseline.json` (SHA-256 `aeabc946a7f3`) -Stand des Prüf-Audits: `docs/status/testpruefungen.json` (SHA-256 `86bcb6ced85a`) +Stand des Prüf-Audits: `docs/status/testpruefungen.json` (SHA-256 `4ed158c391ca`) -Gesamt: 3 Pakete, 49 Testdateien, 596 Testfälle – 553 grün, 35 rot (Baseline), 8 übersprungen. -Mit Beschreibung (Docstring): 451 von 596 (76 %). -Fachlich geprüft: 176 von 596 (30 %) aktuell, 0 veraltet seit Codeänderung, 420 nie geprüft. -Strukturelle Lücken (heuristisch, Namensabgleich): 145 von 413 (35 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“. +Gesamt: 3 Pakete, 49 Testdateien, 597 Testfälle – 554 grün, 35 rot (Baseline), 8 übersprungen. +Mit Beschreibung (Docstring): 452 von 597 (76 %). +Fachlich geprüft: 181 von 597 (30 %) aktuell, 0 veraltet seit Codeänderung, 416 nie geprüft. +Strukturelle Lücken (heuristisch, Namensabgleich): 143 von 413 (35 %) Funktionen/Methoden ohne erkennbaren Testbezug – Abschnitt „Ungetestete Funktionen“. ## Zusammenfassung | Paket | Testdateien | Testfälle | grün | rot (Baseline) | übersprungen | mit Beschreibung | fachlich geprüft | ohne Testbezug | | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | -| `sn_basis` | 32 | 344 | 344 | 0 | 0 | 344 von 344 (100 %) | 176 von 344 (51 %) | 72 von 229 (31 %) | +| `sn_basis` | 32 | 345 | 345 | 0 | 0 | 345 von 345 (100 %) | 181 von 345 (52 %) | 70 von 229 (31 %) | | `sn_verfahrensgebiet` | 12 | 208 | 166 | 34 | 8 | 106 von 208 (51 %) | 0 von 208 (0 %) | 34 von 104 (33 %) | | `sn_plan41` | 5 | 44 | 43 | 1 | 0 | 1 von 44 (2 %) | 0 von 44 (0 %) | 39 von 80 (49 %) | -| **Summe** | **49** | **596** | **553** | **35** | **8** | **451 von 596 (76 %)** | **176 von 596 (30 %)** | **145 von 413 (35 %)** | +| **Summe** | **49** | **597** | **554** | **35** | **8** | **452 von 597 (76 %)** | **181 von 597 (30 %)** | **143 von 413 (35 %)** | ### Legende @@ -36,7 +36,7 @@ Strukturelle Lücken (heuristisch, Namensabgleich): 145 von 413 (35 %) Funktione ## Paket `sn_basis` -Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 344 Testfällen (344 grün, 0 rot, 0 übersprungen). +Plattform-Plugin, Ordner `Plugin_SN_Basis` – 32 Testdateien mit 345 Testfällen (345 grün, 0 rot, 0 übersprungen). ### `Plugin_SN_Basis/tests/test_base_dockwidget.py` @@ -384,13 +384,15 @@ Testgruppen: - `GetMessageBarTests` (2 Testfälle): — (Docstring fehlt) - `PushMessageTests` (2 Testfälle): — (Docstring fehlt) +- `MeldungsstufenTests` (1 Testfälle): — (Docstring fehlt) | Testfall | prüft | Status | geprüft | | --- | --- | --- | --- | -| `GetMessageBarTests.test_liefert_objekt_mit_pushmessage_methode` | Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert. | grün | nie geprüft | -| `GetMessageBarTests.test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck` | Prüft, dass ein Fehler beim Zugriff auf iface.messageBar() auf eine funktionierende Mock-MessageBar zurückfällt. | grün | nie geprüft | -| `PushMessageTests.test_liefert_dict_mit_titel_text_level_und_dauer` | Prüft, dass push_message im Mock-Modus ein Dict mit den übergebenen Werten liefert. | grün | nie geprüft | -| `PushMessageTests.test_fehler_in_der_message_bar_wird_abgefangen` | Prüft, dass eine fehlschlagende MessageBar push_message nicht zum Absturz bringt, sondern None liefert. | grün | nie geprüft | +| `GetMessageBarTests.test_liefert_objekt_mit_pushmessage_methode` | Prüft, dass _get_message_bar ein Objekt mit aufrufbarer pushMessage()-Methode liefert. | grün | geprüft am 2026-09-23 | +| `GetMessageBarTests.test_faellt_bei_fehlerhaftem_iface_auf_mock_bar_zurueck` | Prüft, dass ein Fehler beim Zugriff auf iface.messageBar() auf eine funktionierende Mock-MessageBar zurückfällt. | grün | geprüft am 2026-09-23 | +| `PushMessageTests.test_liefert_dict_mit_titel_text_level_und_dauer` | Prüft, dass push_message im Mock-Modus ein Dict mit den übergebenen Werten liefert. | grün | geprüft am 2026-09-23 | +| `PushMessageTests.test_fehler_in_der_message_bar_wird_abgefangen` | Prüft, dass eine fehlschlagende MessageBar push_message nicht zum Absturz bringt, sondern None liefert. | grün | geprüft am 2026-09-23 | +| `MeldungsstufenTests.test_info_warning_error_success_setzen_die_passende_meldungsstufe` | Prüft, dass info, warning, error und success jeweils ihre eigene Qgis.MessageLevel-Stufe setzen und Titel, Text und Dauer weiterreichen. | grün | geprüft am 2026-09-23 | ### `Plugin_SN_Basis/tests/test_navigation.py` @@ -1267,7 +1269,7 @@ Arbeitsliste: Diese Testfälle haben keinen Docstring; was sie fachlich prüfen, aus dem Quelltext erschließen. Jeder Eintrag braucht eine einzeilige Beschreibung im Testfall, dann verschwindet er hier von selbst. -### `sn_basis` – 0 von 344 Testfällen ohne Beschreibung +### `sn_basis` – 0 von 345 Testfällen ohne Beschreibung Keine Lücken. @@ -1473,7 +1475,7 @@ Keine Lücken. Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen in keiner Testdatei des Pakets vor. Das schließt nicht aus, dass sie indirekt über eine andere, getestete Funktion mitlaufen – umgekehrt gilt: Taucht der Name irgendwo in einer Testdatei auf, gilt die Funktion schon als referenziert, auch bei zufälliger Namensgleichheit mit etwas anderem. `main.py`/`__init__.py` (QGIS-Einstiegspunkte wie `classFactory`, `initGui`, `unload`) und Dunder-Methoden sind ausgenommen. Diese Liste ersetzt keine fachliche Prüfung, ob ein Test sinnvoll wäre – dafür braucht es einen Menschen, der die Funktion kennt. „beabsichtigt“ liest den Docstring der Funktion: Enthält er einen Vermerk wie „von Test abgesehen, weil …“ oder „Test ausgesetzt, zunächst Refactor“, gilt der fehlende Test als bewusste Entscheidung. Alles andere ist „ungeklärt“ – die eigentliche Arbeitsliste. -### `sn_basis` – 72 von 229 (31 %) ohne Testbezug (0 ungeklärt, 72 beabsichtigt) +### `sn_basis` – 70 von 229 (31 %) ohne Testbezug (0 ungeklärt, 70 beabsichtigt) #### `functions/dialog_wrapper.py` (9) @@ -1487,11 +1489,6 @@ Heuristik, kein Beweis: Diese Funktionen und Methoden kommen unter ihrem Namen i - `ProgressDialog.raise_to_front` (Zeile 389) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 - `create_progress_dialog` (Zeile 408) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 -#### `functions/message_wrapper.py` (2) - -- `info` (Zeile 67) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 -- `success` (Zeile 84) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026 - #### `functions/os_wrapper.py` (5) - `normalize_path` (Zeile 43) — **beabsichtigt:** von Test abgesehen, weil vernachlässigbar; HD 18.09.2026