Files
Projektwissen/docs/tests/verfahrensgebiet-shape-import.md
T
AndreasTharangandClaude Sonnet 5 ab416fb34c Projektwissen: Git-Vorgaben, Ticketzugriff, Tests und Einstieg
Erster Stand des Repositories AG_QGIS/Projektwissen (bisher Arbeitstitel
"Workspace", ADR 0006). Der lokale Ordner heisst weiter AG_QGIS, weil darin
auch die Plugin-Klone liegen.

Git verbindlich (ADR 0007), aus dem bisherigen Wiki-Konzept entwickelt:
- docs/leitfaden/05_git_arbeitsweise.md mit Kanal-Kette, Branch-Namen und
  Gitea-Branch-Schutz.
- Der Einstiegspunkt eines Fixes richtet sich nach dem Kanal, in dem der
  Fehler sitzt; ein Fix an testing oder stable ist erst mit der
  Rueckfuehrung nach unten abgeschlossen. Das fehlte bisher.
- Der stabile Kanal heisst stable, nicht main: der Release-Workflow in
  Repository:hidden/workflows fuehrt git checkout "$CHANNEL" aus, der
  Branchname muss also dem Kanalnamen entsprechen. Er existiert in keinem
  Plugin-Repo und ist vom Maintainer anzulegen.
- Der Mensch drueckt ab: .claude/settings.json sperrt push, merge, tag.
- scripts/hallo.py und /hallo holen den Stand aller Klone, per
  Fast-Forward wo gefahrlos; nie mergen, stashen oder verwerfen.

Ticketzugriff:
- scripts/gitea.py liest Issues, Kommentare und PRs ueber die oeffentliche
  API, ohne Token, nur GET. Schreibendes nur als Entwurf in entwuerfe/.
- Skill sn-ticket.

Tests (ADR 0009):
- docs/leitfaden/06_tests.md: Testebenen, Testpflicht, und wie eine
  Fachperson beurteilt, ob Tests fachlich sinnvoll sind.
- scripts/testkatalog.py erzeugt docs/tests/testkatalog.md per ast-Parsing,
  ohne Import und ohne QGIS. Befund: nur 100 von 332 Tests haben einen
  Docstring, sn_basis keinen einzigen von 87.
- Vorlage und erste Testkonzept-Seite mit Mermaid. Dabei gefunden und gegen
  origin geprueft: _ermittle_gebietstyp_aus_fbschl hat keinen Test, obwohl
  PR #44/#45 genau diese Funktion tolerant gemacht hat.
- docs/konzept/07_qgis_tests_plan.md: Stufenplan fuer Tests gegen echtes
  QGIS. Dabei aufgefallen: QGIS 3.40 ist seit Januar 2026 End of Life,
  qgis_min steht aber noch darauf.

Werkzeuge (ADR 0008):
- 04_werkzeuge_einrichten.md nur noch Claude Code als CLI und in VS Code.
- .vscode/ entfernt, brauchbare Einstellungen als persoenliche Vorlage.

Ausserdem: README als Einstieg neu aufgebaut, Mermaid-Diagramm in
schnittstellen.md repariert (unmaskierte Klammern, rendert seither nicht).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-04 11:57:26 +02:00

106 lines
6.8 KiB
Markdown

# Testkonzept: Verfahrensgebiet aus Shape laden
Plugin: `sn_verfahrensgebiet` · Stand: 04.09.2026 · Pflege: bei jeder Änderung an diesem Ablauf
Beispielseite nach [`../vorlagen/testkonzept.md`](../vorlagen/testkonzept.md). Sie zeigt, wie eine Fachperson
ohne Blick in den Quelltext beurteilen kann, ob die Tests das Richtige prüfen —
siehe [`../leitfaden/06_tests.md`](../leitfaden/06_tests.md) Abschnitt 7.
## Worum es fachlich geht
Ein Verfahrensgebiet liegt als Shape-Export aus NoBIS bzw. DAVID vor, meist als ZIP-Datei. Der Anwender wählt
diese Datei aus; das Plugin liest daraus das Neuordnungs- und/oder Neuvermessungsgebiet ein, gleicht die Fläche
mit den ALKIS-Flurstücken ab und meldet Abweichungen. Eine ZIP-Datei kann mehrere Shapefile-Sätze enthalten —
je einen für Neuordnungs- und Neuvermessungsgebiet. Welcher Satz was ist, entscheidet der Wert im Feld `FBSchl`.
Wenn dieser Schritt schiefgeht, arbeitet das gesamte weitere Verfahren auf einem falschen Gebiet.
## Der Ablauf
```mermaid
flowchart TD
A["1 Anwender wählt ZIP oder SHP"] --> B["2 ZIP entpacken,<br/>alle .shp darin finden"]
B --> C["3 Jede Datei als Layer laden<br/>und auf Gültigkeit prüfen"]
C --> D{"4 Feld FBSchl<br/>vorhanden und bekannt?"}
D -->|"901/10110F"| E["Neuordnungsgebiet"]
D -->|"901/10120F"| F["Neuvermessungsgebiet"]
D -->|"fehlt / unbekannt"| G["Datei überspringen,<br/>Fehler sammeln"]
E --> H["5 Flächen desselben Typs<br/>zu einem Layer verschmelzen"]
F --> H
G --> H
H --> I["6 ALKIS-Flurstücke laden,<br/>Flächen vergleichen"]
I --> J{"7 Flächen gleich?"}
J -->|ja| K["Hinweis: stimmt überein"]
J -->|nein| L["Nachfrage:<br/>Detailprüfung oder abbrechen"]
L --> M["8 Knickpunktprüfung"]
K --> N["9 Layer bleibt im Projekt"]
M --> N
style D fill:#fff4e6,stroke:#d9822b
style G fill:#ffe9e9,stroke:#d94b2b
```
## Was geprüft wird
Alle Tests liegen in `Plugin_SN_Verfahrensgebiet/tests/test_verfahrensgebiet_shape_komplett.py`.
| # | Schritt | Wird geprüft durch | Ebene |
|---|---|---|---|
| 1 | Auswahl abgebrochen | `test_dialog_abgebrochen_gibt_none_zurueck` | Mock |
| 2 | ZIP nicht entpackbar | `test_zip_fehler_gibt_none_und_warning` | Mock |
| 2 | Kein `.shp` im ZIP | `test_kein_shp_in_zip_gibt_none_und_warning` | Mock |
| 2 | `.shp` im Wurzel- bzw. Unterordner finden | `test_findet_shp_in_root`, `test_findet_shp_in_unterordner` | Mock |
| 2 | Groß-/Kleinschreibung der Dateiendung | `test_case_insensitive_erkennung` | Mock |
| 3 | Layer ungültig | `test_invalider_qgslayer_gibt_none_und_warning` | Mock |
| 3 | Keine Features / leere Geometrien | `test_keine_features_gibt_none`, `test_leere_geometrien_geben_none` | Mock |
| **4** | **Feld `FBSchl` auswerten** | **— keiner** | **—** |
| 5 | Verschmelzen zum Einzel-Feature, Attribute übernehmen | `test_attribute_von_erstem_feature_werden_gesetzt`, `test_erfolg_gibt_memory_layer_zurueck` | Mock |
| 6 | ALKIS liefert nichts / keine Auswahl | `test_flst_none_aborts`, `test_keine_flurstuecke_selektiert_gibt_warning` | Mock |
| 7 | Flächen stimmen überein | `test_flaechen_uebereinstimmung_gibt_info_und_kein_dialog` | Mock |
| 7 | Abweichung, Anwender bricht ab | `test_abweichung_abbrechen_gibt_shape_vg_zurueck` | Mock |
| 8 | Abweichung, Detailprüfung | `test_abweichung_detailpruefung_ruft_knickpunkt_pruefung_auf` | Mock |
| 8 | PunktortTA nicht verfügbar | `test_punktort_ta_none_gibt_shape_vg_zurueck_und_zeigt_fehler` | Mock |
| 9 | Layer bleibt bei Erfolg, verschwindet bei Abbruch | `test_shape_vg_bleibt_im_projekt_bei_erfolg`, `test_shape_vg_wird_bei_abbruch_aus_projekt_entfernt` | Mock |
| 9 | Temporärer Layer wird immer entfernt | `test_temp_layer_wird_stets_entfernt` | Mock |
| — | Sieht das Ergebnis in QGIS richtig aus? | manueller Test | manuell |
Ebene: `Mock` (ohne QGIS, Sekunden) · `QGIS` (gegen echtes QGIS) · `manuell` (Mensch in QGIS).
Zusätzlich ist das Zusammenspiel mit dem BROR-Layer (Bau-, Raum- oder Bodenordnungsrecht) abgedeckt, wenn eine
VKZ gesetzt ist: `test_bror_geladen_und_zurueckgegeben_wenn_vkz_gesetzt`,
`test_bror_wird_vor_shape_vg_ins_projekt_eingefuegt`, `test_verfahrensgebiet_alkis_nicht_aufgerufen_wenn_vkz_leer`,
`test_fallback_auf_temp_enriched_wenn_bror_ladeversagen`.
## Fachliche Sonderfälle
| Sonderfall | Kommt vor bei | Wird geprüft durch |
|---|---|---|
| ZIP enthält mehrere Shapefile-Sätze | Export mit Neuordnungs- **und** Neuvermessungsgebiet | — |
| Eine von mehreren Dateien im ZIP ist fehlerhaft | gemischte Exporte; die übrigen sollen trotzdem verarbeitet werden | — |
| Feldname `FBSchl.` mit Punkt | manche DAVID-Exporte | — |
| Feldname in abweichender Groß-/Kleinschreibung | ältere Exporte | — |
| Feld `FBSchl` fehlt ganz | Shape ist gar kein Verfahrensgebiet | — |
| Unbekannter Wert in `FBSchl` | neuer Schlüssel, den wir noch nicht kennen | — |
| ZIP nicht entpackbar, kein `.shp` enthalten | beschädigter oder falscher Export | ja (siehe Tabelle oben) |
| Fläche weicht von ALKIS ab | Regelfall bei Grenzänderungen | ja |
## Bewusst nicht getestet
| Was | Warum | Wie stattdessen abgesichert |
|---|---|---|
| Geometrisches Verschmelzen (`unaryUnion`) | QGIS-Funktion, nicht unser Code; im Mock-Modus gibt es keine echte Geometrie | manueller Test in QGIS; künftig QGIS-Test (Stufe 1, `../konzept/07_qgis_tests_plan.md`) |
| Aussehen und Beschriftung der Dialoge | nicht sinnvoll automatisiert prüfbar | manueller Test |
| Echte ALKIS-WFS-Antworten | kein Netzwerk in Tests; Dienstgrenzen siehe `../wissen/fallstricke.md` | nachgestellte Antworten im Test, plus manueller Test bei Dienständerungen |
## Bekannte Lücken
| Lücke | Auswirkung | Issue |
|---|---|---|
| **Schritt 4 (`_ermittle_gebietstyp_aus_fbschl`) hat keinen einzigen Test** — weder für die gültigen Werte `901/10110F` und `901/10120F`, noch für fehlendes Feld, unbekannten Wert, `FBSchl.` mit Punkt oder abweichende Groß-/Kleinschreibung | Ein Shape wird stillschweigend dem falschen Gebietstyp zugeordnet oder grundlos abgewiesen. Genau dieser Fall war Gegenstand von PR #44/#45 — die tolerante Feldsuche wurde eingebaut, aber nie durch einen Test abgesichert. | anzulegen |
| Mehrere Shapefile-Sätze in einer ZIP-Datei werden nicht als Fall getestet | Der dokumentierte Hauptzweck der Mehrfachverarbeitung ist ungeprüft; ein Regressionsfehler bliebe unbemerkt | anzulegen |
| Fehlersammlung über mehrere Dateien (eine fehlerhafte Datei bricht die übrigen nicht ab) ist nicht getestet | Ein Export mit einer defekten Datei könnte komplett abgewiesen werden, statt die guten Dateien zu verarbeiten | anzulegen |
> Diese drei Lücken wurden am 04.09.2026 beim Erstellen dieser Seite gefunden — durch den bloßen Abgleich des
> fachlichen Ablaufs mit der Testliste. Sie sind gegen `origin/unstable` geprüft, nicht nur gegen den lokalen
> Klon. Das ist der Zweck dieser Seite.